it-swarm.com.de

So lösen Sie das Problem verschachtelter Kommentare

Es scheint nicht nur in einer Sprache, dass Kommentare nicht verschachtelt werden können. Haben Sie eine gute Lösung für dieses Problem? Eine Problemumgehung in C/C++ und Java besteht darin, nur den einzeiligen Kommentar zu verwenden, aber es wird dann unmöglich, einen größeren Block auskommentieren. Ich stehe vor so etwas:

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

Also muss ich die Kommentare manuell durchgehen und bearbeiten. Können Sie uns raten, wie wir in vielen Sprachen damit umgehen sollen? Ich bin nicht sicher, aber vielleicht python hat eine Lösung dafür mit dem ''' Weg, der in der Lage sein könnte, ein # Kommentar in Python? `

24
Niklas

Die beste Lösung ist natürlich, Ihre Kommentare einfach nicht zu verschachteln. Verschachtelte Kommentare sind normalerweise ein Zeichen dafür, dass Sie falsche Kommentare verwenden. Das häufigste Beispiel ist auskommentierter Code, der Kommentare selbst enthält. Der Fix besteht darin, den Code zu entfernen, anstatt ihn auskommentieren zu müssen.

Viele Programmiersprachen haben jedoch mehr als eine Art von Kommentarsyntax, und Sie können diese Tatsache verwenden, um mindestens eine Ebene tief zu verschachteln. Zum Beispiel in Java:

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

In vielen Sprachen ist mindestens eine Art von Kommentar verschachtelbar. In C-ähnlichen Sprachen werden Zeilenkommentare in Zeilenkommentaren ignoriert:

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

Die meisten IDEs unterstützen das Kommentieren ganzer Codeblöcke mit Zeilenkommentaren in einer Aktion und behandeln diese Art von Kommentierungsstil korrekt. Das gleiche Beispiel in Python:

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

Codierungsstandards für ein bestimmtes Projekt enthalten häufig Regeln, welcher Kommentarstil wann verwendet werden soll. Eine übliche Konvention besteht darin, Blockkommentare (/* */) für die Methoden- und Klassendokumentation und Inline-Kommentare (//) für Bemerkungen innerhalb von Methodenkörpern und dergleichen zu verwenden, z.

/**
 * 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;
    }
}

Bei einem solchen Stil ist es unwahrscheinlich, dass Sie jemals /* */ - Kommentare verschachteln müssen (wenn Sie ganze Methoden oder Klassen vorübergehend deaktivieren müssen, funktioniert das Umbenennen genauso gut, wenn nicht sogar besser). und // Kommentare verschachteln , zumindest mit ein wenig Hilfe von Ihrer IDE.

Um Code zu deaktivieren, haben Sie in vielen Programmiersprachen andere Optionen. In C können Sie beispielsweise den Präprozessor nutzen:

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

In dynamischen Sprachen können Sie stattdessen häufig nur reguläre if -Anweisungen verwenden:

<?php

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

Im Gegensatz zum CPP-Beispiel erfordert diese Strategie jedoch, dass die Quelldatei als Ganzes syntaktisch gültig ist, sodass sie bei weitem nicht so flexibel ist.

Und schließlich gibt es mindestens einige Sprachen, die verschachtelte Kommentare zulassen. Falls Sie interessiert sind, hat Wikipedia eine schöne Vergleichstabelle .

46
tdammers

C und C++ haben verschachtelte Blockkommentare:

#if 0
#endif

Viele Hervorhebungseditoren verstehen dies als Kommentar und viele andere heben es zumindest als jeden anderen bedingt deaktivierten Code hervor.

In vielen anderen Sprachen müssen Sie sich auf die Unterstützung des Editors verlassen. Für Sprachen, die nur zeilenbasierte Kommentare enthalten (Perl, Python, Ruby, Shell ...), ist es ziemlich einfach, das Kommentarzeichen allen Zeilen in einem Bereich voranzustellen, sodass die meisten Editoren dies tun können. Sie können immer noch sagen, was Kommentare waren, bevor Sie den gesamten Block auskommentieren, da das Kommentarzeichen verdoppelt wird - dies ist hier einfach von Vorteil.

XML und SGML sind wahrscheinlich der größte Schmerz, die Definition der Kommentare ist einfach dumm. Die Kommentare wären trivial zu verschachteln gewesen, aber sie tun es nicht nur, es ist völlig verboten, -- Insider-Kommentar. Leider weiß ich nicht, welche Editoren das Auskommentieren in SGML/XML gut unterstützen.

19
Jan Hudec

Obwohl dies keine allgemeine Lösung ist und sicherlich nicht ideal, besteht eine Möglichkeit, dieses spezielle Problem zu lösen, darin, die Verarbeitungssprache für serverseitige Vorlagen zu verwenden, um Blockkommentare für verschachtelte Codekommentarelemente zu erstellen. Dadurch bleibt der Inhalt im Wesentlichen intakt, verhindert jedoch das Senden an den Client-Browser.

Das hilft nicht viel, wenn die Datei ansonsten gerader und reiner Inhalt ist, der keine andere serverseitige Verarbeitung erfordert. Fragen Sie in diesem Fall und im allgemeineren Fall verschachtelter Kommentare, warum Sie das tun möchten. In den meisten Fällen könnte man feststellen, dass der beste Weg, damit umzugehen, darin besteht, nicht alles zu handhaben. Mit anderen Worten, wenn Sie einen Abschnitt entfernen möchten, entfernen Sie ihn und lassen Sie die Versionskontrolle die Unterschiede berücksichtigen, wenn dieser Abschnitt als Artefakt jemals wiederbelebt werden muss.

2
JustinC

In der Programmiersprache D sind verschachtelte Kommentare integriert:

/+ This is a nested comment 
  /+ This is part of that a comment +/
  /* So is this */
+/
/+ /* This is another nested comment */ +/
/* /* This is not a nested comment */

Mit anderen Worten, /+ und +/ Kommentare verschachteln.

1

Im HTML/XML-Fall können Sie eine nicht vorhandene Verarbeitungsanweisung verwenden: siehe meine Antwort auf SO

<?ignore
  <band height="20">
    <staticText>
      <reportElement x="180" y="0" width="200" height="20"/>
      <text><![CDATA[Hello World!]]></text>
    </staticText>
  </band>
?>
</detail>
0

Swift unterstützt verschachtelte Kommentare, sodass "es scheint, dass Kommentare nicht nur in einer Sprache verschachtelt werden können" keine echte Aussage mehr ist. Wenn Sie mit der mangelnden Unterstützung für verschachtelte Kommentare in Ihrer Programmiersprache unzufrieden sind, würde ich empfehlen, Swift) auszuprobieren.

/* 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: Die Grundlagen

0
mbonness