OTAKU è un acronimo, e ogni lettera è un vincolo. Quaranta regole lo rendono misurabile; una metrica decide se un metodo è troppo complesso per esistere.
La filosofia ha un nucleo rigido e bordi flessibili. Il nucleo — i cinque pilastri e le soglie che li rendono operativi — non negozia. I bordi — linguaggio, framework, stile, strumenti — sono liberi.
L’ordine dei cinque pilastri è intenzionale. La disciplina viene prima perché nulla sopravvive senza di essa. I contratti vengono per ultimi perché sono l’unica cosa che il mondo esterno può vedere.
Padroneggia la tua Disciplina
Sii severo con te stesso.
La restrizione è l’unica via alla libertà. Complessità, dimensione e denominazione si misurano, non si discutono.
Strumenti per la Composizione
Componi come Unix.
Parti piccole con input e output chiari. L’applicazione è un data pipe e gli effetti collaterali restano ai bordi.
Proteggi il Nucleo
Proteggi il cuore del business.
Le dipendenze puntano solo verso l’interno. Entità e casi d’uso non conoscono il nome di un framework.
Mantieni l’Infrastruttura Silenziosa
L’infrastruttura è solo un dettaglio.
La persistenza si comporta come una collezione in memoria. Il fallimento è esplicito; lo stato è immutabile per default.
Linguaggio Universale e Contratti
Parla la lingua dell’utente.
Linguaggio ubiquo esplicito in contratti design-first. I primitivi sono incapsulati; ogni metodo pubblico ha un contratto.
La metrica principale
La complessità ciclomatica — il numero di percorsi indipendenti di un metodo, secondo Thomas J. McCabe — è lo strumento principale della filosofia. Un metodo oltre 5 viene rifiutato, per quanto leggibile possa sembrare. Cinque percorsi sono già cinque ragionamenti che il lettore deve tenere insieme.
Tutto il resto della sezione disciplina serve a tenere basso quel numero: un solo livello di indentazione, niente ELSE, niente switch/case, guard clause, estrazione. La metrica è misurabile in ogni linguaggio di questo libro, e ogni ecosistema ha uno strumento che la riporta.
Le quaranta regole
Ogni regola ha una soglia misurabile. Nel dubbio, scegli l’opzione più restrittiva.
40 regole · 7 gruppi · 5 pilastri
OComplessità
- La complessità ciclomatica per metodo non deve superare 5.
- Un solo livello di indentazione per metodo.
- Non usare la parola chiave ELSE (guard clause o return anticipati).
- Non usare mai switch/case (polimorfismo, espressioni match o strategy).
- Evita numeri e stringhe magiche (costanti o enum).
ODimensione
- Massimo 50 righe per classe (solo il codice nel corpo della classe).
- Massimo 20 righe per metodo (solo codice eseguibile).
- Massimo 10 classi per namespace o package.
- Nessuna classe con più di due variabili di istanza.
- I metodi non devono avere più di due parametri.
- I costruttori non devono avere più di due parametri.
- Le interfacce non devono avere più di due metodi.
ODenominazione
- Non abbreviare; usa nomi completi e descrittivi.
- I metodi booleani iniziano con is, has, can o should.
- I nomi dei metodi iniziano con un verbo.
- Le costanti sono in UPPER_SNAKE_CASE.
- Proprietà e metodi sono in camelCase.
TModularità
- Collezioni di prima classe: incapsula gli array in classi dedicate.
- Un punto per riga; evita il concatenamento di chiamate.
- Metodi statici vietati, tranne factory e funzioni pure.
- Comandi e query separati: nessun effetto collaterale nei metodi che restituiscono un valore.
- Funzioni pure quando possibile: stesso input, stesso output, nessun effetto collaterale.
- Nessuno stato globale o singleton; inietta le dipendenze esplicitamente.
- Preferisci funzioni piccole e mirate; estrai quando un metodo fa più di una cosa.
AProtezione
- Niente getter, setter o proprietà pubbliche; usa metodi di comportamento.
- Proprietà private per impostazione predefinita; protected solo per ereditarietà da framework.
- Classi final per impostazione predefinita; l’estensione avviene tramite interfacce.
- Ereditarietà vietata tranne le classi base di framework; preferisci la composizione.
- Valida tutti gli input al confine: costruttori e metodi pubblici.
- Fallire presto: lancia appena una precondizione è violata.
- Non mutare mai i parametri di input; trattali come immutabili.
KEffetti collaterali e fallimenti
- Preferisci l’immutabilità: proprietà readonly, restituisci nuove istanze.
- I metodi che restituiscono collezioni restituiscono una collezione vuota, mai null.
- I metodi che possono fallire restituiscono Result/Either o lanciano; mai null.
- Esplicito invece di implicito: nessuna dipendenza nascosta, metodo magico o conversione implicita.
- Non lasciare mai trapelare dettagli infrastrutturali (SQL, HTTP, percorsi di file) nel dominio.
UContratti
- Incapsula tutti i primitivi e le stringhe in value object.
- Nessun tipo generico (mixed, array, object) tranne metodi espliciti di serializzazione.
- Ogni metodo pubblico è dichiarato in un’interfaccia.
- I commenti spiegano il perché e appartengono ai contratti, non alle implementazioni.
Come i pilastri si sostengono
La disciplina rende possibile la composizione: una classe di 300 righe non si sostituisce. La composizione rende difendibile il nucleo: un monolite non può nascondere le dipendenze. Un nucleo protetto rende l’infrastruttura davvero opzionale. I contratti sono l’unica ragione per cui tutto questo è verificabile dall’esterno.
Togli un pilastro e gli altri diventano cerimonia. Tieni tutti e cinque e il sistema diventa noioso — come lo sono i ponti.