"I commenti sono un odore di codice" [chiuso]


100

Un mio collega crede che qualsiasi uso di commenti in codice (cioè, non metodo javadoc o commenti di classe) sia un odore di codice . Cosa ne pensi?


44
Voterò qualsiasi risposta che dice "no".
Nicole,

2
@Renesis Questo è l'odore della divinità.
ixtmixilix,

107
Il tuo collega ha fatto una generalizzazione generale, il che significa automaticamente che ha torto. :)
Alex Feinman,

5
@Mongus, non sono d'accordo. I commenti nel tuo esempio non sono male perché sono commenti, ma perché sono TROPPO vicini al codice che poi cambia. Dovrebbero dire PERCHÉ e non COSA .

5
@Alex, non è questa una generalizzazione radicale, che è quindi sbagliata (risultando in lui non sbagliare comunque)?

Risposte:


167

Solo se il commento descrive cosa sta facendo il codice.

Se volessi sapere cosa stava succedendo in un metodo o in un blocco, avrei letto il codice. Spero comunque che tutti gli sviluppatori che lavorano su un determinato progetto abbiano almeno abbastanza familiarità con il linguaggio di sviluppo per leggere ciò che è scritto e capire cosa sta facendo.

In alcuni casi di ottimizzazione estrema, potresti utilizzare tecniche che rendono difficile per qualcuno seguire ciò che sta facendo il tuo codice. In questi casi, i commenti possono e devono essere utilizzati non solo per spiegare perché si dispone di tali ottimizzazioni, ma cosa sta facendo il codice. Una buona regola empirica sarebbe quella di avere qualcun altro (o più altre persone) a conoscenza del linguaggio di implementazione e del progetto guardare il tuo codice - se non riescono a capire sia il perché che il come, allora dovresti commentare sia il perché che il il come.

Tuttavia, ciò che non è chiaro nel codice è il motivo per cui hai fatto qualcosa. Se adotti un approccio che potrebbe non essere ovvio per gli altri, dovresti avere un commento che spieghi perché hai preso le decisioni che hai preso. Sospetto che potresti anche non capire che è necessario un commento fino a dopo qualcosa come una recensione del codice, in cui le persone vogliono sapere perché hai fatto X invece di Y: puoi catturare la tua risposta nel codice per tutti gli altri che lo guardano nel futuro.

La cosa più importante, tuttavia, è cambiare i tuoi commenti quando cambi il tuo codice. Se cambi un algoritmo, assicurati di aggiornare i commenti con il motivo per cui hai scelto l'algoritmo X su Y. I commenti non aggiornati hanno un odore di codice ancora maggiore.


8
Concordo con questa risposta con un commento, ma l'ho anche vista come una scusa per la mancanza di documentazione, il che è sbagliato. La lettura del codice è un dolore nel culo a volte. Non si dovrebbe avere a guardare il codice di un metodo per capire che cosa quel metodo fa. Dovresti essere in grado di capirlo dal nome e ottenere alcuni dettagli dai documenti. Quando leggi il codice, devi spesso passare da una classe all'altra e da un file all'altro. Ciò è particolarmente un problema nei linguaggi dinamici, in cui la scrittura di un IDE in grado di gestire tutto ciò non è banale.
davidtbernal,

1
Ad ogni modo, a volte devi anche commentare il HOW se è complicato (specialmente se è ottimizzato o qualsiasi altro tipo di operazioni non banali). Se devo passare più di 5 minuti a leggere un blocco di codice per capire cosa sta facendo, può essere piuttosto frustrante ...
Khelben

3
"Solo se il commento descrive cosa sta facendo il codice." O se il commento descrive cosa faceva il codice; il codice è cambiato ma il commento no.
Bruce Alderman,

1
Come testare che il tuo commento è corretto? Perché non scrivere il tuo commento come test? Qualsiasi futuro manutentore può utilizzare il test come documentazione verificabile per il codice. Se il commento ha qualcosa a che fare con l'esecuzione del codice, allora quel qualcosa / deve / essere asseribile. Se il commento non ha nulla a che fare con l'esecuzione del codice, allora cosa sta facendo nel codice dove guarderanno solo i programmatori?
flamingpenguin,

2
@ back2dos, se vomiti spesso quando leggi il codice di altre persone, sono contento che non condividiamo gli uffici ...

110

Questo è particolarmente irritante da sentire al momento, ho trascorso un po 'di tempo questo fine settimana a guardare un codice molto ben definito, molto pulito e non commentato che implementava un algoritmo di ricerca (uno che non è effettivamente pubblicato). Lo conosco di alto livello, il ragazzo seduto accanto a me era l'inventore e il codice è stato scritto qualche anno fa da qualcun altro. Potremmo a malapena seguirlo.

Il tuo collega non ha abbastanza esperienza, ovviamente.


16
Sono curioso di guardare al "codice ben definito, molto pulito, non commentato" che è difficile da seguire. Qualsiasi codice che classificherei come tale è stato molto facile da seguire. Certamente non andrei fino a "Il tuo collega non ha abbastanza esperienza, ovviamente".
Liggy,

8
@Liggy: lo farei. È un algoritmo di ricerca, non un'applicazione line-of-business.
Paul Nathan,

9
Una volta avevo un pezzo di codice in cui dovevi popolare i campi in un oggetto colonna di database (di terze parti) nell'ordine "sbagliato" (definito dalla "logica" del processo e dai nostri standard di codifica) - fallo nell'ordine in cui normalmente userei e si schianterebbe. Nessuna quantità di lettura del codice potrebbe dirti questo, quindi in modo positivo, assolutamente, doveva avere un commento - e non era un odore, almeno non nel codice su cui avevamo il controllo (che è la linea di fondo). Una completa e totale mancanza di commenti è tanto un odore quanto i cattivi commenti.
Murph,

29
Matematica, matematica, matematica. Non tutto il codice implementa banale colla IoC e 'prezzo * quantità'. La matematica complessa non può essere magicamente spiegata da sola.
bmargulies,

4
@Liggy, il codice che implementa strutture dati complesse può essere completamente incomprensibile senza una documentazione estesa.

75

I commenti dovrebbero spiegare perché, non come.

Howi commenti di tipo vengono generalmente gestiti meglio con il refactoring. Personalmente, di solito evito i commenti a favore del refactoring.

Prima:

# convert to cents
a = x * 100

# avg cents per customer 
avg = a / n

# add to list
avgs < avg
t += 1

dopo:

total_cents = total * 100
average_per_customer = total_cents / customer_count

track_average(average_per_customer)

26
Sono d'accordo con il perché non come parte, e il tuo refactoring funziona in questo esempio, ma con un codice più complesso, nessuna quantità di variabile / funzione che rinomina / refactoring avrà perfettamente senso, e lì saranno ancora necessari commenti.
GSto

3
Un buon esempio, ma perché il sistema funziona con i centesimi anziché i dollari? Questa domanda diventa rilevante nei sistemi finanziari in cui è possibile vedere entrare in gioco la valuta frazionaria.
rjzii,

3
@Stuart il nome della funzione dovrebbe dire cosa fa.
Alb

3
@Gsto, non potrei essere più in disaccordo. Se il codice è complesso, dovrebbe essere suddiviso in metodi / funzioni più piccoli con nomi appropriati che descrivono l'azione.
CaffGeek,

1
Supponi di avere il controllo completo sulla base di codice.
LennyProgrammers,

32

Dichiaro eretico il tuo collega! Dove sono i miei stivali che bruciano l'eretico?

I commenti ossessivi sono un male e un mal di testa da manutenzione, e i commenti non sostituiscono metodi ben noti, classi, variabili, ecc. Ma a volte mettere il motivo per cui qualcosa è così può essere immensamente prezioso per il povero idiota che deve mantenere il codice in sei mesi, in particolare quando quel povero idiota finisce per essere te.

Alcuni commenti reali dal codice su cui sto lavorando:


    // If this happens, somebody's been screwing around with the database definitions and
    // has removed the restriction that a given alarm may have only one entry in the 
    // notifications table.  Bad maintenance programmer!  Bad!  No biscuit!



    // If an alert is active on our side but inactive on theirs, that might mean
    // they closed the alert.  (Or that we just haven't told them about it yet.)  The
    // logic comes later; for now, we'll just compile it in a list.



    // If we know for a fact that an alarm isn't getting through, we're going to whine pretty
    // aggressively about it until it gets fixed.


7
+1 per bei commenti. Nessuna quantità di codice può dire "Se ciò accade, qualcuno ha rovinato le definizioni del database".
DistantEcho,

9
@Niphra, beh, abbiamo potuto lanciare un SomebodyScrewedAroundWithDatabaseException...

@ Thorbjørn +1, Se il codice sa cosa non va, segnalalo. I clienti che supportano la tecnologia possono probabilmente ricaricare il loro DB ed evitare una chiamata di servizio.
Tim Williscroft,

@Tim, come possono vedere i clienti, potrebbe essere appropriato un nome più neutro.

3
Certo, ricorda: non usare mai nomi sciocchi. Il cliente li vedrà sempre.
Tim Williscroft,

29

Idealmente, il codice dovrebbe essere così ben codificato che dovrebbe essere autoesplicativo. Nel mondo reale, sappiamo che anche a volte un codice di qualità molto elevata necessita di commenti.

Quello che dovresti assolutamente evitare è la "ridondanza di commenti-codice" (commenti che non aggiungono nulla al codice):

i++; // Increment i by 1

Quindi, se esiste una buona progettazione (e mantenuta / allineata) del codice e documentazione, commentare è ancora meno utile.

Ma in alcune circostanze i commenti possono essere un buon aiuto nella leggibilità del codice:

while( foo )
{
     if( dummy )
     {
     }
     else // !dummy
     {
     }
} // end while( foo )

Non dimenticare che devi mantenere e sincronizzare anche i commenti ... commenti obsoleti o sbagliati possono essere un dolore terribile! E, come regola generale, commentare troppo può essere un sintomo di cattiva programmazione.


2
Una buona convenzione di denominazione e un codice ben strutturato ti aiuteranno a ridurre la necessità di commenti. Non dimenticare che ogni riga di commenti che aggiungi è una nuova riga da mantenere !!
Gabriel Mongeon,

81
Odio quando le persone usano quel secondo esempio nella tua domanda. } //end whilesignifica solo che l'inizio del ciclo while è così lontano, non puoi nemmeno vederlo, e non ci sono indizi che il codice che stai guardando sia in un ciclo. Il refactoring pesante dovrebbe essere seriamente preferito ai commenti su come è strutturato il codice.
Carson Myers,

4
@Carson: pur mantenendo i blocchi corti è una regola ben nota, non significa che possiamo sempre applicarla.
Wizard79,

4
@Carson: Uno dei progetti a cui lavoro ha una revisione del codice insufficiente, che ha portato a una raccolta di JSP con una complessità ciclomatica di "OMFG JUST KILL YOURSELF". Rifattorizzare le cose insanguinate rappresenta i giorni di lavoro che devono essere spesi altrove. Quei } // end whilecommenti possono essere un vero toccasana.
BlairHippo,

11
@BlairHippo: "L'odore di codice [A] è un sintomo nel codice sorgente di un programma che potrebbe indicare un problema più profondo". Naturalmente il commento è un salvavita, ma il circuito OMGWTF è il già citato "problema più profondo" e la necessità del
salvavita

26

Definire categoricamente un metodo o un processo come "odore di codice" è un "odore di zelo". Il termine sta diventando il nuovo "considerato dannoso".

Ricorda che tutte queste cose dovrebbero essere linee guida.

Molte delle altre risposte danno buoni consigli su quando i commenti sono giustificati.

Personalmente utilizzo pochissimi commenti. Spiega lo scopo di processi non ovvi e lascia l'occasionale minaccia di morte a chiunque stia prendendo in considerazione la possibilità di modificare da solo le cose che richiedono settimane di messa a punto.

Rifattorizzare tutto fino a quando un asilo non può capire che probabilmente non è un uso efficiente del tuo tempo e probabilmente non funzionerà come una versione più concisa.

I commenti non influiscono sul tempo di esecuzione, quindi l'unico problema negativo da considerare è la manutenzione.


8
Pensavo che "anti-pattern" fosse il nuovo "considerato dannoso". Un odore di codice è solo qualcosa che ha bisogno di una revisione più ravvicinata per una possibile pulizia.
Jeffrey Hantin,

1
Non sono d'accordo sul fatto che anche l'anti-pattern si qualifichi. Entrambi si abituano in questo modo con l'anti-pattern utilizzato al posto dell'olfatto quando il design è abbastanza complesso da essere ovviamente una scelta deliberata. In entrambi i casi non sono d'accordo con l'idea che esista una fonte assoluta di correttezza su queste cose.
Bill

4
+1 per "Rifattorizzare tutto fino a quando un asilo non può capire che probabilmente non è un uso efficiente del tuo tempo, e probabilmente non si esibirà come una versione più concisa".
Earlz,

23

In alcuni casi, nessuna quantità di buona denominazione, refactoring ecc. Può sostituire un commento. Guarda questo esempio del mondo reale (la lingua è Groovy):

  response.contentType="text/html"
  render '{"success":true}'

Sembra strano, no? Probabilmente un errore di copia-incolla? Grida per una correzione?

Ora lo stesso con i commenti:

  // DO NOT TOUCH THE FOLLOWING TWO LINES; the ExtJS UploadForm requires it exactly like that!!!
  response.contentType="text/html"  // must be text/html so the browser renders the response within the invisible iframe, where ExtJS can access it
  render '{"success":true}'         // ExtJS expects that, otherwise it will call the failure handler instead of the succss handler

funzione prime_extjs_uploadform () {response.contentType = 'text / html'; render '{"success": true}'; } prime_extjs_uploadform ();
DrPizza,

23

Il problema principale qui è il significato del termine "odore di codice".

Molte persone (incluso te, penso) capiscono che un odore di codice sia qualcosa di simile a un errore o almeno qualcosa che deve essere risolto. Forse lo pensi come un sinonimo di "anti-pattern".

Questo non è il significato del termine!

La metafora dell'odore del codice proviene da Wards Wiki e sottolineano:

Si noti che CodeSmell è un suggerimento che qualcosa potrebbe essere sbagliato, non una certezza. Un idioma perfettamente buono può essere considerato un CodeSmell perché è spesso usato in modo improprio o perché esiste un'alternativa più semplice che funziona nella maggior parte dei casi. Chiamare qualcosa come CodeSmell non è un attacco; è semplicemente un segno che uno sguardo più attento è garantito.

Quindi cosa significa che i commenti sono un odore di codice: significa che quando vedi un commento, dovresti metterti in pausa e pensare: "Hmmm, sento un indizio che qualcosa potrebbe essere migliorato". Forse puoi rinominare una variabile, eseguire il "metodo extract" -refactoring - o forse il commento è in realtà la soluzione migliore.

Questo è ciò che significa che i commenti sono odori di codice.

EDIT: Ho appena inciampato in questi due articoli, il che spiega meglio di me:


2
Sono sbalordito che ci sono voluti 2 mesi perché questa risposta arrivasse. Dimostra quanto sia diffuso il fraintendimento del termine.
Paul Butcher,

L'affermazione del caso generale è ancora errata. Non dici "Vedo un codice commentato. È un brutto segno".
Stuart P. Bentley,

1
@Stuart: stai esaminando due blocchi di codice, entrambi con livelli appropriati di commenti. (Questo problema non riguarda il numero appropriato di commenti, riguarda il modo in cui giudichi il codice in base al numero di commenti.) Uno non ha commenti, l'altro ha tonnellate. Quale guardi più da vicino? - I commenti indicano che il codice è complicato e sottile e quindi è più probabile che abbia dei problemi.
David Schwartz,

Questa è la risposta corretta
Vidstige,

21

Penso che la regola sia abbastanza semplice: immagina un completo sconosciuto che vede il tuo codice. Probabilmente sarai estraneo al tuo codice tra 5 anni. Cerca di ridurre al minimo lo sforzo mentale per comprendere il tuo codice per questo sconosciuto.


8
+1 Per qualsiasi dev che non ha lavorato su un unico progetto abbastanza a lungo per sperimentare questo, mi credono che sarà accadere. Ogni volta che imparo questo nel modo più duro e devo riapprendere il mio codice, non mi lascio commettere lo stesso errore due volte e commentarlo prima di passare a qualcos'altro.
Nicole,

No, dovresti immaginare uno psicopatico che sa dove vivi: saranno felici di mantenere il tuo codice?
Richard,

4
Divento regolarmente psicopatico quando vedo codice illeggibile.
LennyProgrammers,

3
5 anni? Più come 5 minuti. ;)
Alex Feinman,

11

Una buona idea per avere i commenti giusti è iniziare con la scrittura di commenti.

// This function will do something with the parameters, 
// the parameters should be good according to some rules.
myFunction(parameters)
{
    // It will do some things to get started.

    // It will do more with the stuff.

    // It will end doing things with the stuff.
}

Ciò ti consente di estrarre facilmente metodi per sbarazzarti dei commenti,
lascia che il codice dica queste cose ! Guarda come questo viene riscritto (taglia / incolla) in un modo molto bello:

// This function will do something with the parameters, 
// the parameters should be good according to some rules.
myfunction(parameters)
{
  var someThing = initializedWithSomething;

  doSomethingWith(someThing);

  doMoreWith(someThing);

  endDoingThingsWith(someThing);

  return someThing;
}

// This function will do some things to get started,
// the parameters should be good according to some rules.
doSomethingWith(parameters)
{
  parameters.manipulateInSomeWay();
  ... etc ...
}

... etc ...

Per cose che non possono essere separate, non estrarre i metodi e digitare il codice sotto i commenti.

Questo è quello che vedo come un modo utile per ridurre al minimo i commenti, è davvero inutile commentare ogni riga ... Documentare una sola riga se si tratta di un'inizializzazione di valore magico o dove ha senso.

Se i parametri sono usati troppo, allora dovrebbero essere membri privati ​​nella tua classe.


1
Questo è ciò che faccio. Se pensi di aver bisogno di commenti, posso consigliare vivamente di provare questo come sostituto.
bzlm,

10

Penso che la risposta sia la solita "Dipende". Commentare il codice solo per commentare il codice è un odore. Commentare il codice perché stai usando un oscuro algoritmo che è un ordine di grandezza più veloce salva il programmatore di manutenzione (di solito io 6 mesi dopo averlo scritto) mezza giornata di frugare nel codice per determinare cosa sta facendo.


10
// Dear me in the future. Please, resolve this problem.

o

// You think this code was written by somebody else. 
// No, it wasn't. You ([some name]) did it.

Ah, sinceri appelli al sé futuro.
Anthony Pegram,

8

I commenti sul codice non sono sicuramente un "odore di codice". Questa convinzione deriva in genere dal fatto che i commenti possono diventare obsoleti (non aggiornati) e possono essere difficili da mantenere. Tuttavia, avere buoni commenti che spiegano perché il codice sta facendo qualcosa in un certo modo può (e di solito è) importante per la manutenzione.

I buoni commenti rendono più facile capire cosa sta facendo il codice e, cosa più importante, perché lo sta facendo in un modo particolare. I commenti devono essere letti dai programmatori e devono essere chiari e precisi. Un commento che è difficile da capire o errato non è molto meglio di non aver avuto alcun commento.

L'aggiunta di commenti chiari e precisi al codice significa che non è necessario fare affidamento sulla memoria per comprendere il "cosa" e il "perché" di una sezione di codice. Questo è molto importante quando guardi quel codice in seguito, o qualcun altro deve guardare il tuo codice. Poiché i commenti diventano parte del contenuto testuale del tuo codice, dovrebbero seguire buoni principi di scrittura oltre a essere scritti chiaramente.

Per scrivere un buon commento, dovresti fare del tuo meglio per documentare lo scopo del codice (il perché, non come) e indicare il ragionamento e la logica alla base del codice nel modo più chiaro possibile. Idealmente, i commenti dovrebbero essere scritti contemporaneamente alla scrittura del codice. Se aspetti, probabilmente non tornerai indietro e li aggiungerai.

Sams Teach Yourself Visual C # 2010 in 24 Hours , pp 348-349.


1
I commenti possono diventare obsoleti, ma è vero per tutto ciò che non è verificato da un compilatore o da un unit test, come il significato di nomi di classi, funzioni e variabili.
LennyProgrammers,

@ Lenny222: Sì, i commenti possono diventare stantii ... che di solito sono indicativi di programmatori pigri. Se il commento descrive perché è stata fatta una descrizione, perché il codice utilizza un particolare algoritmo per il calcolo o descrive come funziona il codice, allora non c'è motivo per cui il commento diventi stantio diverso da qualcuno che modifica l'implementazione e non aggiorna il commento di conseguenza - che equivale ad essere pigro.
Scott Dorman,

2
Sono d'accordo. Il mio punto è che esiste il rischio che diventi stantio, sì. Ma quando ho una funzione doBar () e dopo 3 anni non "fa bar", ma "fa bar and foo tranne il mercoledì", anche il significato delle funzioni può diventare stantio. E nomi di variabili. Ma spero che nessuno lo prenda per un motivo per non dare nomi significativi a funzioni e variabili.
LennyProgrammers,

6

Se il codice è stato scritto in un modo particolare per evitare un problema presente in una libreria (sia una libreria di terze parti, sia una libreria fornita con il compilatore), ha senso commentarlo.
Ha anche senso commentare il codice che deve essere modificato nelle versioni future, o quando si utilizza una nuova versione di una libreria o, ad esempio, quando si passa da PHP4 a PHP5.


6

Anche il libro più ben scritto ha ancora probabilmente un'introduzione e titoli di capitolo. I commenti in un codice ben documentato sono ancora utili per descrivere concetti di alto livello e spiegare come è organizzato il codice.


I commenti di questo tipo forniscono piacevoli indicazioni visive in modo da non dover leggere ogni riga per trovare l'inizio della sezione che stai cercando. Come diceva mio nonno, "tutto con moderazione".
Blrfl,

4

Di menzione d'onore è l'anti-pattern:

La mia impressione è che a volte i preamplificatori di licenza FLOSS vengano spesso utilizzati al posto della documentazione dei file. GPL / BSDL crea un bel testo di riempimento e dopo raramente vedi altri blocchi di commenti.


4

Non sono d'accordo con l'idea che scrivere commenti per spiegare il codice sia negativo. Questo ignora completamente il fatto che il codice abbia dei bug. Potrebbe essere chiaro ciò che il codice fa , senza commenti. È meno probabile che sia chiaro cosa dovrebbe fare il codice . Senza commenti come fai a sapere se i risultati sono sbagliati o se vengono utilizzati in modo errato?

I commenti dovrebbero spiegare l' intento del codice, in modo che se si verifica un errore, qualcuno che legge i commenti + codice ha la possibilità di trovarlo.

In genere mi ritrovo a scrivere commenti incorporati prima di scrivere il codice. In questo modo è chiaro cosa sto provando a scrivere il codice da fare e riduce la perdita in un algoritmo senza sapere davvero cosa stai cercando di fare.


1
I test unitari aiutano molto a determinare se i risultati sono sbagliati. Se leggi del codice e pensi che faccia X quando in realtà fa Y, allora è possibile che il codice non sia scritto in un modo abbastanza leggibile. Non sono sicuro del significato dei risultati utilizzati in modo errato. Un commento non ti proteggerà da qualcuno che consuma il tuo codice in modi strani.
Adam Lear

"Se leggi qualche codice e pensi che faccia X quando in realtà lo fa Y" Non è quello che ho detto. Sto parlando di capire cosa fa il codice , ma non cosa dovrebbe fare. Diciamo che sospetti un errore fuori sede. Come fai a sapere se l'errore off-by-one non è nel codice consumante o in questo codice? I commenti spiegano l' intento del codice, che aiuta enormemente a rintracciare i bug.
Danny Tuppeny,

D'altra parte, i commenti potrebbero dirti solo cosa dovrebbe fare il codice dal momento in cui i commenti sono stati scritti. Il codice stesso potrebbe dirti cosa dovrebbe fare ora. I commenti non vengono compilati. Non puoi testare i commenti. Possono o non possono essere corretti.
Anthony Pegram,

3

I commenti inseriti perché qualcuno pensa che sia giusto avere 700 righe in un metodo sono un odore.

I commenti che ci sono perché sai che se non aggiungi un commento, qualcuno farà di nuovo lo stesso errore sono ancora un odore.

Commenti inseriti perché alcuni strumenti di analisi del codice richiedono che siano anche un odore.

Anche le persone che non inseriranno mai un commento o scriveranno neanche un piccolo aiuto per altri sviluppatori sono un odore. Sono sorpreso di quante persone non scriveranno cose, ma poi si gireranno e riconosceranno di non ricordare cosa hanno fatto 3 mesi fa. Non mi piace scrivere documenti, ma mi piace dover dire alle persone la stessa cosa ancora e ancora ancora di meno.


3

Risponderò con una mia domanda. Riesci a trovare il bug nel codice non commentato di seguito?

tl; dr: la prossima persona a mantenere il tuo codice potrebbe non essere così divina come te.

 [org 0x7c00]

 main:
  mov ah, 0x0e
  mov bx, string
  call strreverse
  call print

 stop:
  jmp $

 strreverse:
  pusha
  mov dx, bx
  mov cx, 0

 strreverse_push:
  mov al, [bx]
  cmp al, 0
  je strreverse_pop
  push ax
  add bx, 1
  add cx, 1
  jmp strreverse_push

 strreverse_pop:
  mov bx, dx

 strreverse_pop_loop:
  cmp cx, 0
  je strreverse_end
  pop ax
  mov [bx], al
  sub cx, 1
  add bx, 1
  jmp strreverse_pop_loop

 strreverse_end:
  popa
  ret

 print:
  pusha

 print_loop:
  mov al, [bx]
  cmp al, 1
  je print_end
  int 0x10
  add bx, 1
  jmp print_loop

 print_end:
  popa
  ret
 string:
  db 'Boot up', 0

 times 510 -( $ - $$ ) db 0
 dw 0xaa55

Ma al giorno d'oggi non stai usando una lingua di alto livello?
Ian

2
@Ian: il programma è un bootloader IBM-PC. Non è possibile scriverlo in qualcosa di diverso dall'assembly, perché è necessario il controllo totale di dove si trova esattamente il programma nella RAM, dove appare l'ultimo corto e alcuni degli interruzioni hardware. Scherzi a parte, procuratevi una copia del NASM. Montalo, scrivilo nel settore di avvio di un floppy o di una chiavetta USB e avvialo. Anche se probabilmente troverai che non funziona come previsto a causa del bug. Ora trova il bug ... Indipendentemente da ciò, sono sicuro che tra 20 anni, la gente chiederà la stessa cosa di Java non commentato.
Formica

Sicuramente il codice potrebbe essere scritto in C o C ++ e il binario assemblato dal codice oggetto C e da qualche strumento esterno.
Kevin Cline,

Sfortunatamente no. Dai un'occhiata a questa pagina su CodeProject: codeproject.com/KB/tips/boot-loader.aspx - "le lingue di alto livello non hanno le istruzioni necessarie". Non solo, ma hai solo 512 byte con cui giocare in un bootloader. A volte devi solo accedere direttamente all'hardware.
Formica

1
Quando codifico l'assemblaggio, farei ciò che fanno tutti gli altri: commentare ogni singola riga con ciò che sta facendo. La riga in questione avrebbe avuto il commento "controlla se la lettera è 0", poiché il codice utilizza stringhe con terminazione 0 in stile C. Con quel commento in atto, è facile vedere che il codice sta eseguendo un cmp con 1, il che significa che rimane bloccato in un ciclo infinito o stampa immondizia fino a quando non raggiunge un 1 casuale nella RAM. Potrei anche aver aggiunto un commento sul fatto che le stringhe erano 0-terminate, che non è evidente dal codice. Esistono test di unità automatizzati per la codifica degli assiemi?
Formica

2

Devi mantenere un equilibrio tra codice e commenti ... Di solito provo ad aggiungere alcuni commenti che riprendono un blocco di codice. Non perché non sarò in grado di capire il codice (bene, anche quello), ma perché posso leggere più velocemente il mio codice e individuare sezioni specifiche in cui stanno accadendo le cose importanti.

Ad ogni modo, i miei criteri personali sono "in caso di dubbi, commentare". Preferisco avere una linea ridondante rispetto a una linea completamente enigmatica che non riuscirò a capire. Posso sempre rimuovere i commenti su una revisione del codice, dopo un po '(e di solito lo faccio)

Inoltre, i commenti sono molto utili aggiungendo "avvertenze" come "Attenzione! Se il formato dell'input non è ASCII, questo codice dovrà cambiare!"


Potresti spiegare cosa intendi con "commenti che riprendono un blocco di codice"?
Marco C,

2

Leggendo questo mi viene in mente qualcosa che ho letto per la prima volta (da un elenco più lungo, conservato facendo delle fotocopie) alcuni decenni fa:

I veri programmatori non scrivono commenti: se fosse difficile da scrivere, dovrebbe essere difficile da leggere

Un odore piuttosto vecchio sembra.


2

Penso che commentare il codice abbia un inizio molto brutto nella vita. Non so di questi tempi, ma quando mi è stato insegnato per la prima volta a programmare a scuola, ho ricevuto incarichi della natura di "Scrivi un programma che stampa i numeri da uno a dieci su righe separate. Assicurati di commentare il tuo codice." Saresti segnato se non hai aggiunto commenti perché commentare il tuo codice è una buona cosa.

Ma cosa c'è da dire su un processo così banale? Quindi finisci per scrivere il classico

i++; // add one to the "i" counter.

solo per ottenere un voto decente e, se hai qualche nous, formando immediatamente un'opinione molto bassa dei commenti sul codice.

Commentare il codice non è una BUONA COSA. È ALCUNA COSA NECESSARIA, e Thomas Owens nella risposta in alto fornisce una spiegazione eccellente delle situazioni in cui è necessario. Tuttavia, queste situazioni raramente insorgono in compiti tipo compiti a casa.

In molti modi, l'aggiunta di un commento dovrebbe essere considerata una scelta di ultima istanza, quando ciò che deve essere detto non può essere detto chiaramente nelle parti attive del linguaggio di programmazione. Sebbene la denominazione degli oggetti possa diventare viziata, vari meccanismi di mancanza di feedback umani e informatici rendono facile dimenticare di conservare i commenti e di conseguenza i commenti diventano viziati molto più rapidamente del codice attivo. Per tale motivo, laddove sia possibile una scelta, la modifica del codice per renderlo più chiaro dovrebbe essere sempre preferita all'annotazione di codice non chiaro con commenti.


+1 per sottolineare che le cattive abitudini di commento iniziano con le prime lezioni di programmazione. -1 per concludere che i commenti sono solo l'ultima scelta.
AShelly,

1

Ovviamente i commenti sono un odore di codice ...

ogni programmatore sa che alla fine tutti diventiamo pazzi a causa della quantità di lavoro, debugging o semplice follia in cui ci imbattiamo.

"Fai questo!" dice il project manager.

Tu rispondi "Non si può fare".

Dicono: "Quindi troveremo qualcun altro per farlo".

Dici "OK, beh forse si può fare".

E poi trascorri il prossimo numero X di giorni .. settimane .. mesi .. cercando di capirlo. Durante tutto il processo, proverai e fallirai, e proverai e fallirai. Lo facciamo tutti. La vera risposta è che ci sono due tipi di programmatori, quelli che commentano e quelli che non lo fanno.

1) Quelli che lo stanno facendo stanno semplificando il proprio lavoro documentando per riferimento futuro, commentando le routine fallite che non hanno funzionato (l'odore non le sta cancellando dopo aver trovato quello che funziona), o spezzando il codice con un commento formattazione al spera renderlo un po 'più facile da leggere o capire. Seriamente, non posso biasimarli. Ma alla fine, si spezzano e poi hai questo: // dammit this code sucks! swear! curse! i hate it! i am going to write something here to vent my anger!!!!

2) Quelli che non fanno finta di essere un supereroe o vivono in una grotta . Hanno semplicemente un disprezzo spericolato per gli altri, loro stessi, e potrebbero fregarsene di meno del codice o del significato che potrebbe avere in un secondo momento.

Ora non fraintendetemi ... variabili e funzioni auto-documentanti possono evitarlo del tutto .. e credetemi, non potrete mai fare abbastanza pulizia del codice. Ma la semplice verità è che, fintanto che si mantiene backup, è possibile SEMPRE eliminare i commenti.


1
In risposta a 1. Il vero odore nelle routine commentate non li elimina immediatamente quando decidi che potrebbero essere vicoli ciechi e vuoi provare qualcosa di diverso --- questo è perché dovrebbero essere disponibili nel controllo della versione se decidi di rivisitarli .
Sharpie,

1

Direi che non usare alcuni commenti nel tuo codice è un odore di codice. Mentre sono d'accordo sul fatto che il codice dovrebbe essere auto-documentante il più possibile, si colpisce un certo punto in cui si vedrà un codice che non ha alcun senso indipendentemente da quanto bene sia scritto. Ho visto del codice nelle applicazioni aziendali in cui i commenti sono praticamente obbligatori perché:

  1. Devi fare qualcosa caso per caso e non c'è una buona logica per farlo.
  2. Il codice cambierà probabilmente tra un anno o due quando le leggi verranno modificate e si desidera ritrovarlo rapidamente.
  3. Qualcuno ha modificato il codice in passato perché non capiva cosa stesse facendo il codice.

Inoltre, le guide di stile aziendale potrebbero dirti di fare qualcosa in un certo modo - se dicono che potresti avere commenti che descrivono quali blocchi di codice in una funzione sta facendo, quindi includi i commenti.


1

C'è una grande differenza fondamentale tra commenti e codice: i commenti sono un modo per le persone di comunicare idee ad altre persone, mentre il codice è principalmente pensato per il computer. Ci sono molti aspetti nel "codice" che è anche solo per l'uomo, come la denominazione e il rientro. Ma i commenti sono scritti rigorosamente per gli umani, dagli umani.

Pertanto, scrivere commenti è altrettanto difficile di qualsiasi comunicazione umana scritta! Lo scrittore dovrebbe avere una chiara idea di chi sia il pubblico e di che tipo di testo avranno bisogno. Come fai a sapere chi leggerà i tuoi commenti tra dieci, venti anni? E se la persona provenisse da una cultura completamente diversa? Ecc. Spero che tutti lo capiscano.

Anche all'interno della piccola cultura omogenea in cui vivo, è così difficile comunicare idee ad altre persone. La comunicazione umana di solito fallisce, tranne per caso.


0

Devo essere d'accordo con il tuo collega. Io dico sempre che se io commento il mio codice, vuol dire che sono preoccupato che io non sarò in grado di capire il mio codice in futuro. Questo è un brutto segno.

L'unica altra ragione per cui spargo dei commenti nel codice è di chiamare qualcosa che non sembra avere senso.

Questi commenti di solito assumono la forma di qualcosa del tipo:

//xxx what the heck is this doing??

o

// removed in version 2.0, but back for 2.1, now I'm taking out again

1
Oppure, in alternativa, il commento può riflettere il fatto che il codice si rivolge a un algoritmo complesso in cui il codice diventa intrinsecamente non ovvio o perché il codice sta facendo qualcosa di strano a causa di fattori al di fuori del tuo controllo (ad esempio l'interazione con un servizio esterno).
Murph,

Verissimo. Ci sono ragioni per cui un buon codice potrebbe non essere ovvio. Il più delle volte anche se il codice perplesso è sconcertante perché è scritto in modo offuscato.
Ken,

Sembra che tu non abbia scritto codice per processori embedded in cui hai solo 32k da giocare e cose che fai un'offerta oscura. I commenti salvano la vita.
quick_now

0

Commenti sul codice che forniscono, ove applicabile, unità di argomenti e restituzioni di funzioni, campi di struttura e persino variabili locali possono essere molto utili. Ricorda il Mars Orbiter!


Molto meglio costruire le unità nei nomi delle variabili, quindi il povero programmatore non deve ricordarle. Invece di 'double length // in metri' dire 'double length_m'. La cosa migliore è usare un linguaggio più potente, quindi puoi semplicemente dire Lunghezza l; Forza f; Coppia t = l * f; stampa (t.in (Torque.newtonMeter));
Kevin Cline,

0

Ecco la mia regola empirica:

  • Scrivi il codice e archivia un breve riassunto del codice in un documento separato.
  • Lasciare il codice da solo per diversi giorni per lavorare su qualcos'altro.
  • Ritorna al codice. Se non riesci a capire immediatamente cosa dovrebbe fare, aggiungi il riepilogo al file di origine.


0

No, i commenti non sono un odore di codice, sono solo uno strumento che può essere abusato.

Esempi di buoni commenti:

// Penso che questo sia in cm. Sono necessarie ulteriori indagini!

// Questo è un modo intelligente di fare X

// L'elenco è garantito non vuoto qui


Il terzo è un brutto commento IMO. Perché no Assert(list.IsEmpty)?
CodesInChaos

@CodeInChaos IMO Assert(!list.isEmpty())non è esattamente un contratto come nel terzo commento, ma semplicemente un comportamento (es. "Lancia IllegalArgumentException se l'argomento è vuoto") che deve essere testato come qualsiasi altra logica di programma. Notare la sottile differenza con il commento, che indica quando è possibile utilizzare il metodo, ma non specifica alcun comportamento se la condizione preliminare non viene soddisfatta. Ancora meglio del commento sarebbe far rispettare i contratti in fase di compilazione. Ma questo supera la portata della mia risposta;)
Andres F.

Non dovresti essere in grado di esercitare Asserts, poiché descrivono cose che non dovrebbero mai accadere, anche se l'API pubblica riceve argomenti non validi.
CodesInChaos,

@CodeInChaos Ritiro la mia opinione. Ecco cosa dice Sunacle riguardo alle affermazioni . Sembra che tu avessi ragione. Bene, impari qualcosa ogni giorno!
Andres F.
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.