Come risolvere il problema dei commenti annidati

23

Appare non solo in una lingua che i commenti non possono essere annidati. Hai una buona soluzione per questo problema? Una soluzione alternativa in C / C ++ e Java è utilizzare solo il commento a riga singola, ma diventa impossibile quindi commentare un blocco più grande. Sto affrontando qualcosa del genere:

</li><!--
                <li><!-- Save -->

Quindi devo passare manualmente e modificare i commenti. Puoi consigliare come dovremmo gestirlo in molte lingue? Non sono sicuro, ma forse Python ha una soluzione per questo con il modo ''' che potrebbe essere in grado di includere un commento # in python? '

    
posta Niklas Rosencrantz 13.06.2013 - 08:32
fonte

5 risposte

44

La soluzione migliore è, ovviamente, solo non annidare i tuoi commenti. I commenti annidati sono di solito un segno che stai usando i commenti errati. L'esempio più comune è il codice commentato che contiene i commenti stessi e la soluzione è rimuovere il codice invece di commentarlo.

Detto questo, molti linguaggi di programmazione hanno più di un tipo di sintassi dei commenti, e puoi usare questo fatto per nidificare almeno un livello di profondità. Ad esempio, in Java:

/* This is commented out!
Foo.bar.baz();
// And now for something completely different...
Quux.runWith(theMoney);
*/

Inoltre, in molte lingue, almeno un tipo di commento è di tipo nestable; nei linguaggi di tipo C, i commenti di riga all'interno dei commenti di riga vengono ignorati:

// some_commented_out(code);
// // This is a comment inside the comment!
// // Still inside the nested comment.
// some_more_code_in(outer_comment);

La maggior parte degli IDE supporta commenti interi blocchi di codice con commenti di riga in un'azione, e gestiscono correttamente questo tipo di stile di commento. Lo stesso esempio in Python:

# some_commented_out(code)
# # This is a comment inside the comment!
# # Still inside the nested comment.
# some_more_code_in(outer_comment)

Spesso, gli standard di codifica per un particolare progetto hanno regole su quale stile di commento usare quando; una convenzione comune consiste nell'utilizzare i commenti di blocco ( /* */ ) per la documentazione di metodi e classi e i commenti in linea ( // ) per le osservazioni all'interno dei corpi del metodo e simili, ad esempio:

/**
 * Helper class to store Foo objects inside a bar.
 */
public class Foobar {
    /**
     * Stores a Foo in this Foobar's bar, unless the bar already contains
     * an equivalent Foo.
     * Returns the number of Foos added (always 0 or 1).
     */
    public int storeFoo(Foo foo) {
        // Don't add a foo we already have!
        if (this.bar.contains(foo)) {
            return 0;
        }
        // OK, we don't have this foo yet, so we'll add it.
        this.bar.append(foo);
        return 1;
    }
}

Con uno stile simile, è improbabile che tu abbia mai bisogno di annidare% commenti di/* */ (se devi disabilitare temporaneamente interi metodi o classi, rinominarli funzionano altrettanto bene, se non meglio); e // commenti fanno annidano, almeno con un piccolo aiuto dal tuo IDE.

Infine, per disabilitare il codice, hai altre opzioni in molti linguaggi di programmazione; ad esempio, in C, puoi sfruttare il preprocessore:

this_is(activated);
#if 0
this_is(!activated);
/* Comments inside this block don't really nest, they are simply removed
   along with the rest of the block! */
#endif

Nei linguaggi dinamici, puoi spesso utilizzare solo% di dichiarazioni di if :

<?php

if (0) {
   // This should never run... 
   some_stuff_that_should_never_run();
}

Tuttavia, a differenza dell'esempio CPP, questa strategia richiede che il file di origine nel suo complesso sia sintatticamente valido, quindi non è di gran lunga flessibile.

E infine, ci sono almeno alcune lingue che consentono commenti annidati. Se sei interessato, wikipedia ha una bella tabella di confronto .

    
risposta data 13.06.2013 - 09:25
fonte
18

C e C ++ contiene commenti a blocchi nidificati:

#if 0
#endif

Molti editor di evidenziazione lo capiscono come un commento e molti altri lo evidenziano almeno come qualsiasi altro codice disabilitato condizionalmente.

In molte altre lingue devi fare affidamento sul supporto dell'editor. Per le lingue che hanno solo commenti lineari (perl, python, ruby, shell ...) è piuttosto semplice anteporre il carattere del commento a tutte le righe di un intervallo, quindi la maggior parte degli editori può farlo. Puoi ancora dire quali sono stati i commenti prima di commentare l'intero blocco perché il carattere del commento è raddoppiato - farlo semplicemente è un vantaggio qui.

XML e SGML sono probabilmente il più grande dolore, la sua definizione di commenti è semplicemente stupida. I commenti sarebbero stati banali da annidare, ma non solo non lo fanno, è completamente proibito avere -- all'interno del commento. Sfortunatamente non so quali editor abbiano un buon supporto per commentare in SGML / XML.

    
risposta data 13.06.2013 - 09:25
fonte
2

Sebbene non sia una soluzione generale, e certamente non ideale, un modo per affrontare questo particolare problema è usare il linguaggio di elaborazione dei template lato server per fare commenti di blocco per gli elementi di commento di codice annidati. Ciò lascia il contenuto sostanzialmente intatto, ma impedisce di inviarlo al browser client.

Questo non aiuta molto se il file è in altro modo diretto e di puro contenuto che non richiede altre elaborazioni sul lato server. In tal caso e nel caso più generale di commenti annidati, chiedi perché vuoi farlo. Nella maggior parte di questi casi, si potrebbe scoprire che il modo migliore per gestirlo è non gestirlo tutto. In altre parole, se si desidera eliminare una sezione, eliminarla e lasciare che il controllo della versione gestisca la memorizzazione delle differenze se questa sezione come artefatto ha bisogno di essere riesumata.

    
risposta data 13.06.2013 - 09:31
fonte
0

Nel caso HTML / XML puoi usare un'istruzione di elaborazione non esistente: vedi la mia risposta su SO

<?ignore
  <band height="20">
    <staticText>
      <reportElement x="180" y="0" width="200" height="20"/>
      <text><![CDATA[Hello World!]]></text>
    </staticText>
  </band>
?>
</detail>
    
risposta data 26.08.2016 - 21:38
fonte
0

Swift supporta i commenti nidificati in modo che "non sia solo una lingua in cui i commenti non possono essere annidati" non è più una vera affermazione. Se non sei soddisfatto della mancanza di supporto per i commenti nidificati nel tuo linguaggio di programmazione, ti suggerisco di provare Swift.

/* This is the start of the first multiline comment.
 /* This is the second, nested multiline comment. */
 This is the end of the first multiline comment. */

Swift Programming Language: The Basics

    
risposta data 11.11.2016 - 21:38
fonte

Leggi altre domande sui tag