Recentemente, li um site sobre desenvolvimento de código limpo (não coloquei um link aqui porque não está em inglês).
Um dos princípios anunciados por este site é o Princípio Aberto Fechado : cada componente de software deve estar aberto para extensão e fechado para modificação. Por exemplo, quando implementamos e testamos uma classe, devemos modificá-la apenas para corrigir erros ou adicionar novas funcionalidades (por exemplo, novos métodos que não influenciam os existentes). A funcionalidade e implementação existentes não devem ser alteradas.
Normalmente aplico esse princípio definindo uma interface I
e uma classe de implementação correspondente A
. Quando a classe A
se torna estável (implementada e testada), normalmente não a modifico muito (possivelmente nem mesmo), ou seja,
- Se novos requisitos chegarem (por exemplo, desempenho ou uma implementação totalmente nova da interface) que exijam grandes alterações no código, escrevo uma nova implementação
B
e continuo usandoA
enquantoB
não estiver maduro. QuandoB
maduro, tudo o que é necessário é mudar a forma comoI
é instanciado. - Se os novos requisitos também sugerem uma alteração na interface, defino uma nova interface
I'
e uma nova implementaçãoA'
. EntãoI
,A
são congelados e continuam a implementação do sistema de produção, desde queI'
eA'
não são suficientes estável para substituí-los.
Portanto, em vista dessas observações, fiquei um pouco surpreso que a página da Web sugerisse o uso de refatorações complexas , "... porque não é possível escrever código diretamente em sua forma final".
Não existe contradição / conflito entre aplicar o Princípio Aberto / Fechado e sugerir o uso de refatorações complexas como uma prática recomendada? Ou a idéia aqui é que se pode usar refatorações complexas durante o desenvolvimento de uma classe A
, mas quando essa classe foi testada com sucesso, deve ser congelada?