Log In
Or create an account ->
Imperial Library
Home
About
News
Upload
Forum
Help
Login/SignUp
Index
Prefazione
Introduzione
Ringraziamenti
Capitolo 1 - Codice pulito
Che il codice sia!
Cattivo codice
Il costo totale di possedere un vero groviglio di codice
La grande riprogettazione cosmica
Una questione di atteggiamento
Il dilemma di base
L’arte della pulizia del codice
Che cosa si intende con “codice pulito”?
Bjarne Stroustrup
Grady Booch
“Big” Dave Thomas
Michael Feathers
Ron Jeffries
Ward Cunningham
Scuole di pensiero
Gli autori
La regola dei boy-scout
Il “prequel” e i principi
Conclusioni
Bibliografia
Capitolo 2 - Nomi significativi
Introduzione
Usate nomi “parlanti”
Evitate la disinformazione
Adottate distinzioni sensate
Usate nomi pronunciabili
Usate nomi ricercabili
Evitate le codifiche
Notazione ungherese
Prefissi per i membri
Interfacce e implementazioni
Evitate le mappe mentali
Nomi di classi
Nomi di metodi
Non fate i “simpatici”
Una parola, un concetto
Non siate fuorvianti
Usate nomi tratti dal dominio della soluzione
Usate nomi tratti dal dominio del problema
Aggiungete un contesto significativo
Non aggiungete contesti inesistenti
Conclusioni
Capitolo 3 - Funzioni
Che sia piccola!
Blocchi e indentazione
Che faccia una cosa sola
Sezioni all’interno delle funzioni
Un livello di astrazione per funzione
Leggete il codice da cima a fondo: la regola dei passi
Istruzioni switch
Usate nomi descrittivi
Argomenti di funzione
Forme monadiche comuni
Flag usati come argomenti
Funzioni diadiche
Triadi
Oggetti usati come argomenti
Liste di argomenti
Verbi e parole chiave
Niente effetti collaterali
Argomenti di output
Separate i comandi dalle richieste
Scegliete le eccezioni invece di restituire codici di errore
Estraete i blocchi try/catch
La gestione degli errori è “una cosa”
Il magnete per dipendenze Error.java
Non ripetetevi (il principio DRY)
Programmazione strutturata
Come scrivere le funzioni in questo modo?
Conclusioni
SetupTeardownIncluder
Bibliografia
Capitolo 4 - Commenti
I commenti non bastano a migliorare il codice cattivo
Spiegatevi nel codice
Buoni commenti
Commenti legali
Commenti informativi
Descrizione dell’intento
Chiarimenti
Avvertenze
Commenti TODO
Amplificazione
Javadoc nelle API pubbliche
Cattivi commenti
Pensieri
Commenti ridondanti
Commenti fuorvianti
Commenti obbligati
Commenti a “log”
Puro “rumore”
Assoluto “rumore”
Non usate un commento al posto di una funzione o una variabile
Contrassegni di posizione
Commenti per le parentesi graffe chiuse
Attribuzioni
Codice commentato
Commenti HTML
Informazioni fuori posizione
Eccesso di informazioni
Scarso legame con il codice
Intestazioni di funzioni
Javadoc nel codice non pubblico
Esempio
Bibliografia
Capitolo 5 - Formattazione
Lo scopo della formattazione
Formattazione verticale
La metafora della rivista
Spaziatura verticale fra i concetti
Densità verticale
Distanza verticale
Dichiarazioni di variabili
Variabili di istanza
Funzioni dipendenti
Affinità concettuale
Ordinamento verticale
Formattazione orizzontale
Spaziatura e densità orizzontale
Allineamento orizzontale
Indentazione
Infrangere l’indentazione
Livelli fittizi
Le regole del team
Le regole di formattazione di Uncle Bob
Capitolo 6 - Oggetti e strutture
Astrazione dei dati
Asimmetria dei dati/oggetti
La Legge di Demetra
Relitti ferroviari
Ibridi
Nascondere la struttura
Data Transfer Object
Active Record
Conclusioni
Bibliografia
Capitolo 7 - Gestione degli errori
Usate eccezioni al posto dei codici di return
Scrivere prima l’istruzione try-catch-finally
Usate eccezioni non controllate
Fornite un contesto con le eccezioni
Definite le classi per le eccezioni in termini di esigenze del chiamante
Definite il flusso “normale”
Non restituite null
Non passate null
Conclusioni
Bibliografia
Capitolo 8 - Delimitazioni
Usare codice esterno
Esplorazione delle delimitazioni
Imparare a usare log4j
I learning test sono più che gratis
Usare codice che non esiste ancora
Delimitazioni chiare
Bibliografia
Capitolo 9 - Unit test
Le tre leggi dello sviluppo TDD (Test-Driven Development)
Curate la pulizia dei test
I test garantiscono le “…bilità”
Test “puliti”
Un linguaggio per test che sia specifico del dominio
Un doppio standard
Una sola richiesta per test
Un unico concetto per ogni test
F.I.R.S.T.
Conclusioni
Bibliografia
Capitolo 10 - Classi
Organizzazione delle classi
Incapsulazione
Le classi dovrebbero essere piccole!
Il principio SRP (Single Responsibility Principle)
Coesione
Curando la coesione si generano tante piccole classi
Organizzare gli interventi di modifica
Isolamento dalle modifiche
Bibliografia
Capitolo 11 - Sistemi
Come edifichereste una città?
Separate la realizzazione dall’uso di un sistema
Separazione di main
Factory
Dependency Injection
Estensione di scala
Confusione di ambiti
Proxy Java
Framework AOP puri Java
AspectJ
Sottoporre a test l’architettura del sistema
Ottimizzazione delle decisioni
Usate gli standard con cura, solo se dimostrano il proprio valore
I sistemi richiedono l’impiego di linguaggi specifici del dominio
Conclusioni
Bibliografia
Capitolo 12 - Simple Design
Come far emergere un codice pulito
Regola 1 di Simple Design – Passa tutti i test
Regole 2-4 di Simple Design – Refactoring
Niente duplicazione
Espressività
Minimizzare classi e metodi
Conclusioni
Bibliografia
Capitolo 13 - Concorrenza
A che cosa serve la concorrenza?
Miti e fraintendimenti
Sfide
Concorrenza: principi di difesa
Il principio SRP (Single Responsibility Principle)
Corollario: limitate il livello di visibilità (scope) dei dati
Corollario: usate copie dei dati
Corollario: i thread dovrebbero essere il più possibile indipendenti
Studiate la vostra libreria
Collection thread-safe
Studiate i modelli di esecuzione
Produttori-Consumatori
Lettori-Scrittori
La cena dei filosofi
Attenzione alle dipendenze fra metodi sincronizzati
Riducete al minimo le sezioni sincronizzate
Scrivere il codice di chiusura corretto è difficile
Collaudo del codice di un thread
Trattate i fallimenti occasionali come possibili problemi dei thread
Curate innanzitutto il funzionamento del codice mono-thread
Rendete versatile il codice a thread
Rendete configurabile il codice a thread
Provate a generare più thread delle CPU disponibili
Eseguite i test su piattaforme differenti
Mettete alla prova il vostro codice per provare a forzare i fallimenti
Test manuali
Test automatici
Conclusioni
Bibliografia
Capitolo 14 - Raffinamento progressivo
Implementazione di Args
Come ci sono arrivato?
Args: “la brutta”
E così mi sono fermato qui
L’incrementalismo
Argomenti String
Conclusioni
Capitolo 15 - JUnit
Il framework JUnit
Conclusioni
Capitolo 16 - Refactoring di SerialDate
Innanzitutto, facciamola funzionare
Ora raffiniamola
Conclusioni
Bibliografia
Capitolo 17 - Avvertenze ed euristiche
Commenti
C1: Informazioni inappropriate
C2: Commenti obsoleti
C3: Commenti ridondanti
C4: Commenti mal scritti
C5: Codice in commento
Ambiente
E1: Build che richiedono più di un passo
E2: Test che richiedono più di un passo
Funzioni
F1: Troppi argomenti
F2: Argomenti di output
F3: Flag usati come argomenti
F4: Funzioni “morte”
Generali
G1: Più linguaggi in un file di codice sorgente
G2: Non viene implementato un comportamento naturale
G3: Comportamento errato alle delimitazioni
G4: Disattivazione delle “sicure”
G5: Duplicazioni
G6: Codice posto al livello di astrazione errato
G7: Classi base che dipendono dalle loro derivate
G8: Eccesso di informazioni
G9: Il “dead code”
G10: Separazione verticale
G11: Incoerenza
G12: Congestione
G13: Accoppiamento artificioso
G14: Una questione di invidia (“feature envy”)
G15: Argomenti “a selettore”
G16: Offuscamento dello scopo
G17: Responsabilità mal collocate
G18: Modificatore static inappropriato
G19: Usate variabili descrittive
G20: Il nome di una funzione deve essere comunicativo
G21: Comprendere l’algoritmo
G22: Rendere fisiche le dipendenze logiche
G23: Meglio il polimorfismo di un if/else o di uno switch/case
G24: Seguite convenzioni standard
G25: Al posto dei “numeri magici”, usate costanti “parlanti”
G26: Siate precisi
G27: Il principio “structure over convention”
G28: Incapsulate i costrutti condizionali
G29: Evitate i negativi nei costrutti condizionali
G30: Le funzioni dovrebbero fare una cosa sola
G31: Accoppiamenti temporali nascosti
G32: Non siate arbitrari
G33: Incapsulate le condizioni di delimitazione
G34: Le funzioni devono discendere un solo livello di astrazione
G35: Mantenete ai livelli più elevati i dati configurabili
G36: Evitate la navigazione transitiva
Java
J1: Evitate i lunghi elenchi di import; usate i caratteri jolly
J2: Non ereditate le costanti
J3: Costanti o enum?
Nomi
N1: Scegliete nomi descrittivi
N2: Scegliete nomi collocati al corretto livello di astrazione
N3: Usate la nomenclatura standard, se possibile
N4: Nomi non ambigui
N5: Usate nomi lunghi per grandi campi di visibilità (scope)
N6: Evitate le codifiche
N7: I nomi dovrebbero descrivere anche gli effetti collaterali
Test
T1: Test insufficienti
T2: Usate uno strumento di copertura!
T3: Non saltate i test che considerate banali
T4: Un test ignorato è un problema di ambiguità
T5: Verificate le condizioni di delimitazione
T6: Applicate test esaustivi in prossimità dei bug
T7: Considerate quando i problemi sembrano far pensare a uno schema
T8: I risultati dei test di copertura possono essere rivelatori
T9: I test dovrebbero essere veloci
Conclusioni
Bibliografia
Appendice A - Concorrenza II
Un esempio client/server
Il server
Aggiunta del threading
Osservazioni sul server
Conclusioni
Possibili percorsi di esecuzione
Numero di percorsi
Approfondimento
Conclusioni
Studiare la libreria
Il framework Executor
Soluzioni senza bloccaggi
Classi problematiche quanto ai thread
Le dipendenze fra i metodi possono pregiudicare il funzionamento del codice concorrente
Tollerare i problemi
Bloccaggio basato sul client
Bloccaggio basato sul server
Migliorare la produttività (throughput)
Calcolo del throughput mono-thread
Calcolo del throughput multi-thread
Deadlock
Esclusione reciproca (mutual exclusion)
Blocco e attesa (lock & wait)
Nessuna prelazione (no preemption)
Attesa circolare (circular wait)
Risolvere l’esclusione reciproca
Risolvere il lock & wait
Risolvere il problema del no preemption
Risolvere il problema circular wait
Collaudo del codice multi-thread
Strumenti per il test del codice multi-thread
Conclusioni
Tutorial: esempi di codice
Client/server senza threading
Client/server con threading
Appendice B - org.jfree.date.SerialDate
Epilogo
← Prev
Back
Next →
← Prev
Back
Next →