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 →

Chief Librarian: Las Zenow <zenow@riseup.net>
Fork the source code from gitlab
.

This is a mirror of the Tor onion service:
http://kx5thpx2olielkihfyo4jgjqfb7zx7wxr3sd4xzt26ochei4m6f7tayd.onion