Esiste un metodo per differenziare i commenti informativi dal codice commentato?


38

Durante tutto il corso della programmazione, finirai con alcuni commenti che spiegano il codice e alcuni commenti che rimuovono il codice:

// A concise description 
const a = Boolean(obj);
//b = false;

Esiste un buon metodo per analizzare rapidamente quale è quale?

Ho giocato con l'uso di 3 /e /** */per commenti descrittivi.

Ho anche usato un plug-in VSCode per evidenziare //TODO:e//FIXME:


2
Come una nota, ///e /** ... */commenti sono utilizzati anche da alcuni generatori di documentazione, come Doxygen o JSDoc. Se li usi o strumenti simili, potresti non essere in grado di utilizzare quel tipo di commento per commenti descrittivi che non sono destinati a far parte della documentazione.
Justin Time 2 Ripristina Monica l'

1
In javascript la maggior parte delle righe di codice terminerà probabilmente con un punto e virgola. A meno che i tuoi commenti non lo facciano, questo sembra piuttosto semplice e puoi anche scrivere uno script per verificarlo facilmente;
Artemis Fowl

Risposte:


189

Esiste una soluzione molto semplice: rimuovere il codice commentato.

In realtà, ci sono solo due buoni motivi per commentare il codice: per testare qualcosa / fare una correzione, o per salvare il codice che potresti usare in seguito. Se stai testando o risolvendo qualcosa, rimuovi il codice commentato non appena hai finito con il test o la correzione. Se stai salvando il codice che potresti utilizzare in un secondo momento, rendilo un codice di prima classe e mettilo da qualche parte come una libreria in cui può essere utilizzato.


108
Inoltre, se il codice è stato archiviato: rimuovilo. Se mai ne avrai bisogno, il controllo del codice sorgente ti
coprirà

38
Quando il codice viene rimosso, nessuno si accorge che sia mai esistito. Ciò rende più difficile il recupero. È utile lasciare un codice commentato, soprattutto se sembra probabile che verrà utilizzato in futuro.
usr

76
@usr: quando il codice viene rimosso nessuno si accorge che è mai esistito - e per la mia esperienza, nel 99% di tutti i casi del mondo reale è la cosa giusta. Nell'1%, potrebbe esserci un certo valore nelle righe in uscita, tuttavia, se il codice commentato rimane attivo per diverse settimane o mesi (o più), è probabile che non si compili più a causa dei refactoring dell'attivo righe di codice. L'argomento "valore fondamentale per usi futuri" è spesso usato come una scusa sbagliata da parte di persone che hanno un problema emotivo di strappare le cose dalla base di codice per cui avevano investito alcune ore di brainwork.
Doc Brown,

21
Non commetto mai codice commentato senza ulteriori commenti esplicativi. Ci sono rare situazioni in cui potresti voler riavere il codice a breve termine, ma ognuna di queste è eccezionale e richiede una spiegazione per i futuri sviluppatori (o per il futuro tu). Il 90% dei miei commenti è "Rimosso perché sembra essere inutilizzato. Elimina dopo il 2021 novembre se non ci sono problemi"
James Beninger

31
Il mio collega una volta ha messo "C'era del codice qui che faceva X ma l'ho rimosso" quando per il momento abbiamo rimosso alcune funzionalità. Funzionava davvero bene; sapevi che era nella cronologia dei sorgenti per quel file, ma non ti dava fastidio.
Erik,

45

Aggiungendo alla risposta eccellente di @ RobertHarvey credo che ci sia solo una ragione legittima che abbia mai incontrato per salvare il codice commentato sul controllo del codice sorgente, anche temporaneamente: in caso di codice di sostituzione non ovvio che non dovrebbe o non può essere usato in questo momento per qualche motivo . Anche allora la maggior parte del commento dovrebbe essere la spiegazione, non il codice di sostituzione. Potrebbe trattarsi di un bug o di una caratteristica del linguaggio che non è ancora considerata stabile. Potrebbe assomigliare a questo:

# TODO: Replace with `foo = frobnicate(bar)` once <link.to/bug> is fixed
foo = [some complex workaround]

In questo caso, il lavoro è già stato fatto, ma non puoi ancora sfruttarlo, quindi eliminarlo significa che qualcuno dovrebbe riscoprirlo in un secondo momento. Lo stesso vale per soluzioni non ottimali che possono sembrare superiori o compromessi consapevoli rispetto a soluzioni simili .

Attenzione: non sporcare il codice con soluzioni alternative. Ogni attività può essere eseguita in infiniti modi diversi e non è conveniente esplorare questo spazio a lungo per ogni cambiamento. Le revisioni del codice possono essere un buon posto per scoprire tali commenti mancanti, quando il collega suggerisce un miglioramento che hai già scoperto essere non ottimale.


2
Il rovescio della medaglia è che a volte è necessario spiegare il motivo per cui non si sta utilizzando frobnicate(bar), in modo che nessuno venga avanti e provare a "correggere" il codice "non elegante". Quindi mostri loro che sai che in un mondo perfetto, la frobnicatefunzione sarebbe la strada da percorrere, ma sai per esperienza dolorosa che non funziona correttamente. Non ci si può aspettare che la terza parte lo consideri un bug, tanto meno vale la pena correggerlo; devi ancora lasciare un commento ai futuri programmatori (incluso te stesso) sul perché non hai adottato l'approccio ovvio.
Monty Harder

3
Una situazione correlata è che potrebbero esserci due modi di fare qualcosa, uno dei quali elaborerà dati validi molto più velocemente dell'altro e uno offrirà una diagnostica più utile se, per qualsiasi motivo, riceve dati non validi. Se il programma fa parte di un processo che dovrebbe solo fornire dati che sono "garantiti" per essere validi, ma qualcosa nel processo non funziona correttamente, avendo a disposizione una versione più lenta, ma offre una migliore diagnostica, può farlo molto più facile determinare cosa non va.
supercat

20

Hmm, ho letto questa domanda in modo leggermente diverso da Robert che afferma correttamente che il codice commentato dovrebbe essere rimosso.

Se, tuttavia, stai cercando una convenzione per contrassegnare il codice per la successiva rimozione, un mio vecchio preferito è:

//b = false; //TODO: remove

Alcuni //TODO:commenti della bandiera di IDE o possono essere insegnati a. In caso contrario, di solito è una stringa ricercabile. È meglio seguire qualsiasi convenzione stabilita dal tuo negozio perché ciò può essere fatto in diversi modi. Ogni base di codice dovrebbe farlo in un modo. Mantiene la ricerca.

analizzare rapidamente quale è quale?

Senza quel segno, il modo automatico per farlo è con il compilatore. Se la rimozione del commento produce codice che viene compilato, deve essere stato un codice commentato. Scrivere un plugin IDE che controlla che non sarebbe difficile. Ma lascerà dietro di sé il codice commentato con errori.

Ecco perché è meglio contrassegnare semplicemente il codice commentato come codice nel momento in cui lo commentate. Questo ti consente di lavorare in modo non distruttivo mentre decidi se lo vuoi davvero andare. Dato che tutti siamo interrotti e siamo in qualche modo smemorati, non stupitevi se alcune linee vengono registrate mentre si trovano in quello stato. Se lo fanno è bello che siano almeno chiaramente contrassegnati e ricercabili. Le macro della tastiera mi hanno aiutato con questo in passato. È difficile essere interrotti nel mezzo di questo se riesci a farlo con un solo tasto.

Puoi prenderlo fino a sancire il segno nei tuoi test di integrazione continua. Oops, sto provando a fare di nuovo il check-in con TODO eccezionali.


Invece di vedere se i commenti vengono compilati per etichettarli come codice, è possibile eseguire commenti attraverso un elaboratore di linguaggio naturale ed etichettare quelli che analizzano come una frase o una frase sostantivo nella lingua parlata dal proprio team.
TheHansinator

3
@TheHansinator che suona bene, ma la mia esperienza con i miei telefoni cellulari con la relazione automatica corretta con il mio gergo programmatore mi rende prudente.
candied_orange

Immagino che la PNL utilizzata per analizzare i commenti del codice sarebbe molto meglio della PNL che alimenta la correzione automatica, semplicemente perché il computer ha l'intera frase con cui lavorare e non sta cercando di correggere gli errori di ortografia. Per non parlare del fatto che anche il falso negativo è meglio qui - fintanto che un essere umano è in grado di rivedere il commento prima della cancellazione, può semplicemente riscrivere il commento, invece di non essere avvisato di inutili inghiottiti.
TheHansinator

3
wrt parsing: double buffer (flip on)-> prototipo C o inglese ultra-conciso? non posso dire senza contesto, non un intero costrutto corretto in entrambe le lingue. Alcuni falsi positivi e negativi sono inevitabili, quando i commenti per loro natura non limitano la forma del loro contenuto in nessuna direzione.
Leushenko,

8

Uso le direttive del preprocessore per rimuovere il codice, non i commenti:

//comment
active_code();
#if FALSE
inactive_code();
#endif

Questo rende molto facile la ricerca e il mio evidenziatore di sintassi lo considera come un commento. Posso persino comprimerlo in una sola riga:#if FALSE(...)

Puoi espandere l'idea per avere diverse opzioni:

#if OPTION == 0
code_for_option_0();
#elif OPTION == 1
code_for_option_1();
#else
code_for_all_other_options();
#endif

E controllo errori in fase di compilazione:

#if FOO >= 5
#error FOO should be less than 5!
#endif

Naturalmente, non vuoi esagerare con questo, o diventa difficile dire cosa viene effettivamente compilato e cosa no. Ma hai l'idea, ed è lo stesso problema del codice commentato ... purché lo usi solo staticamente. Se le tue condizioni sono dinamiche, è peggio.


Per determinare quale sia quale in una base di codice esistente che non ha considerato affatto questo problema, non penso che ci sia una soluzione universale. Dovrai trovare tu stesso i pattern e probabilmente codificare una regex per trovarli.


Per cosa al mondo sarebbe utile? Devi compilare più versioni?
Tvde1

@ Tvde1 Questa è una possibilità e un potenziale incubo se non la gestisci davvero bene. Ma l'alternativa è probabilmente peggio. Se hai più copie dello stesso codice, una per ogni variante su un tema comune, devi mantenerle separatamente e sincronizzarle.
AaronD

Esistono diversi modi per farlo, ma tutti presentano alcune variazioni del problema di configurazione complessa o del problema di copia indipendente: sei sicuro che un bugfix sia arrivato a tutte le copie indipendenti? Cosa succede se no, e viene aggiunta un'altra funzione, che viene poi interrotta dal bugfix che era noto prima della funzione ma non portato fino ad ora?
AaronD

3
Che funziona solo se si dispone di una fase di pre-processing come C. La questione è di circa javascript. Potresti fare un po 'di pre-elaborazione, ma aumenterà le capacità del sistema di build ed è anche non standard. Se non si dispone di un sistema di compilazione o il sistema di compilazione non supporta affatto l'analisi e l'esecuzione del codice, non sarà possibile implementare questa soluzione. Infine, non affronta nemmeno la domanda: il codice commentato non è strettamente equivalente al codice attivato in modo condizionale. Potrebbe essere un residuo che non dovrebbe essere abilitato.
VLAZ

L'attivazione condizionale è solo un'estensione della risposta e non la risposta stessa. Altrimenti lo modificherei per includere i commenti che lo estendono ulteriormente.
AaronD

4

Concordo con la risposta affermando che il vecchio codice dovrebbe essere rimosso piuttosto che commentato ove possibile, tuttavia ho osservato una convenzione per quelle poche occasioni in cui è necessario un codice commentato.

(La mia base è C # ma questo può essere applicato a qualsiasi linguaggio di sintassi C, ad esempio java)

// An explanatory comment has a space between the comment marker and the content.

// The following lines are commented out code so do not have the space (except where indented).
//var a = something();
//if(a==2) {
//   doSomethingElse();
//}

2
Questo dipende totalmente dallo stile: quando commento il codice, generalmente aggiungo la //prima colonna e poiché praticamente tutto il codice è rientrato, il risultato è praticamente sempre che il commento inizia con alcune schede. I commenti normali non ottengono uno spazio iniziale da me, a meno che non ci siano già altri commenti con uno spazio iniziale nelle vicinanze. Quindi, il tuo metodo fallirebbe in modo abissale sui commenti che ho prodotto e qualsiasi metodo progettato per riconoscere i miei schemi di commento fallirebbe in modo abissale sul tuo.
cmaster

@cmaster Ah, vedo, penso di aver frainteso la domanda. Ho fornito un modo semplice per formattare i commenti in modo che possano essere facilmente analizzati per tipo, che non è quello che è stato richiesto.
IanF1

2

Sto ancora interpretando la domanda in modo diverso, pensando che tu voglia trovare un codice commentato.

Il codice in stile C deve contenere punti e virgola, mentre è improbabile che nel commento siano presenti punti e virgola. Quindi per il codice commentato a riga singola è possibile utilizzare questa espressione regolare:

\s*\/\/[\s\S]*;

Per il codice commentato su più righe potrebbe essere

\/\*[^\;]*;[^\;]*\*\/

Nota Visual Studio è un po 'peculiare delle interruzioni di riga nelle espressioni regolari, non contano come spazi bianchi, è necessario specificare un esplicito \ n.


2

Se usi un editor con un compilatore in esecuzione in background (come Xcode e Clang), puoi semplicemente provare a compilare il testo del commento. Ad esempio "una descrizione concisa" fornisce errori, "b = false;" no. È quindi possibile utilizzare l'evidenziazione della sintassi diversa.

Un metodo più semplice sarebbe un plug-in IDE che utilizza alcune euristiche, come più parole di fila diverse dalle parole chiave puntano a commenti, abbinano il punto tra parentesi graffe al codice ecc.


1

Altre risposte hanno coperto variazioni sul tema "Non commentare il codice". Ma a volte lo vuoi ancora in giro per riferimento.

Se hai davvero bisogno del codice per rimanere in giro, una soluzione migliore è circondare il codice con "#if 0 ... #endif", idealmente con un commento per dire il perché. Questa è la strategia raccomandata da vari standard di codifica, incluso MISRA.


-3

Semplice, almeno per me - e in C / C ++. I commenti racchiusi in / * * / sono informativi. Il codice di prova che viene temporaneamente rimosso viene commentato con il comando //.

E c'è una buona ragione per lasciare il codice di prova nel file ma commentato, almeno nel tipo di lavoro che faccio. Prima o poi qualcuno vorrà apportare una modifica, che avrà bisogno di quel codice. Uncommenting un blocco richiede un comando dell'editor, così come commentare nuovamente dove hai finito.


C'è anche #ifdef __DEBUG ... #endif, o qualsiasi definizione personalizzata che si desidera utilizzare. __DEBUGè carino, perché spesso devi solo cambiare la configurazione del progetto per ottenerlo. Ma la maggior parte degli IDE ti consente di definire anche le tue configurazioni, che possono darti qualsiasi cosa in quel punto.
AaronD

Cosa intendi con "codice di prova"? Test unitari? Questi non dovrebbero essere commentati affatto, ma tenuti nella suite di test ed eseguiti il ​​più spesso possibile, indipendentemente dal fatto che qualcuno pensi che sia necessario. Certo, è facile ri-commentare un pezzo di codice, ma è ancora più semplice non fare nulla e avere la suite di test già in atto per farlo ...
leftaroundabout

1
Argh, non farlo. Commentare il codice "per testare qualcosa" funzionerà perfettamente 99 su 100 volte ... e nel singolo caso ti dimenticherai di rimuoverlo (se non è più necessario) o - peggio ancora - dimenticherai di decommentarlo ( se è necessario) e le cose potrebbero diventare brutte.
CharonX

@leftaroundabout: No, intendo cose come le istruzioni printf inserite per verificare i valori.
jamesqf

@jamesqf non dovresti mai aver bisogno di quel genere di cose, ecco a cosa serve un debugger. Ma anche se usi printf/ couto simili per ottenere correttamente il codice appena scritto (che ammetto di aver fatto in passato), non è molto efficace lasciarli lì. Se qualcuno vuole apportare modifiche e sa di quali variabili hanno bisogno informazioni, è facile e veloce scrivere di printfnuovo, mentre se quel dev non sa cosa è necessario e annulla tutte le printfdichiarazioni, allora l'enorme striscia di testo in il terminale probabilmente non li aiuterà neanche.
leftaroundabout
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.