“//…” commenti alla fine del blocco di codice dopo} - buoni o cattivi? [chiuso]


18

Ho visto spesso usare tali commenti:

function foo() {
   ...
} // foo

while (...) {
   ...
} // while

if (...) {
   ...
} // if

e talvolta anche fino a

if (condition) {
   ...
} // if (condition)

Non ho mai capito questa pratica e quindi non l'ho mai applicata. Se il tuo codice è così lungo che devi sapere qual è questo finale, }forse dovresti considerare di dividerlo in funzioni separate. Inoltre, la maggior parte degli strumenti per sviluppatori è in grado di passare alla parentesi corrispondente. E infine l'ultimo è, per me, una chiara violazione del principio DRY; se cambi la condizione dovresti ricordarti di cambiare anche il commento (altrimenti potrebbe diventare disordinato per il manutentore, o anche per te).

Quindi perché la gente lo usa? Dovremmo usarlo o è una cattiva pratica?


In PHP, utilizzo la sintassi alternativa per le strutture di controlloif(condition): ... else: ... endif;
systemovich

@Geoffrey van Wyk - davvero? Non ho mai visto nessuno usarli al di fuori dei file modello. Sono estremamente fuori standard, ma a ciascuno il loro, immagino.
Craige

4
@Craige: qualsiasi costrutto di linguaggio supportato nativamente da PHP non è "Estremamente non standard" - l'interprete PHP definisce che cosa è "standard".
Billy ONeal

Ada ha marcatori specifici per la fine della maggior parte dei costrutti: if ... then ... end if; while ... loop ... end loop; procedure Foo is ... end Foo;. Trovo che aiuti la leggibilità (ed è verificato dal compilatore, i cui commenti non lo sono).
Keith Thompson,

Risposte:


32

Direi che se il tuo codice è così lungo che non riesci a seguire facilmente le parentesi graffe, il tuo codice deve essere sottoposto a refactoring, per la maggior parte delle lingue.

Tuttavia, nei linguaggi di template (come PHP) potrebbe essere valido, perché potresti avere un grande blocco di HTML che separa l'inizio e la fine della condizione o della struttura del ciclo.


5
Punto completamente valido per PHP, se si utilizza PHP in combinazione con HTML. 1 punto per Grifondoro.

3
Anche con PHP come un linguaggio di template mischiato con HTML, puoi ancora rientrare. Inoltre, non dovresti usare le parentesi graffe quando usi PHP come linguaggio di template, ma piuttosto the while(): endwhile;e foreach(): endforeach;costruisce ecc.
Htbaa

9
Non vedo davvero perché non dovresti rifattorizzare il PHP. Probabilmente in un'altra lingua.
Tom Hawtin: affronta l'

@Htbaa: non riesco a credere di aver usato PHP per tutto questo tempo e non ne sapevo nulla. Grazie! Per quanto riguarda il rientro, preferisco mantenere il rientro HTML condizionale uguale al resto della pagina, piuttosto che in linea con il PHP che lo sta creando.
Matt Ellen,

3
@ Tom: ho riso, ma mi sento in colpa. : P

17

È un odore di codice e di solito una sbornia dallo stile di codice vecchio stile. Prima che il refactoring di IDE decenti fosse più difficile e non così comune come lo è ora, quindi i metodi erano più lunghi e questi commenti erano lì per aiutare a navigare meglio.


15

Questa è una pratica orribile resa obsoleta da molti fattori.

  • Gli IDE più moderni evidenziano la parentesi graffa corrispondente quando il cursore è su entrambi i simboli.
  • Se stai programmando in modo pulito, raramente troverai un posto in cui il tuo metodo è più di 10 righe.

Ho notato che molti programmatori Java hanno questa mentalità, e rende il codice Java davvero sporco e distoglie l'attenzione dal codice e verso i commenti.

Consiglio vivamente di non usarlo.


4
Ho un collega (sviluppatore Java) che lo fa. Tranne invece di // for e // se usa // rof e // fi. Mi fa impazzire e lo fa ovunque.
Jay,

Sì, ne avevo uno che insisteva su questo. AAAAAGHHHHH.
Rig

2
Questo in realtà non ha nulla a che fare con i programmatori Java o Java, e non è cosa comune o di fatto standard da fare durante la programmazione in Java.
Jesper,

1
+1.000 per "è una pratica orribile".
scunliffe,

6

Il codice viene letto 10 volte di più di quanto sia scritto.

Se facilita la lettura, fallo.

Suggerirei anche a chiunque lo faccia di cercare altri modi per rendere le cose più facili da leggere. Le tecniche di refactoring, parentesi su linee diverse, ecc. Che altre persone hanno menzionato sono tutte buone. Dividere le cose in diverse funzioni, metodi o classi in modo che il codice sia auto-commento è anche un bene. Ci sono anche modi per eliminare la maggior parte degli "if" e mettere i loop "for" in luoghi ovvi, eliminando così la necessità di tutto ciò.

Ma a volte le persone stanno imparando. Se questo è qualcosa che stanno facendo, sta davvero rendendo il codice più leggibile, incoraggiandolo e quindi incoraggiando anche altre pratiche. Le persone che stanno imparando meritano e trarranno beneficio dall'incoraggiamento, indipendentemente da come iniziano. Dire "Questo è male" non è utile come dire "Quest'altra cosa è migliore".


6
Questo è male Anche i libri di testo per principianti non fanno questa atrocità. "Il codice viene letto 10 volte di più di quanto sia scritto" ... motivo in più per non perdere tempo con questo codice.
Thomas Eding,

@trinithis Cosa succede se si dispone di un'istruzione switch a 20 casi? A volte è necessario supportare 20 diverse opzioni ed è meglio riunirle in un unico posto piuttosto che "refactoring" in un sistema decisionale multilivello.
quant_dev

credo che questa sia una pratica dei programmatori che sottovalutano i colleghi :) che gli altri non sono abbastanza intelligenti da leggere il codice, a meno che. genialmente sono contrario a questa pratica, ma va bene se qualcuno lo fa perché c'è una giungla di} s che la rende difficilmente leggibile. non lo faccio comunque!
WinW

1
@trinithis Non si tratta di fare male o no, si tratta di modi efficaci per aiutare le persone a migliorare in modo che crescano. Essere efficaci> avere ragione. È anche una cosa perfettamente sensata se, per esempio, stai rifattorizzando il codice legacy che è ancora più un casino. A volte le cose brutte possono fare passi intermedi migliori e portare a qualcosa di ancora meglio di così.
Lunivore,

1
@trinithis Siamo spiacenti, non riesco a capire cosa intendi quando è tutto su una linea del genere. Penso di aver menzionato che ci sono anche altri modi di refactoring del codice che gli sviluppatori potrebbero imparare.
Lunivore,

4

Ho una grande base di codice (C ++) piena di questo genere di cose:

int Class::AccessorMethod(void)
{
    return privateValue;
}//end AccessorMethod

Per qualcosa di così piccolo, direi che va oltre "odore di codice" in "puzza di codice". Soprattutto in un IDE dove posso abbinare la parentesi graffa di chiusura con una sequenza di tasti per trovare la parentesi graffa di apertura. Dato un metodo più lungo, prenderò ancora la parentesi graffa sul commento del terminale. Tali commenti mi distraggono e tendo a pensarli come rumore.


Ehm, immagino di non avere un po 'di formattazione su questo sito; ogni parentesi graffa dovrebbe essere sulla propria linea, così come il corpo del metodo.
PSU

In C ++, però, aprirò spesso uno spazio dei nomi anonimo nella parte superiore per elementi di implementazione nascosti. Poi ad un certo punto chiudo questa parentesi graffa ed è utile sapere cosa significa qui la parentesi graffa.
CashCow

4

In C ++ ci sono due holdovers in cui questo è ancora utile e il consiglio di "dividere il tuo codice" non è necessariamente valido:

  1. Per gli spazi dei nomi. Uno spazio dei nomi può comprendere un intero file e quell'ultima parentesi può talvolta allontanare le persone, quindi è utile aggiungere un commento per indicare che la parentesi è la chiusura di uno spazio dei nomi. Per il particolare stile di codifica nella mia azienda, questo è importante perché non indentiamo gli spazi dei nomi in quanto si è deciso che tale rientro avrebbe sprecato spazio in un file.

  2. Per coppie #ifdef / #endif. A volte c'è un sacco di codice lì dentro per la compilazione condizionale, può diventare sgradevole con l'annidamento e l'editor che usiamo spesso in modo pesantemente "utile" elimina il rientro, quindi i commenti sono utili durante una rapida panoramica.


+1 per il commento dello spazio dei nomi e le ragioni. È l'unica volta che lo faccio e per lo stesso motivo
JohnB,

+ istruzioni switch lunghe.
quant_dev,

1

Per me il codice deve essere confuso per aggiungere un commento come quello che hai specificato.

Se dice semplicemente // Dichiarazione IF. Quindi devi chiederti perché è lì in primo luogo.


Sono d'accordo, sembra una //endif
frase

1

L'alternativa a vedere cosa sta chiudendo il tuo tutore è avere quello di apertura sulla stessa colonna di quello vicino. Lo trovo molto più chiaro e leggibile.

Il commento è utile quando normalmente sarebbe difficile da rintracciare perché l'apertura è avvenuta molto tempo fa. Ciò dovrebbe avvenire normalmente solo per uno spazio dei nomi (in particolare quello anonimo in C ++, utilizzato per i dettagli di implementazione nell'unità di compilazione). Nella maggior parte degli altri casi dovrebbe essere ovvio cosa stai chiudendo.


1

Questo è in gran parte un problema dai vecchi tempi di lavoro nelle finestre dei terminali 80x24 caratteri, soprattutto se si utilizzava un editor con finestre come EVE. Anche ora, faccio la maggior parte del mio lavoro in una sessione terminale usando vim, e posso dividere la sessione in tre o quattro finestre secondarie, quindi posso davvero vedere solo poche righe alla volta.

Detto questo, non mi sono mai veramente riscaldato alla convention, anche se mi avrebbe salvato la pancetta in più di un'occasione. Lo vedo solo come rumore. Se i tuoi loop o condizionali stanno diventando così grandi, sì, potresti voler esaminare il refactoring.


0

in pratica dai tutti i motivi validi per non usarlo. Ogni programmatore decente dovrebbe applicarli. Allora, perché non la gente lo usa? Perché stanno sbagliando e non sanno meglio.


per favore, spiega il downvote per favore. Non ho semplicemente inventato questa risposta, nasce da un'esperienza di vita reale: il mio collega che è seduto un paio di piedi accanto a me ha programmato per oltre 10 orecchie in quel modo e non aveva idea del perché questo fosse sbagliato fino a quando non gli ho spiegato .
stijn

Forse è stato usato in alcuni libri di testo, quindi un gruppo di persone è uscito dal college usandolo? Potrebbe avere un posto in un testo introduttivo. Anche ragionevolmente valido in un preprocessore, specialmente in # ifdef / endif include guards
Martin Beckett
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.