Vamos começar com um exemplo.
Digamos, eu tenho um método chamado export
que depende muito do esquema do banco de dados. E por "depende muito", quero dizer, sei que adicionar uma nova coluna a uma determinada tabela frequentemente (com muita frequência) leva à export
alteração do método correspondente (geralmente você também deve adicionar o novo campo aos dados de exportação).
Os programadores costumam esquecer de mudar de export
método, pois não está claro se você deve olhar para isso. Meu objetivo é forçar o programador a tomar uma decisão explícita para determinar se ele esqueceu de observar o export
método ou se não deseja adicionar um campo aos dados de exportação. E estou procurando a solução de design para esse problema.
Eu tenho duas idéias, mas as duas têm falhas.
Wrapper inteligente "Ler tudo"
Posso criar o wrapper inteligente que garante que todos os dados sejam lidos explicitamente.
Algo assim:
def export():
checker = AllReadChecker.new(table_row)
name = checker.get('name')
surname = checker.get('surname')
checker.ignore('age') # explicitly ignore the "age" field
result = [name, surname] # or whatever
checker.check_now() # check all is read
return result
Portanto, checker
afirma se table_row
contém outros campos que não foram lidos. Mas tudo isso parece meio pesado e (talvez) afeta o desempenho.
"Verifique esse método" mais unittest
Posso apenas criar o mais unittest que se lembra do último esquema da tabela e falha sempre que a tabela é alterada. Nesse caso, o programador verá algo como "não se esqueça de verificar o export
método". Para ocultar o programador de aviso (ou não - isso é um problema), faça o check-out export
e manualmente (esse é outro problema) corrija o teste adicionando novos campos a ele.
Tenho algumas outras idéias, mas elas são muito problemáticas para implementar ou difíceis de entender (e não quero que o projeto se torne um quebra-cabeça).
O problema acima é apenas um exemplo da classe mais ampla de problemas que encontro de tempos em tempos. Quero vincular alguns trechos de código e / ou infraestrutura, portanto, alterar um deles alerta imediatamente o programador para verificar outro. Normalmente, você tem algumas ferramentas simples, como extrair lógica comum ou escrever de maneira confiável, mas estou procurando a ferramenta para casos mais complexos: talvez alguns padrões de design dos quais eu conheço agora.
export
tem tudo o que você precisa realisticamente?
export
base no esquema?