Introduzir prematuramente a complexidade implementando padrões de design antes que eles sejam necessários não é uma boa prática.
Mas se você seguir todos (ou até a maioria dos) princípios do SOLID e usar padrões de design comuns, introduzirá alguma complexidade à medida que os recursos e requisitos forem adicionados ou alterados para manter seu design tão fácil de manter e flexível quanto necessário.
No entanto, quando essa complexidade é introduzida e funciona como um campeão, quando você a remove?
Exemplo. Eu tenho um aplicativo escrito para um cliente. Quando originalmente criado lá, onde várias maneiras de dar aumentos aos funcionários. Usei o padrão de estratégia e a fábrica para manter todo o processo agradável e limpo. Com o tempo, certos métodos de aumento foram adicionados ou removidos pelo proprietário do aplicativo.
O tempo passa e o novo proprietário assume o controle. Este novo dono é um nariz duro, mantém tudo simples e só tem uma maneira única de dar um aumento.
A complexidade necessária para o padrão de estratégia não é mais necessária. Se eu codificasse isso a partir dos requisitos como estão agora, não introduziria essa complexidade extra (mas certifique-se de poder introduzi-lo com pouco ou nenhum trabalho, se necessário).
Então, removo a implementação da estratégia agora? Eu não acho que esse novo proprietário jamais mude como os aumentos são feitos. Mas o próprio aplicativo demonstrou que isso poderia acontecer.
É claro que este é apenas um exemplo em um aplicativo em que um novo proprietário assume e simplificou muitos processos. Eu poderia remover dezenas de classes, interfaces e fábricas e tornar todo o aplicativo muito mais simples. Observe que a implementação atual funciona muito bem e o proprietário está feliz com ela (e surpreso e ainda mais feliz por eu poder implementar suas alterações tão rapidamente devido à complexidade discutida).
Admito que uma pequena parte dessa dúvida é porque é altamente provável que o novo proprietário não me use mais. Realmente não me importo que outra pessoa assuma o controle, uma vez que não foi um grande gerador de renda.
Mas eu me importo com duas coisas (relacionadas)
Preocupo-me um pouco com o fato de o novo mantenedor ter que pensar um pouco mais ao tentar entender o código. Complexidade é complexidade e não quero irritar o psicopata maníaco que vem atrás de mim.
Mas ainda mais me preocupo com um concorrente vendo essa complexidade e pensando que apenas implemento padrões de design para manter minhas horas de trabalho. Então espalhei esse boato para ferir meu outro negócio. (Eu ouvi isso mencionado.)
Então...
Em geral, a complexidade necessária anteriormente deve ser removida, mesmo que funcione e haja uma necessidade historicamente demonstrada da complexidade, mas você não tem indicação de que será necessária no futuro?
Mesmo que a pergunta acima seja geralmente respondida "não", é aconselhável remover essa complexidade "desnecessária" se entregar o projeto a um concorrente (ou estranho)?