web-dev-qa-db-ja.com

ネストされたコメントの問題を解決する方法

コメントをネストできないのは、1つの言語だけではないようです。この問題の良い解決策はありますか? C/C++およびJava=の1つの回避策は、単一行のコメントのみを使用することですが、大きなブロックをコメント化することは不可能になります。私はこのようなことに直面しています:

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

そのため、コメントを手動で確認して編集する必要があります。多くの言語で、これをどのように処理すべきかアドバイスできますか?よくわかりませんが、pythonには'''の方法でこれに対する解決策があり、Pythonに#コメントを含めることができますか? `

24
Niklas

最善の解決策は、コメントをネストしないことです。ネストされたコメントは通常、間違ったコメントを使用していることを示しています。最も一般的な例は、コメント自体を含むコメントアウトされたコードであり、修正は、コメント化する代わりにコードを削除することです。

とは言っても、多くのプログラミング言語には複数のタイプのコメント構文があり、この事実を使用して少なくとも1レベルの深さをネストできます。たとえば、Javaの場合:

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

また、多くの言語では、少なくとも1種類のコメントがネスト可能です。 Cのような言語では、行コメント内の行コメントは無視されます。

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

ほとんどのIDEは、1回のアクションで行コメントを含むコードブロック全体へのコメントをサポートしており、この種のコメントスタイルを正しく処理します。 Pythonでの同じ例:

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

多くの場合、特定のプロジェクトのコーディング標準には、いつ使用するコメントスタイルに関するルールがあります。一般的な規則は、ブロックコメント(/* */)メソッドとクラスのドキュメント、およびインラインコメント(//)メソッド本体内の注釈など。例:

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

このようなスタイルでは、ネストする必要があることはほとんどありません/* */コメント(メソッドまたはクラス全体を一時的に無効にする必要がある場合、名前を変更することは、それが上手くいかなくても同じようにうまく機能します);および//コメントdoネスト、少なくともIDEからの少しの助けがあります。

最後に、コードを無効にするには、多くのプログラミング言語で他のオプションがあります。たとえば、Cでは、プリプロセッサを利用できます。

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

動的言語では、代わりに通常のifステートメントを使用することができます。

<?php

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

ただし、CPPの例とは異なり、この戦略では、ソースファイル全体が構文的に有効である必要があるため、柔軟性がはるかに低くなります。

そして最後に、少なくともいくつかの言語がネストされたコメントを可能にします。ご参考までに、ウィキペディアには ニース比較チャート があります。

46
tdammers

CおよびC++には、ネストされたブロックコメントがあります。

#if 0
#endif

多くの強調表示編集者はこれをコメントとして理解し、他の多くの編集者は少なくとも他の条件付き無効コードとして強調表示します。

他の多くの言語では、エディターのサポートに依存する必要があります。行ベースのコメントしか持たない言語(Perl、python、Ruby、Shell ...)の場合、範囲内のすべての行にコメント文字を追加するのはかなり簡単なので、ほとんどのエディターはこれを行うことができます。コメント文字が2倍になるため、ブロック全体をコメントアウトする前に、コメントが何であったかを判別できます。これを行うことは、ここでは単に利点です。

XMLとSGMLはおそらく最大の問題です。コメントの定義はばかげています。コメントをネストするのは簡単なことでしたが、そうではないだけでなく、--内部コメント。残念ながら、どのエディターがSGML/XMLでコメントアウトするのに優れたサポートを提供しているかはわかりません。

19
Jan Hudec

一般的な解決策ではなく、確かに理想的ではありませんが、この特定の問題に取り組む1つの方法は、サーバー側のテンプレート処理言語を使用して、ネストされたコードコメント要素のブロックコメントを行うことです。これにより、コンテンツは基本的にそのまま残りますが、コンテンツをクライアントのブラウザーに送信できなくなります。

ファイルが他のサーバー側の処理を必要としない、まっすぐで純粋なコンテンツである場合、これはあまり役に立ちません。その場合、およびネストされたコメントのより一般的なケースでは、なぜそれを行うのかを尋ねます。それらのほとんどの場合、それを処理する最善の方法は、すべてを処理しないことです。つまり、セクションを削除したい場合は、セクションを削除し、そのセクションをアーティファクトとして復活させる必要がある場合は、バージョン管理に違いを記憶させます。

2
JustinC

Dプログラミング言語には、ネストされたコメントが組み込まれています。

/+ 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 */

言い換えると、 /+および+/コメントのネスト。

1

HTML/XMLの場合は、存在しない処理命令を使用できます。参照 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はネストされたコメントをサポートしているため、「コメントをネストできないのは1つの言語だけではない」という記述は、真のステートメントではなくなりました。プログラミング言語でネストされたコメントがサポートされていないことに不満がある場合は、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プログラミング言語:基本

0
mbonness