Don’t Use Boolean Flags in Python, Use Policies Instead
Dê adeus às bandeiras booleanas em Python e descubra o poder das políticas!
Conteudo
TLDR;
Significa extrair cada regra (ex.: usuário ativo, MFA, checagem de papel, auditoria, concessão de acesso) para unidades independentes chamadas policies, que podem ser implementadas como classes com um método apply ou como funções e depois compostas. Substitui flags booleanos por composição: em vez de vários ifs controlados por flags, você monta uma lista ou composição de policies e habilita ou desabilita comportamentos incluindo ou removendo essas policies sem adicionar condicionais. Deixa as regras explícitas, fáceis de testar e reutilizar e melhora a escalabilidade do código, embora gere mais linhas/classes — uma sobrecarga que pode ser reduzida transformando policies em funções mais Pythonic.
Resumo
Um problema comum em código Python é uma função única cheia de flags e ifs que vai crescendo conforme surgem regras, tornando-se difícil de manter, testar e estender. A solução apresentada é usar o padrão policy: cada regra vira uma política com uma responsabilidade única (por exemplo, usuário ativo, autenticação multifator, verificação de papéis, auditoria ou concessão de acesso). Essas políticas podem ser implementadas como classes que seguem um protocolo com método apply, e compostas numa política composta que aplica cada política sequencialmente, eliminando o bloco gigante de condicionais e tornando regras explícitas, testáveis e reutilizáveis. O autor observa que isso aumenta o número de linhas e classes (mais verboso que a versão “bagunçada”), mas propõe uma versão mais pythonica em que políticas são funções puras que recebem e retornam o objeto request (usando dataclasses.replace), permitindo composição funcional em vez de classes. Ele também compara policy com strategy: estruturalmente semelhantes, mas strategy escolhe um algoritmo enquanto policy enfatiza a composição de regras. No fim, a abordagem melhora organização e escalabilidade do código, apesar do custo inicial de maior quantidade de código. Também mostra exemplos e demonstrações de execução para comparar resultados e justificar a migração para esse padrão no projeto.