Clean Code Notes
Clean Code Notes
Funzioni
Le funzioni devono essere piccole e che facciano una cosa sola, ovvero un solo
livello di astrazione per funzione.
Ci sono casi dove è utile accorpare degli argomenti all'interno di una classe per poi
passarli a funzioni che li utilizzano (DTO).
I nomi delle funzioni possono contenere parole su cosa fanno e come utilizzarle
ovvero l'ordine degli argomenti.
Il nome di una funzione deve indicare ciò che fa, altrimenti si potrebbe
nascondere un effetto collaterale.
Se la vostra funzione deve modificare lo stato di qualcosa, lo deve fare per l'oggetto
a cui appartiene tale modifica. (poiché solo l'oggetto stesso si conosce, l'esterno non
Dove possibile usare le eccezioni invece di restituire codici di errore, con i codici il
chiamante deve gestire il caso, in più estraete i blocchi try/catch.
Commenti
I commenti vanno usati per spiegare qualcosa che può sembrare illogico.
Oggetti e strutture
Una classe non si limita a gestire i suoi attributi con semplici getter e setter. Deve
esporre delle interfacce astratte per la manipolazione dei suoi attributi senza far
conoscere all'esterno l'implementazione.
Oggetti: Attributi manipolati tramite interfacce astratte.
Legge di Demetra
Un metodo f di una classe C dovrebbe richiamare solo i metodi di:
un oggetto creato da f;
Non bisogna inserire dei metodi di manipolazione altrimenti si crea un ibrido tra
oggetto e struttura. E quando si ha un ibrido, prendiamo tutti i "contro" di entrambi le
parti che formano l'ibrido realizzato.
Delimitazioni
Utilizzando funzionalità esterne al nostro applicativo (package, bundle) è utile
focalizzarsi a tenere un unico punto di unione tra questi in modo tale che quando il
codice esterno cambierà noi avremo la possibilità di intervenire su un singolo punto
del nostro sistema. Quando utilizziamo codice esterno vogliamo assicurarci un
single point of failure!
Inoltre possiamo creare dei test per le chiamate ad API esterne il che ci permette di
verificare se una versione nuova di API o package è funzionale per i nostri scopi,
altrimenti se così non fosse possiamo assicurarci di capire su quali parti del codice
possiamo intervenire.
Non procederai nello unit test più di quanto sia sufficiente per ottenere un
fallimento e la mancata compilazione è un fallimento.
Bisogna avere cura dei test, i test garantiscono maggiore flessibilità sulla modifica
della struttura e architettura per avere un progetto pulito.
Test: chiarezza, semplicità ed espressività.
Classi
Organizzare le classi in oridne di costanti, viarabili, statiche pubbliche, poi variabiliti
statiche private seguite dalle variabili private di istanza. Sono rare poi le variabili
pubbliche.
Funzioni public poi funzioni private, alternate in base all'utilizzo delle prime.
Coesione
Se i metodi di una classe coinvolgono molteplici variabili di istanza di quella classe,
allora la classe ha molta coesione, al contrario si dovrebbe valutare di separare tale
classe per generare classi più coese.
Sistemi
Bisogna realizzare applicazioni che non conoscono il processo di costruzione per il
loro avvio. Quindi le loro dipendenze devono essere soddisfatte a monte.
Abstract Factory
Permette di mantenere i dettagli della costruzione degli oggetti separati dal codice
dell'applicazione.
Dependency Injection
Un oggetto non ha la responsabilità di procedere ad instanziare ogni sua
dipendenza (oggetti passivi).
Simple design
Codice pulito?
Concorrenza
La concorrenza aiuta a disaccoppiare che cosa viene fatto da quando viene fatto.
Mantenere il codice che gestisce la concorrenza separato dall'altro codice.
Fate in modo che le sezioni sincronizzate siano le più piccole possibili, non tentate di
risolvere contemporaneamente i bug del codice a thread e di quello mono-thread.
Assicuratevi che il vostro codice funzioni indipendentemente dai thread.
Curate la versatilità del codice a thread, in modo da poterlo eseguire con varie
configurazioni.