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 Ie uma classe de implementação correspondente A. Quando a classe Ase 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
Be continuo usandoAenquantoBnão estiver maduro. QuandoBmaduro, 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,Asã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?