Essa é uma pergunta bastante vaga, mas é algo que nunca senti que foi respondido de maneira satisfatória ao ler sobre o design adequado.
Geralmente, ao aprender sobre programação orientada a objetos, abstração, fatoração, etc., o santo graal do design - e a razão pela qual eles sempre afirmam que você está usando as técnicas de desenvolvimento em questão - é que isso tornará seu programa "fácil de mudar" , "manutenível", "flexível" ou qualquer um dos sinônimos usados para expressar um conceito tão produtivo. Marcando a ivars como privada, dividindo o código em vários métodos pequenos e independentes, mantendo as interfaces gerais, você supostamente ganha a capacidade de modificar seu programa com total facilidade e graça.
Para mudanças relativamente pequenas, isso funcionou bem para mim. Alterações nas estruturas de dados internas usadas por uma classe para aumentar o desempenho nunca foram uma grande dificuldade e também não ocorreram alterações na interface com o usuário, independentemente da API, como redesenhar um sistema de entrada de texto ou revisar os gráficos de um elemento de jogo .
Todas essas mudanças parecem inerentemente independentes. Nenhum deles envolve alterações no comportamento ou design do componente do seu programa que está sendo modificado, no que diz respeito ao código externo. Independentemente de você estar escrevendo de maneira processual ou no estilo OO, com funções grandes ou pequenas, essas alterações são fáceis de fazer, mesmo que você tenha apenas um design moderadamente bom.
No entanto, sempre que as mudanças se tornam grandes e complicadas - ou seja, alterações na API - nenhum dos meus preciosos "padrões" é sempre resgatado. A grande mudança continua grande, o código afetado permanece afetado e muitas horas de trabalho para gerar bugs estão à minha frente.
Então, minha pergunta é essa. Quão grande é a mudança que o design adequado afirma ser capaz de facilitar? Existe alguma técnica de design adicional, desconhecida para mim ou que eu não consegui implementar, que realmente torna simples a modificação do som pegajoso ou essa promessa (que ouvi de tantos paradigmas diferentes) é apenas uma boa idéia, completamente desconectado das verdades imutáveis do desenvolvimento de software? Existe uma "ferramenta de alteração" que posso adicionar ao meu cinto de ferramentas?
Especificamente, o problema que estou enfrentando que me levou aos fóruns é o seguinte: estou trabalhando na implementação de uma linguagem de programação interpretada (implementada em D, mas isso não é relevante), e decidi que os argumentos dos meus encerramentos deveriam ser com base em palavras-chave, em vez de posicionais como atualmente. Isso requer a modificação de todo o código existente que chama funções anônimas, o que, felizmente, é bastante pequeno porque estou no início do desenvolvimento da minha linguagem (<2000 linhas), mas seria enorme se eu tivesse tomado essa decisão posteriormente. Em tal situação, existe alguma maneira de que, através da previsão adequada no design, eu possa ter facilitado essa modificação ou algumas (a maioria) mudanças sejam intrinsecamente abrangentes? Estou curioso para saber se isso é de alguma forma uma falha nas minhas próprias habilidades de design - se for, eu
Para ser claro, não sou cético em relação ao POO ou a qualquer outro padrão comumente usado. Para mim, no entanto, suas virtudes estão na escrita original, e não na manutenção, das bases de código. A herança permite abstrair bem padrões repetitivos, o polimorfismo permite separar o código por função compreendida pelo homem (qual classe) e não pelo efeito compreendido pela máquina (qual ramo da switch
declaração) e funções pequenas e independentes permitem que você escreva em um estilo "de baixo para cima" muito agradável. No entanto, sou cético em relação a suas reivindicações de flexibilidade.
foo metarg1: bar metarg2: baz
como foo.metarg1_metarg2_(bar, baz)
. No entanto, meu idioma está fazendo uma alteração maior, ou seja, parâmetros baseados em lista para parâmetros baseados em dicionário, o que afeta o tempo de execução, mas não o analisador, na verdade, devido às propriedades específicas do meu idioma, não abordarei agora. Como não há um mapeamento claro entre palavras-chave não ordenadas e argumentos posicionais, o tempo de execução é a questão principal.