OTAKU / Il manifesto

Capitolo 01 — Nucleo rigido, bordi flessibili

Il Manifesto OTAKU

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.

O

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.

T

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.

A

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.

K

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.

U

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à

  1. La complessità ciclomatica per metodo non deve superare 5.
  2. Un solo livello di indentazione per metodo.
  3. Non usare la parola chiave ELSE (guard clause o return anticipati).
  4. Non usare mai switch/case (polimorfismo, espressioni match o strategy).
  5. Evita numeri e stringhe magiche (costanti o enum).

ODimensione

  1. Massimo 50 righe per classe (solo il codice nel corpo della classe).
  2. Massimo 20 righe per metodo (solo codice eseguibile).
  3. Massimo 10 classi per namespace o package.
  4. Nessuna classe con più di due variabili di istanza.
  5. I metodi non devono avere più di due parametri.
  6. I costruttori non devono avere più di due parametri.
  7. Le interfacce non devono avere più di due metodi.

ODenominazione

  1. Non abbreviare; usa nomi completi e descrittivi.
  2. I metodi booleani iniziano con is, has, can o should.
  3. I nomi dei metodi iniziano con un verbo.
  4. Le costanti sono in UPPER_SNAKE_CASE.
  5. Proprietà e metodi sono in camelCase.

TModularità

  1. Collezioni di prima classe: incapsula gli array in classi dedicate.
  2. Un punto per riga; evita il concatenamento di chiamate.
  3. Metodi statici vietati, tranne factory e funzioni pure.
  4. Comandi e query separati: nessun effetto collaterale nei metodi che restituiscono un valore.
  5. Funzioni pure quando possibile: stesso input, stesso output, nessun effetto collaterale.
  6. Nessuno stato globale o singleton; inietta le dipendenze esplicitamente.
  7. Preferisci funzioni piccole e mirate; estrai quando un metodo fa più di una cosa.

AProtezione

  1. Niente getter, setter o proprietà pubbliche; usa metodi di comportamento.
  2. Proprietà private per impostazione predefinita; protected solo per ereditarietà da framework.
  3. Classi final per impostazione predefinita; l’estensione avviene tramite interfacce.
  4. Ereditarietà vietata tranne le classi base di framework; preferisci la composizione.
  5. Valida tutti gli input al confine: costruttori e metodi pubblici.
  6. Fallire presto: lancia appena una precondizione è violata.
  7. Non mutare mai i parametri di input; trattali come immutabili.

KEffetti collaterali e fallimenti

  1. Preferisci l’immutabilità: proprietà readonly, restituisci nuove istanze.
  2. I metodi che restituiscono collezioni restituiscono una collezione vuota, mai null.
  3. I metodi che possono fallire restituiscono Result/Either o lanciano; mai null.
  4. Esplicito invece di implicito: nessuna dipendenza nascosta, metodo magico o conversione implicita.
  5. Non lasciare mai trapelare dettagli infrastrutturali (SQL, HTTP, percorsi di file) nel dominio.

UContratti

  1. Incapsula tutti i primitivi e le stringhe in value object.
  2. Nessun tipo generico (mixed, array, object) tranne metodi espliciti di serializzazione.
  3. Ogni metodo pubblico è dichiarato in un’interfaccia.
  4. 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.