Ecco una domanda che mi piace chiedermi quando devo aggiungere un commento in una sezione di codice: cosa posso trasmettere per aiutare la prossima persona a comprendere meglio l'intento del codice in modo migliore , in modo che possano aggiornarlo, correggerlo o estenderlo più velocemente e in modo più affidabile?
A volte la risposta corretta a questa domanda è che non c'è nulla che tu possa aggiungere a quel punto nel codice, perché hai già selezionato nomi e convenzioni che rendono l'intento più ovvio che possa essere. Ciò significa che hai scritto un solido codice di auto-documentazione e che l'inserimento di un commento avrebbe probabilmente penalizzato più di quanto sarebbe stato utile. (Si noti che i commenti ridondanti possono effettivamente danneggiare l'affidabilità del codice nel tempo rallentando la sincronizzazione con il codice reale nel tempo e rendendo così più difficile decifrare il vero intento.
Tuttavia, in quasi tutti i programmi e in tutti i linguaggi di programmazione, incontrerai dei punti in cui determinati concetti e decisioni critici fatti dal programmatore originale - da te - non saranno più evidenti nel codice. Questo è praticamente inevitabile perché un buon programmatore sempre programmi per il futuro - cioè, non solo per far funzionare il programma una volta, ma per fare tutte le sue numerose correzioni e versioni future ed estensioni e modifiche e porte e chissà che anche funzionano correttamente. Quest'ultima serie di obiettivi è molto più difficile e richiede molto più pensiero per fare bene. È anche molto difficile esprimersi bene nella maggior parte dei linguaggi informatici, che sono più focalizzati sulla funzionalità - cioè, per dire cosa deve fare la questa versione del programma, in questo momento, al fine di renderlo soddisfacente.
Ecco un semplice esempio di ciò che intendo. Nella maggior parte delle lingue, una rapida ricerca in linea di una piccola struttura di dati avrà una complessità tale che chi la guarda per la prima volta probabilmente non riconoscerà immediatamente di cosa si tratta. Questa è un'opportunità per un buon commento, perché puoi aggiungere qualcosa sull'intento del tuo codice che un lettore successivo probabilmente apprezzerà immediatamente come utile per decifrare i dettagli.
Viceversa, in linguaggi come il linguaggio basato sulla logica Prolog, esprimere la ricerca di una piccola lista può essere così incredibilmente banale e succinta che qualsiasi commento che potresti aggiungere sarebbe solo rumore. Quindi, un buon commento è necessariamente dipendente dal contesto. Ciò include fattori come i punti di forza della lingua che stai utilizzando e il contesto generale del programma.
La linea di fondo è questa: pensa al futuro. Chiediti cosa è importante e ovvio su come il programma dovrebbe essere compreso e modificato in futuro. [1]
Per quelle parti del tuo codice che sono veramente auto-documentanti, i commenti aggiungono solo rumore e aumentano il problema di coerenza per le versioni future. Quindi non aggiungerli lì.
Ma per quelle parti del tuo codice in cui hai preso una decisione critica da diverse opzioni, o in cui il codice stesso è abbastanza complesso da rendere il suo scopo oscuro, aggiungi le tue conoscenze speciali sotto forma di un commento. Un buon commento in questo caso è quello che consente a qualche futuro programmatore di sapere che cosa deve essere mantenuto lo stesso - questo è il concetto di un'asserzione invariante, incidentalmente - e cosa è OK da cambiare.
[1] Questo va al di là del problema dei commenti, ma vale la pena di tirarlo fuori: se trovi che hai un'idea molto chiara di come il tuo codice potrebbe cambiare in futuro, dovresti pensare oltre a fare solo un commento e incorporare tali parametri all'interno del codice stesso, poiché questo sarà quasi sempre un modo più affidabile per garantire l'affidabilità delle versioni future del codice rispetto al tentativo di utilizzare i commenti per indirizzare qualche persona futura sconosciuta nella giusta direzione. Allo stesso tempo, si vuole anche evitare la generalizzazione eccessiva, dal momento che gli umani sono notoriamente cattivi nel predire il futuro, e questo include il futuro dei cambiamenti del programma. Quindi, cerca di definire e catturare dimensioni ragionevoli e comprovate del futuro a tutti i livelli di progettazione del programma, ma non lasciarti distrarre da un esercizio di eccessiva generalizzazione che è improbabile che paghi a lungo termine.