Construa a coisa mais simples que funciona. Resista à tentação de fazer engenharia excessiva.
XP tem um mantra: Faça a coisa mais simples que poderia funcionar.
Isso não é sobre ser preguiçoso ou escrever código improvisado. Código simples é frequentemente mais difícil de escrever do que código complexo. Requer:
Código simples é:
Código complexo é:
Simples É Difícil
"Eu teria escrito uma carta mais curta, mas não tive tempo." —Blaise Pascal. Código simples requer mais reflexão, não menos.
YAGNI é o princípio de que você deve construir apenas o que precisa agora.
Não adicione:
Por quê? Porque:
A aposta do XP: Se você precisar de algo depois, pode adicionar depois. Com TDD, refatoração e CI, mudança é barata. Então não pague pelo futuro antes de ter que pagar.
Essa é uma ideia radical. A engenharia de software tradicional diz para antecipar mudanças e projetar para flexibilidade. XP diz para esperar até realmente precisar.
A equipe precisa enviar emails. Eles implementam envio via SMTP. Depois, precisam enviar via SendGrid. Eles refatoram. Custo total: menos do que construir uma abstração de email plugável desde o início.
A equipe precisa enviar emails. Eles constroem uma interface genérica 'MessageProvider' com abstrações plugáveis 'MessageTransport' e 'MessageFormatter'. Eles só usam SMTP com um formato. As abstrações atrasam cada mudança.
Kent Beck definiu design simples como código que:
1. Passa em todos os testes O código funciona. Isso é inegociável. Um design bonito que não funciona não vale nada.
2. Revela intenção O código é fácil de entender. Bons nomes, estrutura clara, organização legível. Alguém novo pode pegá-lo e entender o que faz.
3. Não tem duplicação (DRY) Cada pedaço de conhecimento é expresso uma vez e apenas uma vez. Duplicação cria carga de manutenção e risco de bugs.
4. Tem o menor número de elementos Nenhuma classe, método, variável ou abstração extra. Tudo que existe tem uma razão para existir.
As regras estão em ordem de prioridade. Passar nos testes supera tudo. Mas uma vez que os testes passam, favoreça clareza sobre DRY. E só adicione elementos que servem às três primeiras regras.
Design simples não significa sem design. Significa design incremental—evoluindo o design conforme você aprende.
O processo:
É por isso que XP enfatiza tanto a refatoração. Se você não pode mudar o código com segurança, não pode fazer design incremental. Você fica preso com o que construiu primeiro.
Design Grande Antecipado (BUFD) falha porque:
Design incremental funciona porque:
Quando sentir vontade de adicionar uma abstração, pergunte: "Preciso disso agora, ou estou adivinhando?" Se estiver adivinhando, espere.
Design simples não significa evitar toda complexidade. Às vezes a complexidade é necessária.
Adicione complexidade quando:
Não adicione complexidade para:
A diferença está entre complexidade essencial (inerente ao problema) e complexidade acidental (introduzida pela sua solução). XP minimiza complexidade acidental recusando-se a construir para requisitos imaginários.
Quando você realmente precisa de uma abstração, deixe-a emergir da remoção de duplicação. A "Regra de Três" é útil: não abstraia até ver o mesmo padrão três vezes. Até lá você entende as variações reais, não as imaginadas.