有益なコメントとコメントアウトされたコードを区別する方法はありますか?


38

プログラミングの過程を通じて、コードを説明するコメントと、コードを削除するコメントがいくつかあります。

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

どちらをすばやく解析する良い方法はありますか?

私は3使って周りにプレイした/のをと/** */説明コメントのために。

また、VSCodeプラグインを使用して強調表示し//TODO://FIXME:


2
注として、///また/** ... */コメントは、DoxygenやJSDocなどのドキュメントジェネレーターでも使用されます。それらまたは同様のツールを使用する場合、ドキュメントの一部となることを意図していない説明的なコメントに対して、その種のコメントを使用できない場合があります。
ジャスティンタイム2モニカの復活

1
JavaScriptでは、ほとんどのコード行はおそらくセミコロンで終了します。コメントをしない限り、それは非常に簡単に思えます。また、簡単に確認するスクリプトを作成できます。
アルテミスファウル

回答:


189

これには非常に簡単な解決策があります。コメントアウトされたコードを削除します。

本当に、コードをコメントアウトするのには2つの正当な理由しかありません。何かをテストする/修正するか、後で使用するコードを保存するかです。テストまたは修正を行っている場合は、テストまたは修正が完了したらすぐにコメントアウトされたコードを削除してください。後で使用する可能性のあるコードを保存する場合は、そのコードをファーストクラスのコードにして、ライブラリなどの使いやすい場所に置きます。


108
また、コードがチェックインされている場合:削除するだけです。元に戻す必要がある場合は、ソース管理で対応します
marstato

38
コードが削除されても、それが存在することに誰も気付かない。そのため、回復が難しくなります。特に将来的に使用される可能性が高い場合は、コメント付きのコードを残す価値があります。
usr

76
@usr:コードが削除されたとき、誰もそれが存在することに気づきませんでした -私の経験では、現実世界のすべてのケースの99%で正しいことです。1%では、コメントアウトされた行に何らかの値があるかもしれませんが、コメントアウトされたコードが数週間または数ヶ月(またはそれ以上)留まる場合、アクティブのリファクタリングのためにそれ以上コンパイルされない可能性が高くなりますコード行。「将来の使用に対する潜在的価値」という議論は、数時間のブレインワークに費やしたコードベースから物事を取り除く感情的な問題を抱えている人々による誤った言い訳としてよく使用されます。
Doc Brown

21
追加の説明コメントなしにコメントコードをコミットすることはありません。近いうちにコードを元に戻したいというまれな状況もありますが、それらはどれも例外であり、将来の開発者(または将来の開発者)に説明が必要です。私のコメントの90%が「未使用であるように思われるので、削除された問題がない場合は2021年11月の後に削除します。」されている
ジェームズBeninger

31
私の同僚は、しばらくの間いくつかの機能を削除したときに、「Xを実行したが、それを削除したコードがここにあった」と言っていました。それは本当にうまくいきました。そのファイルのソース履歴にあることは知っていましたが、気にしませんでした。
エリック

45

追加RobertHarveyの優れた答え@の場合:私は私が今まで一時的であっても、ソース管理にコメントしたコードを保存するために遭遇した唯一の正当な理由があると考えているか、何らかの理由で、今使用することはできませんべきではない非自明の置換コードが。それでも、コメントのほとんどは説明であり、置換コードはありません。これは、バグまたは言語の機能であり、まだ安定していないと考えられます。次のようになります。

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

この場合、作業はすでに完了していますが、まだ利用することはできないため、削除すると、誰かが後で再発見する必要があります。同じことが、一見優れていると思われる次善のソリューション、同様のソリューションに対する意識的なトレードオフにも当てはまります

注意:コードに代替ソリューションを散らかさないでください。すべてのタスクは無限にさまざまな方法で実行できますが、すべての変更に対してこのスペースを長時間探索することは費用効率が高くありません。コードレビューは、同僚がすでに最適ではないことがわかっている改善を提案するときに、そのような欠落しているコメントを発見するのに適した場所です。


2
これの裏側は、を使用しない理由を説明する必要がある場合があるfrobnicate(bar)ため、誰も一緒に来て「不正な」コードを「修正」しようとしないことです。ですから、完璧な世界ではfrobnicate機能が進むべき道であることを知っていることを彼らに示しますが、痛みを伴う経験から、それは正しく機能しないことを知っています。サードパーティがそれをバグと見なすことはまったく予想できず、修正する価値はありません。自明なアプローチを取らなかった理由について、将来のプログラマー(自分を含む)にコメントを残す必要があります。
モンティハーダー

3
関連する状況として、何かを行うには2つの方法があります。1つは有効なデータを他の方法よりもはるかに高速に処理し、もう1つは何らかの理由で無効なデータを受信した場合により有用な診断を提供します プログラムが有効であることが「保証されている」データのみを提供するプロセスの一部であるが、プロセス内の何かが適切に機能していない場合、より遅いがより良い診断を提供するバージョンを利用できるようにする何が悪いのかを簡単に判断できます。
スーパーキャット

20

うーん、私はこの質問を、コメントアウトされたコードは削除すべきだと正しく主張しているロバートとは少し違って読んだ。

ただし、後で削除するためにコードをマークする規則を探している場合、私のお気に入りは次のとおりです。

//b = false; //TODO: remove

一部のIDEのフラグ//TODO:コメントまたは教えられることができます。そうでない場合、通常は検索可能な文字列です。これはいくつかの方法で行うことができるので、あなたの店が確立したどんな慣習に従うことをお勧めします。すべてのコードベースはこれを一方向で行う必要があります。検索可能にします。

どっちがどっち?

そのマークがなければ、これを行う自動化された方法はコンパイラーによるものです。コメントを取り除くとコンパイルされるコードが生成される場合、コメント付きのコードである必要があります。それをチェックするIDEプラグインを書くことは難しくありません。しかし、バグのあるコメント付きのコードが残されます。

これが、コメントアウトしたコードをコメントアウトしたコードを単にコードとしてマークする方が良い理由です。これにより、本当に破壊したいかどうかを決定しながら、非破壊的に作業できます。私たち全員が中断され、いくらか忘れっぽいので、その状態でいくつかの行がチェックインされても驚かないでください。そうした場合、少なくとも明確にマークされ、検索可能であると便利です。キーボードマクロは過去にこれを助けてくれました。あなたが単一のキーストロークでそれをすることができるならば、これの途中で中断されるのは難しいです。

これは、継続的な統合テストでマークを付けるまで受け継ぐことができます。おっと、未処理のTODOを再度チェックインしようとしています。


コメントがコンパイルされてコードとしてラベル付けされるかどうかを確認する代わりに、自然言語プロセッサでコメントを実行し、チームが話す言語の文または名詞句として解析するコメントにラベル付けすることができます。
TheHansinator

3
@TheHansinatorは良さそうですが、私の携帯電話での経験はコーダーの専門用語と自動的に正しい関係にあるため、慎重になります。
candied_orange

コードコメントを解析するために使用されるNLPは、自動修正を実行するNLPよりもはるかに優れていると思います。これは、コンピューターが処理する文全体を持ち、スペルエラーを修正しようとしていないためです。ここでも偽陰性の方が良いことは言うまでもありません-削除する前にコメントをレビューできる限り、役に立たないgobbledygookに警告されるのではなく、コメントを書き換えることができます。
TheHansinator

3
WRT解析:double buffer (flip on)-> Cプロトタイプまたは超簡潔な英語?コンテキストなしでは判断できず、どちらの言語でも正しい全体構成ではありません。コメントの性質上、コンテンツの形式がどちらの方向にも制約されない場合、いくつかの偽陽性と陰性は避けられません。
ルーシェンコ

8

プリプロセッサディレクティブを使用して、コメントではなくコードを削除します。

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

これにより、検索が非常に簡単になり、私の構文ハイライターはそれをコメントとして扱います。それを1行にまとめることもできます。#if FALSE(...)

このアイデアを拡張して、いくつかのオプションを使用できます。

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

コンパイル時のエラーチェック:

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

もちろん、これについては行き過ぎたくない、または実際にコンパイルされているものとされていないものを区別するのが難しくなります。しかし、あなたはそのアイデアを手に入れ、それはとにかくコメントされたコードと同じ問題です...静的にのみそれを使用する限り。条件が動的な場合、それはさらに悪いことです。


この問題をまったく考慮していない既存のコードベースのどれを決定するために、私は普遍的な解決策があるとは思わない。自分でパターンを見つけて、おそらく正規表現をコーディングしてパターンを見つける必要があります。


これは世界で何に役立つでしょうか?複数のバージョンをコンパイルする必要がありますか?
Tvde1

@ Tvde1それは1つの可能性であり、本当にうまく管理しないと潜在的な悪夢です。しかし、代替案はおそらくもっと悪い。共通のテーマのバリエーションごとに1つ、ほぼ同じコードのコピーが複数ある場合は、それらを個別に維持し、同期を維持する必要があります。
AaronD

これを行うにはいくつかの方法がありますが、それらにはすべて、複雑な構成の問題または独立したコピーの問題のいずれかのバリエーションがあります:バグ修正がすべての独立したコピーに到達しましたか?そうでなければ、別の機能が追加され、それは機能の前に知られていたが今まで移植されていなかったバグ修正によって壊れますか?
AaronD

3
これ、Cのような前処理ステップある場合にのみ機能しますjavascript。問題はについてです。前処理を行うこともできますが、ビルドシステムの機能が拡張され、非標準にもなります。ビルドシステムがない場合、またはビルドシステムがコードの解析と実行をまったくサポートしていない場合、このソリューションを実装することはできません。最後に、それは質問に対処することすらしていません-コメントアウトされたコードは、条件付きでアクティブ化されるコードと厳密に同等ではありません。有効にすることを意図していない残り物である可能性があります。
VLAZ

条件付きアクティベーションは回答の拡張であり、回答自体ではありません。それ以外の場合は、さらに拡張するコメントを含めるように編集します。
AaronD

4

古いコードは可能な限りコメントアウトするのではなく、削除する必要があるという答えに同意しますが、コメントアウトされたコードが必要ないくつかの機会に慣習を守っています。

(私の基本はC#ですが、これは任意のC構文言語(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
これは完全にスタイルに依存します。コードをコメントアウトすると、通常//、最初の列にが追加され、事実上すべてのコードがインデントされるため、コメントは事実上常にいくつかのタブで始まります。近くに先行スペースがある他のコメントが既にない限り、通常のコメントは先行スペースを取得しません。したがって、あなたのメソッドは私が作成したコメントに対してひどく失敗し、私のコメントパターンを認識するように設計されたメソッドはあなたに対してひどく失敗します。
cmaster

@cmasterああ、私は質問を誤解したと思います。コメントを簡単に解析して、タイプを簡単に解析できるように、コメントをフォーマットする簡単な方法を提供しました。
IanF1

2

コメントアウトされたコードを見つけたいと思って、私はまだ異なる質問を解釈しています。

Cスタイルのコードにはセミコロンが含まれるのに対し、コメントにはセミコロンが含まれる可能性は低いです。したがって、コメントアウトされた1行のコードでは、次の正規表現を使用できます。

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

複数行のコメントアウトされたコードの場合、

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

注Visual Studioは正規表現の改行について少し独特です。それらは空白としてはカウントされません。明示的な\ nを指定する必要があります。


2

バックグラウンドで実行されているコンパイラ(XcodeやClangなど)でエディターを使用する場合、コメントのテキストをコンパイルするだけで済みます。たとえば、「簡潔な説明」ではエラーが発生しますが、「b = false;」ではエラーは発生しません。その後、異なる構文強調表示を使用できます。

より単純な方法は、キーワードがコメントを指している、複数の単語を中括弧で囲んだコードをマッチさせているなど、行にある複数の単語など、いくつかのヒューリスティックを使用するIDEプラグインです。


1

他の回答では、「コードをコメントアウトしない」というテーマのバリエーションを取り上げています。ただし、参照用に必要な場合があります。

本当にコードを維持する必要がある場合は、コードを「#if 0 ... #endif」で囲むことをお勧めします。理想的には理由を説明するコメントを付けてください。これは、MISRAを含むさまざまなコーディング標準から推奨される戦略です。


-3

少なくとも、私にとっては-C / C ++ではシンプルです。/ * * /で囲まれたコメントは参考情報です。一時的に削除されたテストコードは、先頭の//でコメントアウトされます。

そして、少なくとも私がしているような作業では、テストコードをファイルに残したままコメントアウトする正当な理由があります。遅かれ早かれ、誰かが変更を必要とし、そのコードが必要になります。ブロックのコメントを外すには、エディターコマンドが1つ必要です。また、完了したらコメントを外します。


また#ifdef __DEBUG ... #endif、使用するカスタム定義もあります。 __DEBUGただし、プロジェクトの構成を変更するだけで取得できる場合が多いためです。しかし、ほとんどのIDEでは独自の構成も定義できるため、その場で何でも提供できます。
AaronD

「テストコード」とはどういう意味ですか?単体テスト?これらはコメントアウトされるべきではありませんが、誰かが必要だと思うかどうかにかかわらず、テストスイートに保持され、できるだけ頻繁に実行されるべきです。確かに、コードのコメントを再コメント
解除

1
ああ、それをしないでください。「何かをテストする」コードをコメントアウトすると、100回のうち99回で問題なく動作します...必要な場合)、物事がくなることがあります。
CharonX

@leftaroundabout:いいえ、値をチェックするためにprintfステートメントなどを追加します。
jamesqf

@jamesqfは、そのようなものを決して必要とすべきではありません。それがデバッガの目的です。ただし、新しく作成されたコードを正しくするためにprintf/ coutまたは同様のものを使用しても(過去に自分でやったことは認めますが)、そこに置いておくのはあまり効果的ではありません。誰かが変更をしたいと、彼らはに関する情報を必要とするどの変数を知っているならば、それは書くために迅速かつ簡単だprintfというDEVがあれば一方で、新たにSはしないすべてのものを必要なものを知っているだけ非コメントprintf内のテキストの文を、その後巨大なスワス端末もおそらくそれらを助けません。
20:10の
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.