Em resumo: depende
Em detalhes
Você vai precisar das coisas limpas e brilhantes?
Há coisas a serem cautelosas aqui, e você precisa identificar o limite entre o que é ganho real e mensurável e o que é apenas sua preferência pessoal e o mau hábito potencial de tocar código que não deveria ser.
Mais especificamente, saiba disso:
É um anti-padrão e vem com problemas embutidos:
- ele pode ser mais extensível , mas não pode ser mais fácil para estender,
- ele pode não ser simples de entender ,
- por último, mas definitivamente não menos importante aqui: você pode desacelerar todo o código.
Alguns também podem mencionar o princípio do KISS como referência, mas aqui é contra-intuitivo: a maneira otimizada é a maneira simples ou a maneira limpa da arquitetura? A resposta não é necessariamente absoluta, como explicado no restante abaixo.
O princípio YAGNI não é completamente ortogonal com a outra questão, mas ajuda a se perguntar: você vai precisar?
A arquitetura mais complexa realmente apresenta um benefício para você, além de parecer mais sustentável?
Escreva isso em um cartaz grande e pendure-o próximo à tela, na área da cozinha no trabalho ou na sala de reuniões do desenvolvedor. É claro que existem muitos outros mantras que valem a pena se repetir, mas esse em particular é importante sempre que você tenta fazer um "trabalho de manutenção" e sente vontade de "melhorá-lo".
É natural que desejemos "melhorar" o código ou até mesmo tocá-lo, mesmo inconscientemente, enquanto lemos através dele para tentar entendê-lo. É uma coisa boa, pois significa que somos opinativos e tentamos entender melhor os internos, mas também está ligado ao nosso nível de habilidade, nosso conhecimento (como você decide o que é melhor ou não? Bem, veja as seções abaixo ...) e todas as suposições que fazemos sobre o que achamos que conhecemos o software ...:
- realmente faz,
- realmente precisa fazer,
- acabará precisando fazer,
- e quão bem ele faz isso.
Realmente precisa ser otimizado?
Tudo isso dito, por que foi "otimizado" em primeiro lugar? Eles dizem que a otimização prematura é a raiz de todos os males, e se você vir um código não documentado e aparentemente otimizado, normalmente você poderia assumir que provavelmente não seguiu as Regras de Otimização , não precisava muito do esforço de otimização e que era apenas o a arrogância do desenvolvedor habitual está entrando em ação. Mais uma vez, talvez seja apenas a sua falando agora.
Em caso afirmativo, dentro de quais limites se torna aceitável? Se for necessário, esse limite existe e oferece espaço para melhorar as coisas, ou uma linha dura para decidir deixá-lo ir.
Além disso, cuidado com as características invisíveis. Provavelmente, sua versão "extensível" desse código também aumentará a memória em tempo de execução e apresentará ainda mais espaço na memória estática para o executável. Os recursos brilhantes de OO vêm com custos não intuitivos como esses e podem ser importantes para o seu programa e o ambiente em que ele deve rodar.
Medida, Medida, Medida
Como o pessoal do Google agora, é tudo sobre dados! Se você pode fazer backup com dados, é necessário.
Existe uma história não tão antiga que, para cada US $ 1 gasto em desenvolvimento, será seguido por pelo menos US $ 1 em testes e pelo menos US $ 1 em suporte (mas, na verdade, é muito mais).
A mudança afeta muitas coisas:
- pode ser necessário produzir uma nova compilação;
- você deve escrever novos testes de unidade (definitivamente, se não houver, e sua arquitetura mais extensível provavelmente deixa espaço para mais, pois você tem mais superfície para bugs);
- você deve escrever novos testes de desempenho (para garantir que isso permaneça estável no futuro e ver onde estão os gargalos), e isso é complicado de fazer ;
- você precisará documentá-lo (e mais extensível significa mais espaço para detalhes);
- você (ou outra pessoa) precisará testá-lo extensivamente no controle de qualidade;
- o código (quase) nunca está livre de erros e você precisará apoiá-lo.
Portanto, não é apenas o consumo de recursos de hardware (velocidade de execução ou consumo de memória) que você precisa medir aqui, mas também o consumo de recursos da equipe . Ambos precisam ser previstos para definir um objetivo-alvo, para serem medidos, contabilizados e adaptados com base no desenvolvimento.
E para o seu gerente, isso significa ajustá-lo ao atual plano de desenvolvimento, por isso, comunique-o e não entre na codificação furiosa de cowboys / submarinos / black-ops.
Em geral...
Sim mas...
Não me interpretem mal, em geral, eu seria a favor de fazer o que você sugere, e eu frequentemente defendo isso. Mas você precisa estar ciente do custo a longo prazo.
Em um mundo perfeito, é a solução certa:
- o hardware do computador melhora com o tempo,
- compiladores e plataformas de tempo de execução melhoram com o tempo,
- você obtém um código quase perfeito, limpo, sustentável e legível.
Na prática:
você pode piorar
Você precisa de mais olhos para vê-lo, e quanto mais o complexificar, mais você precisará.
você não pode prever o futuro
Você não pode saber com absoluta certeza se precisará disso, e nem mesmo se as "extensões" necessárias serão mais fáceis e rápidas de implementar na forma antiga, e se elas precisarão ser super otimizadas .
representa, do ponto de vista da administração, um enorme custo sem ganho direto.
Faça parte do processo
Você mencionou aqui que é uma mudança bastante pequena e tem alguns problemas específicos em mente. Eu diria que geralmente está bom neste caso, mas a maioria de nós também tem histórias pessoais de pequenas mudanças, edições quase cirúrgicas, que acabaram se transformando em pesadelo de manutenção e em prazos quase perdidos ou explodidos, porque Joe Programmer não viu um das razões por trás do código e tocou em algo que não deveria ter sido.
Se você tiver um processo para lidar com essas decisões, tire vantagem delas:
- Se você testar as coisas corretamente, saberá mais rapidamente se as coisas estão quebradas,
- Se você medi-los, saberá se eles melhoraram,
- Se você o revisar, saberá se isso afasta as pessoas.
Cobertura de teste, criação de perfil e coleta de dados são complicados
Mas, é claro, seu código e métricas de teste podem sofrer os mesmos problemas que você está tentando evitar no seu código real: você testa as coisas certas, e elas são a coisa certa para o futuro, e você mede as coisas certas coisas?
Ainda assim, em geral, quanto mais você testar (até um certo limite) e medir, mais dados você coletará e mais seguro estará. Mau tempo de analogia: pense nisso como dirigir (ou a vida em geral): você pode ser o melhor motorista do mundo, se o carro avariar ou se alguém decidir se matar dirigindo seu carro hoje, o seu habilidades podem não ser suficientes. Existem duas coisas ambientais que podem afetar você, e os erros humanos também são importantes.
As revisões de código são os testes de corredor da equipe de desenvolvimento
E acho que a última parte é fundamental aqui: faça revisões de código. Você não saberá o valor de suas melhorias se as fizer sozinho. As revisões de código são o nosso "teste de corredor": siga a versão de Raymond da Lei de Linus para detectar bugs e detectar excesso de engenharia e outros antipadrões, e para garantir que o código esteja alinhado com as habilidades de sua equipe. Não faz sentido ter o "melhor" código se ninguém mais puder entender e mantê-lo, e isso vale tanto para otimizações enigmáticas quanto para projetos arquitetônicos profundos de 6 camadas.
Como palavras finais, lembre-se:
Todo mundo sabe que a depuração é duas vezes mais difícil do que escrever um programa. Então, se você é o mais esperto possível quando o escreve, como o depurará? - Brian Kernighan