La citazione di Robert C. Martin è fuori dal contesto. Ecco la citazione con un po 'più di contesto:
Nothing can be quite so helpful as a well-placed comment. Nothing can
clutter up a module more than frivolous dogmatic comments. Nothing
can be quite so damaging as an old crufty comment that propagates lies
and misinformation.
Comments are not like Schindler's List. They are not "pure good."
Indeed, comments are, at best, a necessary evil. If our programming
languages were expressive enough, or if we had the talent to subtly
wield those languages to express our intent, we would not need
comments very much -- perhaps not at all.
The proper use of comments is to compensate for our failure to express
ourself in code. Note that I used the word failure. I meant it.
Comments are always failures. We must have them because we cannot
always figure out how to express ourselves without them, but their use
is not a cause for celebration.
So when you find yourself in a position where you need to write a
comment, think it through and see whether there isn't some way to turn
the tables and express yourself in code. Every time you express
yourself in code, you should pat yourself on the back. Every time you
write a comment, you should grimace and feel the failure of your
ability of expression.
(Copiato da qui , ma il la citazione originale proviene da Pulisci codice: un manuale di abilità software agile )
Come questa citazione è ridotta in "I commenti sono sempre falliti" è un buon esempio di come alcune persone prenderanno una citazione sensata fuori dal contesto e trasformandola in stupido dogma.
La documentazione dell'API (come javadoc) dovrebbe documentare l'API in modo che l'utente possa usarlo senza dover leggere il codice sorgente . Quindi in questo caso la documentazione dovrebbe spiegare che cosa fa il metodo. Ora si può affermare che "Recupera un prodotto in base al suo id" è ridondante perché è già indicato dal nome del metodo, ma l'informazione che null
può essere restituita è sicuramente importante per documentare, poiché ciò non è in alcun modo ovvio.
Se vuoi evitare la necessità del commento, devi rimuovere il problema sottostante (che è l'uso di null
come valore di ritorno valido), rendendo l'API più esplicita. Ad esempio, potresti restituire un tipo di tipo Option<Product>
, quindi la firma del tipo comunica chiaramente ciò che verrà restituito nel caso in cui il prodotto non venga trovato.
Ma in ogni caso non è realistico documentare completamente un'API solo attraverso i nomi dei metodi e le firme dei tipi. Utilizza i commenti del doc per eventuali informazioni aggiuntive non ovvie che l'utente dovrebbe conoscere. Dì la documentazione dell'API da DateTime.AddMonths()
nel BCL:
The AddMonths method calculates the resulting month and year, taking
into account leap years and the number of days in a month, then
adjusts the day part of the resulting DateTime object. If the
resulting day is not a valid day in the resulting month, the last
valid day of the resulting month is used. For example, March 31st + 1
month = April 30th. The time-of-day part of the resulting DateTime
object remains the same as this instance.
Non è possibile esprimere ciò utilizzando solo il nome e la firma del metodo! Naturalmente la tua documentazione di classe potrebbe non richiedere questo livello di dettaglio, è solo un esempio.
I commenti in linea non sono male neanche.
I commenti
non validi sono negativi. Per esempio commenti che spiegano solo cosa può essere visto banalmente dal codice, il classico esempio è:
// increment x by one
x++;
I commenti che spiegano qualcosa che potrebbe essere chiarito rinominando una variabile o un metodo o altrimenti ristrutturando il codice, è un odore di codice:
// data1 is the collection of tasks which failed during execution
var data1 = getData1();
Questi sono il tipo di commenti contro cui Martin si oppone. Il commento è un sintomo di una mancata scrittura del codice chiaro - in questo caso per usare 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.
Tuttavia i commenti dovrebbero essere usati per spiegare tutto ciò che non è ovvio dal codice, ad es. perché il codice è scritto in un modo non ovvio:
// need to reset foo before calling bar due to a bug in the foo component.
foo.reset()
foo.bar();
Commenti che spiegano cos'è un pezzo di codice eccessivamente contorto, ma la correzione non è di mettere fuori legge i commenti, la correzione è la correzione del codice! Nella realtà, il codice contorto si verifica (si spera solo temporaneamente fino a un refactoring) ma nessuno sviluppatore ordinario scrive il codice pulito perfetto la prima volta. Quando si verifica un codice convoluto, è molto meglio scrivere un commento che spieghi cosa fa che non scrivere un commento. Questo commento renderà più semplice il refactoring più tardi.
A volte il codice è inevitabilmente complesso. Potrebbe essere un algoritmo complicato, o potrebbe essere un codice che sacrifica la chiarezza per motivi di prestazioni. Di nuovo i commenti sono necessari.