La citazione di Robert C. Martin è fuori dal contesto. Ecco la citazione con un po 'più di contesto:
Niente può essere così utile come un commento ben posizionato. Nulla può ingombrare un modulo più di frivoli commenti dogmatici. Niente può essere così dannoso come un vecchio commento volgare che propaga menzogne e disinformazione.
I commenti non sono come l'elenco di Schindler. Non sono "puro bene". In effetti, i commenti sono, nella migliore delle ipotesi, un male necessario. Se i nostri linguaggi di programmazione fossero abbastanza espressivi, o se avessimo il talento di usare in modo sottile quei linguaggi per esprimere il nostro intento, non avremmo bisogno di molti commenti, forse per niente.
L'uso corretto dei commenti è per compensare la nostra incapacità di esprimerci nel codice. Nota che ho usato la parola fallimento. Intendevo ciò. I commenti sono sempre errori. Dobbiamo averli perché non possiamo sempre capire come esprimerci senza di loro, ma il loro uso non è motivo di celebrazione.
Quindi quando ti trovi in una posizione in cui devi scrivere un commento, riflettilo e vedi se non c'è modo di girare le tabelle ed esprimerti in codice. Ogni volta che ti esprimi nel codice, dovresti darti una pacca sulla spalla. Ogni volta che scrivi un commento, dovresti fare una smorfia e sentire il fallimento della tua capacità espressiva.
(Copiato da qui , ma la citazione originale è tratta da Clean Code: A Handbook of Agile Software Craftsrafts )
Come questa citazione sia ridotta in "I commenti sono sempre fallimenti" è un buon esempio di come alcune persone prenderanno una citazione ragionevole fuori dal contesto e la trasformeranno in stupido dogma.
La documentazione dell'API (come javadoc) dovrebbe documentare l'API in modo che l'utente possa utilizzarla senza dover leggere il codice sorgente . Quindi in questo caso la documentazione dovrebbe spiegare cosa fa il metodo. Ora puoi sostenere che "Recupera un prodotto dal suo ID" è ridondante perché è già indicato dal nome del metodo, ma le informazioni che null
possono essere restituite sono sicuramente importanti da documentare, dal momento che questo non è affatto ovvio.
Se si desidera evitare la necessità del commento, è necessario rimuovere il problema sottostante (che è l'uso di null
come valore di ritorno valido), rendendo l'API più esplicita. Ad esempio, è possibile restituire un tipo di Option<Product>
tipo, quindi la firma del tipo stesso comunica chiaramente cosa verrà restituito nel caso in cui il prodotto non venga trovato.
Ma in ogni caso non è realistico documentare un'API completamente solo attraverso i nomi dei metodi e le firme dei tipi. Usa i doc-commenti per qualsiasi ulteriore informazione non ovvia che l'utente dovrebbe conoscere. Supponiamo che la documentazione API DateTime.AddMonths()
nel BCL:
Il metodo AddMonths calcola il mese e l'anno risultanti, tenendo conto degli anni bisestili e del numero di giorni in un mese, quindi regola la parte del giorno dell'oggetto DateTime risultante. Se il giorno risultante non è un giorno valido nel mese risultante, viene utilizzato l'ultimo giorno valido del mese risultante. Ad esempio, 31 marzo + 1 mese = 30 aprile. La parte ora del giorno dell'oggetto DateTime risultante rimane la stessa di questa istanza.
Non puoi assolutamente esprimerlo usando solo il nome e la firma del metodo! Naturalmente la documentazione della tua classe potrebbe non richiedere questo livello di dettaglio, è solo un esempio.
I commenti in linea non sono neanche male.
I commenti negativi sono negativi. Ad esempio commenti che spiegano solo cosa si può vedere banalmente dal codice, l'esempio classico è:
// increment x by one
x++;
I commenti che spiegano qualcosa che potrebbe essere chiarito rinominando una variabile o un metodo o in altro modo ristrutturando il codice, sono odori di codice:
// data1 is the collection of tasks which failed during execution
var data1 = getData1();
Questi sono il tipo di commenti contro cui Martin rota. Il commento è un sintomo di una mancata scrittura di codice chiaro, in questo caso di utilizzare nomi autoesplicativi per variabili e metodi. Il commento in sé non è ovviamente il problema, il problema è che abbiamo bisogno del commento per capire il codice.
Ma i commenti dovrebbero essere usati per spiegare tutto ciò che non è ovvio dal codice, ad esempio perché il codice è scritto in un certo modo non ovvio:
// need to reset foo before calling bar due to a bug in the foo component.
foo.reset()
foo.bar();
Anche i commenti che spiegano cosa fa un pezzo di codice eccessivamente contorto sono un odore, ma la correzione non è di mettere fuorilegge i commenti, la correzione è la correzione del codice! In parole povere, il codice contorto avviene (si spera solo temporaneamente fino a un refactor) ma nessuno sviluppatore ordinario scrive un codice pulito perfetto la prima volta. Quando si verifica un codice contorto, è molto meglio scrivere un commento che spieghi cosa fa piuttosto che non scrivere un commento. Questo commento faciliterà anche il refactoring in seguito.
A volte il codice è inevitabilmente complesso. Può essere un algoritmo complicato o può essere il sacrificio del codice che limita la chiarezza per motivi di prestazioni. Ancora una volta sono necessari commenti.