Costruisci la cosa più semplice che funziona. Resisti all'impulso di sovra-ingegnerizzare.
XP ha un mantra: Fai la cosa più semplice che potrebbe funzionare.
Non si tratta di essere pigri o scrivere codice approssimativo. Il codice semplice è spesso più difficile da scrivere del codice complesso. Richiede:
Il codice semplice è:
Il codice complesso è:
Il Semplice È Difficile
"Avrei scritto una lettera più breve, ma non ne ho avuto il tempo." —Blaise Pascal. Il codice semplice richiede più riflessione, non meno.
YAGNI è il principio secondo cui dovresti costruire solo ciò di cui hai bisogno adesso.
Non aggiungere:
Perché? Perché:
La scommessa di XP: se avrai bisogno di qualcosa in seguito, potrai aggiungerla in seguito. Con TDD, refactoring e CI, il cambiamento costa poco. Quindi non pagare per il futuro prima di doverlo fare.
Questa è un'idea radicale. L'ingegneria del software tradizionale dice di anticipare il cambiamento e progettare per la flessibilità. XP dice di aspettare fino a quando non ne hai effettivamente bisogno.
Il team deve inviare email. Implementano l'invio via SMTP. In seguito, devono inviare via SendGrid. Fanno refactoring. Costo totale: meno che costruire un'astrazione email modulare fin dall'inizio.
Il team deve inviare email. Costruiscono un'interfaccia generica 'MessageProvider' con astrazioni 'MessageTransport' e 'MessageFormatter' modulari. Usano solo SMTP con un formato. Le astrazioni rallentano ogni modifica.
Kent Beck ha definito il design semplice come codice che:
1. Supera tutti i test Il codice funziona. Questo non è negoziabile. Un design bellissimo che non funziona non vale nulla.
2. Rivela l'intenzione Il codice è facile da capire. Buoni nomi, struttura chiara, organizzazione leggibile. Qualcuno di nuovo può prenderlo e capire cosa fa.
3. Non ha duplicazioni (DRY) Ogni pezzo di conoscenza è espresso una volta e una sola volta. La duplicazione crea onere di manutenzione e rischio di bug.
4. Ha il minor numero di elementi Nessuna classe, metodo, variabile o astrazione extra. Tutto ciò che esiste ha una ragione per esistere.
Le regole sono in ordine di priorità. Superare i test prevale su tutto. Ma una volta che i test passano, favorisci la chiarezza rispetto al DRY. E aggiungi solo elementi che servono le prime tre regole.
Il design semplice non significa nessun design. Significa design incrementale—far evolvere il design man mano che impari.
Il processo:
Ecco perché XP enfatizza così tanto il refactoring. Se non puoi cambiare il codice in sicurezza, non puoi fare design incrementale. Sei bloccato con qualunque cosa tu abbia costruito per prima.
Il Big Up-Front Design (BUFD) fallisce perché:
Il design incrementale ha successo perché:
Quando senti l'impulso di aggiungere un'astrazione, chiediti: "Ne ho bisogno ora, o sto indovinando?" Se stai indovinando, aspetta.
Il design semplice non significa evitare ogni complessità. A volte la complessità è necessaria.
Aggiungi complessità quando:
Non aggiungere complessità per:
La differenza è tra complessità essenziale (intrinseca al problema) e complessità accidentale (introdotta dalla tua soluzione). XP minimizza la complessità accidentale rifiutandosi di costruire per requisiti immaginari.
Quando hai davvero bisogno di un'astrazione, lascia che emerga dalla rimozione della duplicazione. La "Regola del Tre" è utile: non astrarre finché non vedi lo stesso pattern tre volte. A quel punto capisci le variazioni effettive, non quelle immaginate.