Codice di auto-documentazione vs. Codice commentato


22

Ho effettuato una ricerca ma non ho trovato quello che cercavo, non esitare a collegarmi se questa domanda è già stata posta.

All'inizio di questo mese è stato pubblicato questo post:

http://net.tutsplus.com/tutorials/php/why-youre-a-bad-php-programmer/

In sostanza, per riassumere, sei un cattivo programmatore se non scrivi commenti. La mia opinione personale è che il codice dovrebbe essere descrittivo e per lo più non richiedere commenti, a meno che il codice non possa essere auto-descrittivo.

Nell'esempio fornito

// Get the extension off the image filename  
$pieces = explode('.', $image_name);  
$extension = array_pop($pieces);  

L'autore ha detto che questo codice dovrebbe ricevere un commento, la mia opinione personale è che il codice dovrebbe essere una chiamata di funzione che è descrittiva:

$extension = GetFileExtension($image_filename);

Tuttavia nei commenti qualcuno ha effettivamente dato proprio quel suggerimento:

http://net.tutsplus.com/tutorials/php/why-youre-a-bad-php-programmer/comment-page-2/#comment-357130

L'autore ha risposto dicendo che il commentatore era "una di quelle persone", cioè un cattivo programmatore.

Quali sono le opinioni altrui sul codice auto-descrittivo rispetto al codice di commento?


1
@Péter - Ho dato un'occhiata a quello, ma volevo più ottenere l'opinione personale della gente tra i due, piuttosto che definire i commenti come odori di codice o meno.
Phill,

2
Trovo quell'articolo .... orribile da leggere. Molto offensivo.
sevenseacat,

@Karpie - Ho fatto :(
Phill

3
"Perché sei un cattivo programmatore PHP" Risposta: Perché stai programmando in PHP.
Thomas Eding,

Il metodo preferito consiste essenzialmente nell'utilizzare le chiamate di funzione per commentare il codice. Perché non usare i commenti per questo? Le funzioni devono essere utilizzate solo per codice riutilizzabile. Personalmente odio dover seguire il codice di qualcun altro scritto in questo modo per lo stesso motivo per cui l'affermazione GOTO è cattiva - Crea codice spaghetti. Ciò è reso migliore dai moderni IDE, ma non tutte le lingue e i programmatori possono usare questi IDE ed è ancora disorientante. Onestamente, sono d'accordo che dovresti commentare sezioni di codice che non sono chiare a colpo d'occhio - rende solo la lettura del tuo codice molto più semplice e veloce.
dallin

Risposte:


46

Preferisco scrivere codice auto-documentante. Una guida per questo è Clean Code .

Questo ovviamente non significa che non si dovrebbero mai usare i commenti - hanno il loro ruolo, ma IMHO dovresti usarli con attenzione. Questa mia precedente risposta su SO spiega in modo più dettagliato i miei pensieri sull'argomento.

Ovviamente, come ha notato @Niphra, vale sempre la pena di ricontrollare che ciò che credo sia pulito è davvero comprensibile da altri. Tuttavia, anche questa è una questione di pratica. Nell'università ho scritto pezzi di codice enigmatici semplicemente per l'uso di nomi strani e divertenti per tutte le entità di codice, secondo il mio capriccio. Fino a quando il mio insegnante ha annullato uno dei miei compiti, notando educatamente che non riusciva a capire quale modulo fosse il principale :-) Questa è stata una buona lezione, quindi ho cercato di concentrarmi sulla scrittura di codici sempre più leggibili da allora. Oggi difficilmente ricevo lamentele dai compagni di squadra.


Adoro quel libro :)
Phill,

Trovo ancora preziosi i commenti per esprimere la strategia utilizzata e coloro che sono stati respinti (con il motivo). Concordo sul fatto che i micro commenti sono generalmente inutili.
Matthieu M.,

9
Una delle mie citazioni preferite da Clean Code è che ogni commento è un fallimento nell'esprimersi nel codice.
Doval,

6
@Doval: una filosofia interessante, almeno per quanto riguarda i commenti su ciò che il codice fa . D'altra parte, alcuni dei commenti più utili possono essere quelli sul perché il codice non fa qualcosa, un concetto che non credo ci si aspetti che esprima.
supercat,

1
Non sono completamente d'accordo. Nessuna quantità di nomi descriverà completamente lo scopo della logica.
Kolob Canyon

65

Non dovresti documentare cosa sta facendo il codice, ma dovresti documentare perché lo sta facendo.

Nessuna quantità di trucchi per la denominazione esporrà perché e perché, quindi devi aggiungere commenti per spiegare lo scopo dei vari bit di codice.

Tutti gli altri commenti possono essere tranquillamente eliminati.


3
+1 L'esempio nell'articolo collegato dice "fai commenti in qualsiasi situazione in cui lo scopo del codice che ho scritto non sia immediatamente evidente". - È solo stupidità credere che il codice da solo possa comunicare uno scopo , perché le macchine stesse non hanno un concetto di scopo. Contro esempio: abbiamo bug in quasi tutti i software mai scritti, questa è una verità. Se un computer capisse lo scopo (il perché ), semplicemente rifiuterebbe di fare qualsiasi cosa diversa da quella che intendevamo, piuttosto che ricreare diligentemente il cosa / quando / come / dove ciò portava al bug.
David Meister,

Tutto il codice all'interno di una funzione dovrebbe essere lì per soddisfare lo scopo della funzione, ovvero cosa fa, ad esempio scrivere del testo in un file, la funzione "writeTo (testo stringa, file file)". Se un codice ha uno scopo diverso, ad esempio controllare i presupposti, come verificare che il file esista E non sia evidente, allora forse un'idea migliore di un commento sta scrivendo una nuova funzione, ad esempio "checkWritable (File file)". La qualità del codice non è una lista di controllo dogmatica, ma se ha bisogno di commenti, questo è un brutto segno e i "perché" non sono una buona ragione per averne bisogno . Perché il pollo ha attraversato la strada?
Trylks,

2
@ Trylks Funziona in alcuni casi ma non per tutti. Immaginate questo scenario: for (int i = 0; i < length/2;i++) { //if length is odd, the middle element should stay in place. Ora, questo non è né qualcosa di ovvio dallo scopo della funzione che racchiude, né potrebbe essere preso in considerazione nella sua stessa funzione. Se lo lasci senza commenti, è chiaramente negativo. Quindi aggiungi un commento per chiarire il tuo intento.
biziclop,

2
@ Trylks Inoltre, anche se prendiamo il tuo esempio, consideri il tuo check out in un metodo e lo chiami, fantastico. Ora tutto ciò che devi spiegare è perché devi controllare che il file sia scrivibile. :)
biziclop,

38

In realtà non credo nel codice auto-descrittivo. C'è un codice più leggibile e un codice meno leggibile , a seconda della lingua, della tua conoscenza (come dell'autore originale), della conoscenza del ragazzo che lo legge e della funzione del codice. Ma no, comunque ... dovrebbe essere descritto con un breve commento.

Ciò che mi è chiaro ora, che mi trovo in quell'area di pensiero , probabilmente non mi sarà chiaro tra un anno, quando sto pensando a qualcosa di completamente diverso e ho bisogno di usare di nuovo questa parte del codice.

Quindi, commenta il tuo codice. Ovviamente non tutte le righe (buon cielo, no), ma metti alcune righe di commento sopra una funzione / subroutine / modulo , o una parte particolarmente complicata e in breve descrivi cosa fa. Ti ringrazierai tra un anno o due.


Ci sono stato, l'ho fatto. "Codice meno leggibile" dovrebbe essere migliorato in codice che legge bene. La conoscenza di una lingua non conta davvero: quando non hai familiarità con la sintassi, dovresti impararla prima - francamente, questa è la base per essere un professionista. Cercare di recuperare il codice terribile aggiungendo commenti non è una buona idea. I commenti non dovrebbero mai tentare di descrivere ciò che fa il codice. Un commento (generale) è giustificato solo se devi dire il perché e non il cosa . Tutto il resto è solo rumore e cose aggiuntive non necessarie da mantenere.
Powerslave

PS, so di essere un po '"zombi" :) Mi dispiace per questo
Powerslave il

Per evitare confusione, sto parlando del solito caso, quando non sei costretto a scrivere codice errato in base ai requisiti aziendali (ad esempio prestazioni eccezionali o adattamento a spazio di archiviazione limitato). In altri (rari) casi, non hai altra scelta che lasciare commenti, alleviando in qualche modo il peso della prossima vittima.
Powerslave

19

Fortunatamente, entrambi i campi di questa discussione sono rappresentati qui e sono stati menzionati argomenti pro e contro per entrambi.

Credo che entrambi i campi abbiano argomenti sovrapposti, e in realtà sono d'accordo sulla maggior parte di essi, il modo in cui raggiungerli è un po 'diverso.

Argomenti sovrapposti

  • Il codice dovrebbe essere leggibile.
  • I commenti non dovrebbero dire esattamente la stessa cosa del codice, ma fornire ulteriori approfondimenti ove necessario.
  • Tutti i nomi di variabili / funzioni dovrebbero essere presi in considerazione in modo da fornire una buona rappresentazione di ciò che sono / fanno.
  • Il codice duplicato dovrebbe essere prevenuto.

Ora, la differenza principale è quanto peso viene posto su alcuni di questi argomenti.

Codice auto-descrittivo

  • I commenti possono diventare obsoleti, quindi riduci al minimo il loro utilizzo, poiché i commenti sbagliati sono peggio di nessun commento.
  • I commenti sono una duplicazione del codice. Tutto ciò che può essere scritto in codice, dovrebbe essere scritto in codice.

Più commenti

  • I commenti sono più leggibili del codice. L'inglese semplice è meglio nel descrivere qualcosa.

  • Il codice semplice causa spesso ambiguità che devono essere comunque commentate. Cercando di descriverlo nel codice, si ottengono nomi troppo lunghi. Inoltre, ti trovi costantemente di fronte a queste informazioni "extra" di cui hai bisogno solo la prima volta che le incontri.

Credo che entrambi i campi abbiano argomentazioni molto valide, ma non dovresti seguire freneticamente un campo, solo perché risolve un problema.

Per dimostrare, nel libro Clean Code , il codice è suddiviso in numerosi metodi più piccoli che vengono chiamati solo una volta. I metodi vengono creati per il solo motivo di documentare il codice (e TDD più semplice). Ciò si traduce in Funzione Inferno . Il codice è meno leggibile di quanto non fosse in origine e durante il refactoring non è stato pensato di incapsulare il codice riutilizzabile.

D'altra parte, spesso vedi le API in cui ogni funzione è commentata, solo perché "i commenti sono buoni". Le cose che avrebbero dovuto essere commentate non lo sono ancora.


1
@Steven - "D'altra parte, spesso vedi le API in cui ogni funzione è commentata, solo perché" i commenti sono buoni ". Le cose che avrebbero dovuto essere commentate non lo sono ancora." Uff, così frustrantemente vero!
dss539,

Questa è un'ottima risposta! Una cosa, se non ti dispiace, sulla leggibilità dei commenti: personalmente non credo che i commenti siano più leggibili. Come sviluppatori, di solito pensiamo al codice sorgente, specialmente quando ci troviamo in "modalità di codifica". In quei momenti, la vaghezza del semplice linguaggio umano è di solito più una distrazione che di aiuto.
Powerslave

5

"Mi dispiace ma tu sei quel ragazzo."

Mi chiedo perché non gli piaccia commentare: P

Seriamente, la codifica è troppo di un'arte che si potrebbe davvero fare una dichiarazione così ampia. A volte hai bisogno di commenti, a volte funzioni più e meglio denominate. Di solito entrambi.

Cerca la programmazione alfabetica come uno stile estremo.


Si. Voglio dire, se Donald Knuth pensasse che non solo avessi bisogno di commenti, ma che a volte avessero bisogno di loro capitoli , ci penserei almeno due volte prima di non essere d'accordo.
PeterAllenWebb,

3

La risposta breve, migliore e corretta

L'idea che tutto ciò di cui hai bisogno sia un "codice auto-documentato" ben scritto è un anti-schema e dovrebbe morire, anche quando fa eccezioni per i commenti che spiegano "perché". È un mito che puoi sempre scrivere tutto il codice per qualsiasi algoritmo abbastanza chiaro da consentire a qualsiasi programmatore di guardarlo e ottenerlo (o che non richiederà refactoring o tempo organizzativo che non hai). Ancora più importante, il più delle volte, i programmatori che pensano di scrivere codice chiaro non lo fanno.

Una risposta molto migliore dei commenti dovrebbe essere usata solo per spiegare "perché" è che i commenti dovrebbero:

  • spiegare "why" (ovviamente)
  • spiegare "cosa" su singole righe solo quando il codice è complesso o lo scopo non è chiaro e non può essere o non vale la pena semplificare ulteriormente
  • spiega "cosa" per i blocchi di codice per accelerare la comprensione e individuare ciò di cui hai bisogno

La spiegazione per il backup

Le persone pensano erroneamente che l'unica ragione per cui le persone usano i commenti è spiegare cosa significa una riga di codice. La verità è un grande scopo di commentare il codice è quello di renderlo più veloceper dare un'occhiata al tuo codice e trovare quello che stai cercando. Quando torno più tardi al codice o leggo il codice di qualcun altro, certo, posso leggere e comprendere una sezione di codice ben scritto, ma non è più veloce e più facile leggere il commento in alto dicendo cosa fa quella sezione di codice e saltarlo del tutto se non è quello che sto cercando? Perché sedersi lì e capire del codice, anche se è ben scritto, se puoi dare un'occhiata a un paio di commenti e capire un'intera funzione? Ecco perché usiamo nomi descrittivi per le funzioni - nessuno dice che non ho bisogno di usare un nome descrittivo per la mia funzione perché qualcuno può semplicemente guardare attraverso il mio codice scritto in modo pulito per vedere cosa fa.

Ad esempio, se sto guardando attraverso la funzione di qualcun altro, è più facile andare riga per riga attraverso il codice per vedere cosa sta facendo o dare un'occhiata a tre commenti ben scritti in tutta la funzione per vedere esattamente cosa sta facendo la funzione e dove lo sta facendo?

Un altro anti-pattern è l'uso eccessivo di funzioni per commentare il tuo codice. Le funzioni ben nominate sono una parte importante della documentazione del codice, ma a volte i programmatori separano 2-3 righe di codice che non verranno mai utilizzate da nessun'altra parte in una funzione a scopo di documentazione. Perché l'uso eccessivo delle funzioni è meglio di un uso eccessivo dei commenti? Usare funzioni come questa è come abbracciare le istruzioni GOTO: crea un codice spaghetti che può essere una seccatura da seguire.

In sostanza, quando lavori in un ambiente aziendale, in cui le persone condividono costantemente il codice e le persone non hanno sempre il tempo di rendere perfetto il loro codice, alcuni buoni commenti possono farti risparmiare un sacco di tempo e frustrazione. E ricorda, mentre potresti essere un guru in grado di leggere il codice alla velocità della luce, probabilmente non tutti nel tuo ufficio lo sono.


Lo odio quando le persone riducono il voto e non lasciano nemmeno un commento sul perché. Hai persino letto l'intero post? Cosa c'è dentro non è semplice e vero? Con cosa non sei d'accordo? Sento che le persone sono così fissate nella loro idea o in ciò che leggono che non ci pensano nemmeno e ridurranno immediatamente qualsiasi cosa che non condivida la loro opinione.
dallin

3
Suppongo sia perché rifiuti e definisci apertamente un antipattern qualcosa che è quasi universalmente riconosciuto come giusto. Certamente penso che tu vada troppo lontano. Principalmente, non riesco a immaginare di fidarmi dei commenti come sembra. Se leggi ciecamente i commenti e non il codice, i commenti potrebbero essere errati e non aggiornati e non lo sapresti mai. Questa è la base per usare le funzioni come documentazione. Concordo sul fatto che non dovresti avere troppe funzioni in un unico posto, anche se la soluzione a ciò non è di sostituirle con commenti.
Magus,

@Magus Grazie per il commento. Presumo che ti stia riferendo al mio parlare sull'uso delle funzioni come documentazione. Rileggendolo, credo di aver formulato in modo mediocre il suono come se volessi dire usare funzioni per quello scopo (al contrario dell'abuso di funzioni a tale scopo) era un male. Ho ripulito quel paragrafo per chiarire il mio intento originale. La mia opinione sulla fiducia nei commenti è che se un commento diventa obsoleto, di solito è un segno che stavi commentando in una sezione di codice troppo stretta - che stavi commentando l'implementazione piuttosto che l'intento.
dallin

but isn't it faster and easier to read the comment at the top saying what that section of code does and skip it altogether if it's not what I'm looking forSi chiama "il nome del metodo / funzione". Se hai un blocco di codice che non ha un nome ma è così lungo che non puoi accettarlo con una rapida occhiata, forse il problema sta lì.
biziclop,

1
@biziclop Overtime Sono arrivato a credere che questo argomento sia principalmente semantico e, in pratica, il nostro codice sarebbe simile. Detto questo, supponendo che il blocco di codice non sia utilizzato in più di un posto, non vedo una differenza tra un blocco di codice con un breve commento descrittivo nella parte superiore e un blocco di codice con un breve nome descrittivo nella superiore. Sono gli stessi, tranne uno non ha spazi. Possono essere sia sbagliati che obsoleti. L'unica differenza che vedo davvero è che il codice è più facile da leggere con un commento poiché non è necessario seguire la chiamata della funzione in una posizione separata.
dallin

2

Beh, devi anche ricordare qualcosa che è ovvio o "auto-documentante" per te, potrebbe non essere per qualcun altro ... Forse qualcuno con meno comprensione di determinate funzioni. Quindi commento quasi tutto.


1
Puoi fare un esempio. Voglio dire, dato l'esempio nella mia domanda originale. "GetFileExtension" qual è il punto nel commento "Ottiene l'estensione del file di un determinato file"? Il metodo ha già descritto cosa dovrebbe andare nel commento. Se il metodo fosse chiamato "GetExtension", un commento sarebbe di aiuto nel chiarire cosa deve fare il metodo, poiché il metodo non si spiega da solo.
Phill,

+1 Questa è una domanda che conosci il tuo pubblico. Chi probabilmente utilizzerà questa funzione? Come puoi aiutarli? Quanto varrà il tuo aiuto? Vale la pena più che passare un po 'di tempo ora per aggiungere un commento? Ecc. Ecc. Ecc.
Peter Allen Webb

2
@PeterAllenWebb: nessun punto a quel commento. Ciò non significa da remoto che la funzione non dovrebbe essere commentata; dovrebbe. L '"estensione" include il punto o no? A cosa serve il valore di ritorno "foo"? ( null?? "") Per "foo."? Il passaggio nullcauserà un'eccezione o la funzione restituirà qualcosa (forse null)?
TJ Crowder

2

Bene, la cosa con il codice di auto-documentazione è che all'interno di quella funzione, troverai:

$pieces = explode('.', $image_name);  
$extension = array_pop($pieces);  

che si spiega da solo quando si ha il nome della funzione poiché sono solo due righe. Quando le cose si complicano, devi racchiudere ogni poche righe di codice in una funzione con un nome descrittivo o usare i commenti dove necessario .

Non ho mai capito perché dovrebbe essere una o / o materia, invece di e / e. Sì, rendi il tuo codice quanto più autocompattante possibile, e sì, aggiungi alcuni commenti alle parti che altrimenti non sarebbero chiare.


Si. Penso che devi essere "addestrato" a pensare che dovrebbe essere l'uno o l'altro e non entrambi.
PeterAllenWebb,

2

I commenti e il codice pulito autocertificato sono diversi. Il codice è tutto su come fare le cose. E i commenti dovrebbero riguardare la parte del perché , che non può essere spiegata nel codice, qualunque sia la tua lingua. Inoltre, se la tua lingua è molto limitata e non hai contratti, specifiche statiche e persino asserzioni, i commenti dovrebbero coprire i problemi di confine del tuo codice.


Supponendo che ci sia una ragione per tutto, dovrebbe essere commentato?
JeffO,

Sì, appunto. Ecco perché credo che il modo migliore per commentare il tuo codice sia una programmazione alfabetica.
SK-logic,

1

In tal caso, è facile creare una funzione descrittiva. Ma ho letto un sacco di codice fatto da bravi programmatori che credevano che il loro codice fosse auto-documentante, e ciò che era stato cristallino per loro mi stava davvero confondendo.

$ extension = GetFileExtension ($ image_name);

Per tornare al tuo esempio, posso inviargli un array di nomi di immagini o ci vuole solo un'immagine? Supporta qualsiasi tipo di file o solo alcuni di essi? Proteggerà la stringa per me o devo farlo? Se il tipo di file non esiste, mi avvisa?

Certo, lo sto allungando un po '. Ma ricordo un programmatore che credeva che audio_bandwidth e video_bandwidth fossero nomi autocompensanti; si è scoperto che l'audio doveva essere espresso in byte e il video in kilobyte. Ci è voluto molto tempo per capirlo.


5
Lo stai allungando molto. La funzione ottiene l'estensione del nome file. Niente di più, niente di meno. Il suo nome dice se prende un array o no (chiaramente no). Non riesco a pensare a un metodo che farebbe affidamento sul tipo di file per ottenere l'estensione. Proteggere la stringa è l'unica che potrebbe essere incorporata, ma non me lo sarei mai aspettato perché, come sa qualsiasi sviluppatore di PHP: tutto l'input dell'utente è sospetto, quindi proteggilo prima di usarlo.
Matt Ellen,

2
@Matt: il "chiaramente no" indica che non si esegue la manutenzione molto spesso. Essere espliciti risparmia molto graffi (e RTFSource) in un secondo momento e documenta anche ciò che l'autore originale si aspettava che facesse. Sia che si tratti di un commento o di un lungo nome di funzione non è così importante.
Donal Fellows,

Forse l'esempio è stato un brutto da usare in questa domanda, non ho toccato PHP per circa 7 anni, ho fatto C # e un po 'di Java, quindi sono abituato ad avere un IDE che mi dice il tipo restituito o dichiarando i tipi.
Phill

1
@Donal Fellows: dice file, singolare. Cosa c'è di ambiguo in questo? È completamente esplicito.
Matt Ellen,

4
Il fatto che ora ci siano 7 risposte da 4 persone che discutono dell'ovvietà o meno di una singola chiamata di funzione mi suggerisce che è necessario utilizzare i commenti . Ha anche sottolineato il fatto che la denominazione accurata è una forma d'arte in sé.
Formica

1

Uno non esclude l'altro. Anche se il tuo codice è auto-commentato, ci sono momenti in cui potresti aver bisogno di commenti regolari per spiegare perché il tuo codice di auto-commento fa quello che fa.


Penso che questo rientri nella mia opinione che era "il codice dovrebbe essere descrittivo e per lo più non richiede commenti a meno che il codice non possa essere auto-descrittivo". Se scrivi il codice che è ben scritto, non spiega completamente l'intenzione del codice, quindi i commenti aiutano a rendere il codice più descrittivo.
Phill,

Il codice non può mai spiegare il suo scopo. Quando vedi un martello, non riesci a capire a cosa serva - è per distruggere i teschi o semplicemente per forgiare un ferro grezzo.
SK-logic,

1
@ SK-logic:public <T> void hit(T item);
Michael K,

@Michael - esattamente. Come capirà l'utente, quali categorie di oggetti possono e devono essere martellate? Anche con un sistema di tipo molto migliore non è sempre chiaro quale gamma di possibili usi sia effettivamente pianificata da uno sviluppatore.
Logica SK

1

Non sono d'accordo con quell'articolo e sono d'accordo con te in una certa misura. Se usi nomi di metodi validi, nomi di variabili validi e metodi di piccole dimensioni che eseguono una sola operazione, il codice dovrebbe essere semplice da seguire.

Cerca solo di non essere intelligente perché il codice intelligente è orribile da leggere e mantenere. Parola chiave: mantieni !

La mia opinione è che i commenti dovrebbero descrivere il perché e non il cosa. Ricorda in questo ipotetico mondo perfetto, il tuo codice è abbastanza pulito da consentire una facile lettura, non è necessario spiegare cosa sta facendo, ma perché hai scelto di farlo in questo modo o in quel modo.

Se stai utilizzando un sistema di controllo del codice sorgente, puoi utilizzare il messaggio di commit per far sapere a tutti (e te stesso) cosa hai fatto in un determinato momento e, soprattutto, perché.


1

Vorresti evitare di scrivere commenti proprio come vorresti evitare qualsiasi documentazione. Quando si tratta del linguaggio di programmazione stesso, tutti operano dalla stessa serie di vocaboli e sintassi (quasi).

Quando la tua app è per un determinato dominio, può essere difficile convincere tutti i soggetti a concordare e / o stabilire un vocabolario comune. Ci viene insegnato a evitare abbreviazioni e gergo esteso, ma lo chiamerò

Il margine operativo lordo

e non

EquityBeforeInterestTaxesDepreciationAndAmortization

Se non ne conosci uno, probabilmente non capisci l'altro. Se la società ha un'implementazione non comune, un commento aiuterebbe il prossimo programmatore che potrebbe avere esperienza nel dominio, ma non questa particolare azienda (il che rende le cose più complicate).


1

Penso che dobbiamo distinguere tra documentazione ed espressività del codice.

Durante il debug o la revisione del codice, non stai leggendo un libro. Il più delle volte vuoi solo saltare da un metodo all'altro e creare connessioni rapide nella tua mente per ottenere una comprensione di base di ciò che sta accadendo in fase di esecuzione. Non è la documentazione attorno al codice, ma l' espressività delle firme del codice che conta in quel processo, la loro capacità di essere abbastanza significative da poterle identificare immediatamente e aggiungerle al proprio stack di chiamate interno. A quel punto, il nostro cervello (almeno, il mio funziona in quel modo;)) tende a considerare i grandi blocchi di commenti come un rumore piuttosto che un aiuto. Pertanto, i commenti di una riga, o ancora meglio, solo metodi autodescrittivi e nomi di oggetti sono sufficienti qui.

Se vuoi "leggere il libro" di una particolare classe o caratteristica, un posto molto migliore per questo è nei test unitari. I test unitari ben progettati sono per natura rivelatori di intenzioni e molto più documentativi (cioè esplicativi, dettagliati) rispetto al più spesso dei blocchi di commenti poiché contengono 1 / le aspettative su esattamente ciò che questo codice dovrebbe fare e 2 / la capacità di verificare queste aspettative rispetto al codice reale. Un test di superamento è cento volte più affidabile di qualsiasi commento in termini di documentazione, poiché dimostra che ciò che afferma è vero.


1

Un po 'di codice non è auto-documentato e richiede un commento da parte di un collega umano che ha capito e testato quel pezzo. Quello che ho sotto non è abbastanza per capirlo, penso.

//
// iterative version
//
Node* ReverseList( Node ** List ) 
{

  Node *temp1 = *List;
  Node * temp2 = NULL;
  Node * temp3 = NULL;

  while ( temp1 )
  {
    *List = temp1; //set the head to last node 
    temp2= temp1->pNext; // save the next ptr in temp2
    temp1->pNext = temp3; // change next to privous
    temp3 = temp1;
    temp1 = temp2;
  }

  return *List;
}

1

In genere preferisco scrivere codice auto-documentante, con commenti dove non è chiaro, dal momento che penso che la maggior parte del codice non si documenterà completamente.


0

All'università ci è stato insegnato a riformulare praticamente ogni riga di codice in inglese con un commento (probabilmente solo per farci prendere l'abitudine di capire cosa fa effettivamente il codice, piuttosto che semplicemente copiare / incollare qualcosa e sperare per il meglio).

Personalmente, immagino che ingombra il tuo codice, rendendolo meno leggibile che se fosse solo commenti o solo codice. Sono un programmatore C # e gli unici commenti che faccio continuamente sono i blocchi di commenti "triple-slash" che vengono interpretati nella documentazione di IntelliSense. Se mi sento particolarmente in colpa per un modo particolare di fare qualcosa, o sembra particolarmente criptico, darò un'ulteriore spiegazione, ma questo è tutto.

IMO: il codice autocompattante è un codice in cui i nomi delle variabili e dei metodi vengono assegnati a nomi significativi e contestuali, in modo che descrivano qual è il loro scopo.


0

Se hai rivisitato il tuo codice più volte e non hai ancora trovato un modo per rendere chiara l'intenzione a qualcuno che conosce il dominio. Riscrivi la funzione. Dopotutto non sono più di 10-20 righe. Se è più lunga riscrivere la funzione è comunque troppo lunga e questo è parte del motivo per cui è illeggibile :) risciacqua-ripeti

e nel caso improbabile non è ancora chiaro cosa stia facendo il codice e ti sei ricordato di chiedere aiuto ai tuoi colleghi. Bene, allora ti ringraziamo tutti per aver contribuito a far evolvere Linux perché è il codice del kernel che stai scrivendo, giusto? se non risciacquo, ripetere dall'alto :)

In poche parole, non scrivere i tuoi commenti CODICI


0

Guarda il codice completo 2a edizione, pag. 128-129.

I tipi di dati astratti ti salveranno da questo enigma. Il codice di auto-documentazione è la strada da percorrere. I commenti possono essere utili, ma avendo

entità del mondo reale piuttosto che implementazioni di basso livello

sei in grado di evitare di usare i commenti.

Una cosa sui commenti è che li scrivi una volta, ma non li vedi quando implementi la funzione, li vedi solo quando cambi la funzione.

I commenti sono davvero utili quando vengono interpretati dall'IDE nel modo in cui Delphi 2009+ o JavaDoc funzionano, ma è più un linguaggio di markup strutturato, quindi in un certo senso stai programmando la tua documentazione, che è molto intelligente.


0

Credo nel mantra che il codice non documenti se stesso, perché potresti essere il miglior programmatore al mondo (Ada), eppure non capisci nulla di ciò che sta succedendo, ma se documenti perché e in breve come il tuo codice sta facendo quello che fa, aiuterai te stesso e gli altri in futuro.


0

I commenti sono un must. Perché quando scrivi il codice, stai scrivendo per le tue esigenze attuali, ma anche per le persone in futuro che devono leggere il tuo codice, capire wtf, cosa stai facendo, e perché, e poi come modificarlo.

Se ti ricordi questo, durante la programmazione / programmazione?

Come posso rendere questo più facile da capire e modificare per i futuri programmatori di questo codice su cui sto lavorando, quindi farai un buon lavoro. In caso contrario, stai solo rendendo difficile per gli altri modificare il tuo codice e non immaginare che non sarà mai il caso, è raro ...

Alla maggior parte del mio lavoro, ho sempre dovuto modificare il codice di altre persone, e scritto in modo orribile, scarsamente documentato.

Quindi l'abitudine di pensare che il documento in codice sia autonomo, non sta semplicemente facendo la dovuta diligenza.

Come programmatori dobbiamo praticare l'autodisciplina che può sembrare totalmente ar ai programmatori inesperti, ma deve avere abitudini, per evitare tutte le orribili esperienze che abbiamo avuto con il codice di altre persone. O anche guardando il nostro codice mesi, anni dopo.

Dai un'occhiata a http://thedailywtf.com che hanno tonnellate di storie divertenti ma reali sui programmatori che non hanno fatto la loro dovuta diligenza.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.