Eu acredito muito em projetar o problema em questão e não estourá-lo, tentando adivinhar todos os casos que você precisa atender porque "um dia poderemos precisar dele".
Basicamente, dada uma lista de requisitos específicos, projete contra isso, no entanto, isso não significa que você não deve:
- torne aspectos do seu design configuráveis em vez de codificá-los na sua solução. Através de parâmetros passados no tempo de execução ou de uma configuração externa lida na inicialização (ou após o HUP'ing).
- amarre seu código com números mágicos,
- evite dar uma olhada para ver se há algo já escrito que possa ser reutilizado, talvez depois de adaptar a solução existente para fornecer uma abordagem adequada à situação existente e aos novos requisitos.
O principal problema ao projetar para "futuros possíveis" é que você está sempre adivinhando. Possivelmente fazendo palpites, mas "quando o assunto é empurrar" ainda é apenas uma série de palpites.
Ao fazer isso, você também tem a possibilidade muito real de espremer sua solução para se adequar aos casos gerais, em vez de resolver o problema específico em questão, conforme definido por seus requisitos conhecidos.
O que está dizendo isso? "Quando tudo que você tem é um martelo, tudo começa a parecer um prego."
Eu gostaria de ter uma libra por cada vez que ouvi alguém dizer: "Mas é uma solução mais adaptável aos casos gerais que poderemos ver no futuro".