}の後のコードブロックの最後にある「//…」コメント-良いか悪いか [閉まっている]


18

私はしばしばそのようなコメントが使用されるのを見ました:

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

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

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

そして時には

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

私はこのプラクティスを理解したことがないため、適用しませんでした。コードが非常に長いため、このエンディング}が何であるかを知る必要がある場合は、おそらくコードを個別の機能に分割することを検討する必要があります。また、ほとんどの開発者ツールは、一致するブラケットにジャンプできます。最後に、最後の点は、私にとって、DRY原則への明らかな違反です。条件を変更する場合は、コメントも変更することを忘れないでください(そうしないと、メンテナーやあなたにとっても面倒になります)。

なぜ人々はこれを使用するのですか?それを使うべきですか、それとも悪い習慣ですか?


PHPでは、制御構造に代替構文を使用しますif(condition): ... else: ... endif;
-systemovich

@Geoffrey van Wyk-本当に?テンプレートファイル以外でこれらを使用する人は誰もいません。それらは非常に標準的ではありませんが、それぞれ独自のものであると思います。
クレイジュ

4
@Craige:PHPがネイティブにサポートする言語構成体は「極端に非標準」ではありません。PHPインタープリター「標準」とは何かを定義します
ビリーONeal

Adaには、ほとんどの構成体の末尾に特定のマーカーがありますif ... then ... end if; while ... loop ... end loop; procedure Foo is ... end Foo;。私はそれが読みやすさを助けることを発見します(そしてコメントはコンパイラーによってチェックされます)。
キーストンプソン

回答:


32

コードが長すぎてブレースを簡単に追跡できない場合は、ほとんどの言語でコードをリファクタリングする必要があります。

ただし、テンプレート言語(PHPなど)では、条件またはループ構造の開始と終了を分離するHTMLの大きなブロックがあるため、有効な場合があります。


5
Htmlと混合したPHPを使用している場合、PHPの完全に有効なポイント。グリフィンドールで1ポイント。

3
HTMLと混合したテンプレート言語としてPHPを使用しても、インデントできます。また、PHPをテンプレート言語として使用する場合は中かっこを使用しないでください。代わりにwhile(): endwhile;andなどのforeach(): endforeach;構造体を使用して
ください。– Htbaa

9
PHPのリファクタリングを行うべきではない理由はわかりません。おそらく別の言語に。
トムホーティン-タックライン

@Htbaa:これまでずっとPHPを使用していて、それらについて知らなかったとは信じられません。ありがとう!インデントに関しては、ページを作成しているPHPに合わせてではなく、ページの残りの部分と同じように条件付きHTMLのインデントを維持することを好みます。
マットエレン

3
@トム:私は笑ったが、罪悪感を感じる。:P

17

それはコード臭であり、通常、昔ながらのコードスタイルからの二日酔いです。まともなIDEのリファクタリングは以前より難しく、現在ほど一般的ではなかったため、メソッドが長くなり、これらのコメントはそれらをよりうまくナビゲートするのに役立ちました。


15

これは多くの要因によって時代遅れになった恐ろしい習慣です。

  • 最新のIDEでは、キャレットがいずれかのシンボル上にある場合、対応するブレースが強調表示されます。
  • きれいにコーディングしている場合、メソッドが10行を超える場所を見つけることはほとんどありません。

多くのJavaプログラマーがこの考え方を持っていることに気付きます。これにより、Javaコードは本当に汚く見え、コードからコメントに焦点が移ります。

これを使用することを強くお勧めします。


4
これを行う同僚(java開発者)がいます。// forおよび// forの代わりに// rofおよび// fiを使用する場合を除きます。それは私を夢中にさせ、彼はどこでもそれをします。
ジェイ

ええ、私はそれを主張したものを持っていました。AAAAAGHHHHH。
リグ

2
これは実際にはJavaやJavaプログラマーとは何の関係もありません。また、Javaでプログラミングする際に行うことは一般的でも事実上の標準でもありません。
ジェスパー

1
「恐ろしい練習です」の場合は+1,000。
scunliffe

6

コードは、記述されているよりも10倍以上読み取られます。

読みやすくする場合は、実行してください。

また、これを行う人には、読みやすくするために他の方法を検討することをお勧めします。他の人が言及したリファクタリング手法、異なる行の括弧などはすべて良いです。コードを自己コメントにするために、さまざまな関数、メソッド、またはクラスに物事を分割することも良い方法です。また、ほとんどの「if」を削除し、「for」ループを明白な場所に配置する方法もあります。そのため、これらのいずれの必要もありません。

しかし、時々人々は学んでいます。これが彼らがしていることであるならば、それはコードを本当に読みやすくすることであり、それを奨励し、そして次にいくつかの他の慣行も奨励します。学んでいる人は、彼らがどのように始まったかに関係なく、励ましから恩恵を受けるでしょう。「これは悪い」と言うことは、「この他のことは良い」と言うほど有用ではありません。


6
これ悪いです。初心者レベルの教科書でさえ、この残虐行為を行いません。「コードは、書かれているよりも10倍以上読み取られます」...このコードが不要なため、読者の時間を無駄にしないさらに多くの理由があります。
トーマスエディング

@trinithis 20ケースのswitchステートメントがある場合はどうなりますか?20種類のオプションをサポートする必要がある場合がありますが、複数レベルの意思決定スキームに「リファクタリング」するよりも、それらを1か所に集める方が良いでしょう。
quant_dev

これは、ピアを過小評価するコーダーによる実践だと思います:)他の人はコードを読むほど賢くはありません。一般的に私はこの慣習に反対していますが、誰かがそれをやっても、ほとんど読み込めない} sのジャングルがあります。とにかくそれをしないでください!
-WinW

1
@trinithisそれは悪いかどうかではなく、人々がそれを通して成長するのを助ける効果的な方法です。効果的であること>正しいこと。たとえば、さらに複雑なレガシーコードをリファクタリングしている場合、これは完全に賢明なことです。時には悪いことがより良い暫定的なステップを作り、それよりもさらに良い何かにつながることがあります。
ルニボー

1
@trinithis申し訳ありませんが、そのような1行にすべてが含まれている場合、その意味を理解することはできません。これを行う開発者が学ぶことができるコードをリファクタリングする他の方法もあると述べたと思います。
ルニボー

4

この種のことでいっぱいの大きな(C ++)コードベースがあります。

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

これほど小さいものについては、これは「コードのにおい」を超えて「コードの悪臭」につながると思います。特に、閉じ括弧をキーストロークと一致させて開き括弧を見つけることができるIDEで。より長い方法が与えられたとしても、私はまだ端末コメントを介して中括弧を使用します。そのようなコメントは私を混乱させ、私はそれらをノイズと考える傾向があります。


ええと、私はこのサイトでフォーマットの一部を取得していないと思います。そこにある各括弧は、メソッド本体と同じように、独自の行にあるべきです。
PSU

ただし、C ++では、実装の隠蔽のために、匿名のネームスペースを上部で頻繁に開きます。その後、ある時点でこの中かっこを閉じます。ここで、中かっこが何を意味するかを知っておくと便利です。
CashCow

4

C ++には、これがまだ有用であり、「コードを分割する」というアドバイスが不要な2つのホールドオーバーがあります。

  1. 名前空間用。名前空間はファイル全体を含むことができ、その最後のブラケットは時々人を捨てることがあります。そのため、ブラケットが名前空間を閉じていることを示すコメントを追加すると便利です。私の会社の特定のコーディングスタイルでは、名前空間をインデントしないため、このようなインデントはファイル内のスペースを無駄にするだけなので、これは重要です。

  2. #ifdef / #endifペアの場合。条件付きコンパイル用のコードがたくさんある場合があり、ネストすると厄介になることがあります。私たちが頻繁に使用するエディターは、インデントを「役立つ」方法で削除するので、コメントは簡単な概要で役立ちます。


名前空間のコメントと理由については+1。私がこれを行うのはそれだけで、同じ理由で
-JohnB

+長いswitchステートメント。
-quant_dev

1

私にとって、コードはあなたが指定したようなコメントを追加するのを混乱させなければなりません。

// IFステートメントと表示されている場合。それから、そもそもなぜそこにあるのか疑問に思うようになりました。


私は同意します、古い学校ではなくコメントアウトされた行のように見える//endif
-StuperUser

1

ブレースが閉じていることを確認する代わりに、開いているブレースを閉じているブレースと同じ列に配置します。私はそれがはるかに明確で読みやすいと思う。

コメントは、オープンがかなり前に行われたためにトレースするのが通常困難な場合に役立ちます。これは通常、名前空間(特に、コンパイル単位で実装の詳細に使用されるC ++の匿名の名前空間)に対してのみ発生します。他のほとんどの場合、何を閉じているのかが明らかです。


1

これは、特にEVEのようなウィンドウエディタを使用している場合、80x24文字のターミナルウィンドウで作業していた昔からの大部分のホールドオーバーです。今でも、vimを使用してターミナルセッションでほとんどの作業を行っています。セッションを3つまたは4つのサブウィンドウに分割できるため、一度に実際に表示できるのは数行だけです。

そうは言っても、何度もベーコンを節約できたとしても、コンベンションに本当に温まることはありませんでした。私はそれをノイズと見ています。ループや条件が大きくなっている場合は、そう、リファクタリングを検討したいかもしれません。


0

基本的に、これを使用しない正当な理由をすべて示します。すべての適切なプログラマはこれらを適用する必要があります。なぜないの人々はそれを使うのか?彼らはそれを間違っているので、よく知らないからです。


うーん、下票を説明してください。私はこの答えを発明しただけでなく、実生活での経験に基づいています:私の隣に数フィート座っている同僚は、そのような10以上の耳のためにプログラミングしており、彼が説明するまでこれが間違っている理由については何の手掛かりもありませんでした。
stijn

おそらく教科書で使われていたので、それを使って大勢の人が大学から出てきましたか?入門テキストに位置を置くことができます。また、プリプロセッサ、特に#ifdef / endifインクルードガードで妥当に有効
Martin Beckett
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.