89

私はこれを検索しましたが、答えを見つけることができませんでした.

とにかく、私の質問は、ブラケットを持つことの重要性は何ですか? 省略してもいいですか?例:

for (int i = 0; i < size; i++)  {
   a += b;
}

for (int i = 0; i < size; i++)
   a += b;

どちらも機能することはわかっていますが、ブラケットを省略した場合 (可視性のために、私はよく行う傾向があります)、何かが変わるのでしょうか? 私が言ったように、私はそれが機能することを知っています、私はそれを何十回もテストしましたが、今では私の大学の割り当てのいくつかが大きくなっています. それを恐れる理由はありますか?

4

16 に答える 16

158

コードの保守性を除けば、何も変更されません。次のようなコードを見てきました。

for (int i = 0; i < size; i++)
   a += b;
   System.out.println("foo");

これは次のことを意味します。

for (int i = 0; i < size; i++)
   a += b;
System.out.println("foo");

...しかし、これ次のとおりです。

for (int i = 0; i < size; i++) {
   a += b;
   System.out.println("foo");
}

個人的には、コードを読んだり変更したりするときに混乱する可能性を減らすために、常に括弧を含めています。

私が働いていたすべての会社のコーディング規則はこれを必要としていました-他の会社が異なる規則を持っていないというわけではありません...

そして、それが違いをもたらさないと思われる場合に備えて: 上記のコードとほとんど同じであるバグを一度修正する必要がありました。見つけるのは非常に困難でした... (確かに、これはユニットテストを開始する前の数年前のことであり、診断が容易になったことは間違いありません)。

于 2011-11-05T12:46:04.993 に答える
34

中括弧を使用すると、コードが保守しやすく理解しやすくなります。したがって、デフォルトでそれらを考慮する必要があります。

コードをよりコンパクトにするために、ガード句で中括弧の使用をスキップすることがあります。これに対する私の要件は、 orのようなjumpifステートメントが後に続くステートメントであることです。また、慣用句に注意を引くために、それらを同じ行に入れておきます。returnthrow

if (!isActive()) return;

また、ループ内のコードにも適用されます。

for (...) {
  if (shouldSkip()) continue;
  ...
}

また、必ずしもメソッド本体の先頭にあるとは限らないメソッドからの他のジャンプ条件へ。

一部の言語 (Perl や Ruby など) には、中かっこが適用されない一種の条件文があります。

return if (!isActive());
// or, more interestingly
return unless (isActive());

今説明したものと同等であると考えていますが、言語によって明示的にサポートされています。

于 2011-11-05T15:58:36.277 に答える
12

違いはありません。2 番目のバージョンの主な問題は、次のように記述してしまう可能性があることです。

for (...) 
  do_something();
  do_something_else();

do_something_else()そのメソッドを更新すると、ループ内で呼び出されると考えられます。(そして、頭を悩ませるデバッグ セッションにつながります。)

ブレース バージョンにはない 2 つ目の問題があり、さらに見つけにくい可能性があります。

for (int i=0; i<3; i++);
  System.out.println("Why on earth does this print just once?");

したがって、正当な理由がない限り、中かっこはそのままにしておいてください。キーストロークが数回増えるだけです。

于 2011-11-05T12:44:43.763 に答える
6

自動フォーマットも使用している場合は、インデントが常に正しいため、中括弧を緩めるのが良いと思います。そのため、エラーを簡単に見つけることができます。

言語全体がその考えに基づいており、非常に人気がある (python) ため、中括弧を除外するのは悪い、奇妙である、または判読できないと言うのは間違っています。

ただし、フォーマッターを使用しないと危険な場合があると言わざるを得ません。

于 2014-05-06T09:00:11.567 に答える
4

ステートメントが 1 つだけの場合は、角かっこを省略できます。ステートメントが 1 つ以上ある場合は、コード ブロックを宣言するために角かっこが必要です。

括弧を使用すると、コードのブロックを宣言しています:

{

//Block of code
}

読みやすさを向上させるために、ネストされたステートメントの状況にある場合は、ブラケットを 1 つのステートメントだけでも使用する必要があります。たとえば、次のようになります。

for( ; ; )
  if(a == b) 
    doSomething()

必要がない場合は、括弧を付けて書くと読みやすくなります。

for( ; ; ) {
  if(a == b) {
    doSomething()
   }
}
于 2011-11-05T12:45:02.877 に答える
4

ブラケットを使用すると、コードが読みやすくなります。また、同じブロックに演算子を追加する必要がある場合は、起こりうるエラーを回避できます

于 2011-11-05T12:46:52.917 に答える
3

括弧を使用すると、コードが後で変更されないように将来的に証明されます。括弧が省略され、後で誰かがコードを追加し、その時点で括弧を入れなかったケースを見てきました。その結果、彼らが追加したコードは、彼らが思っていたセクションに入っていませんでした。したがって、コードの将来の変更に照らして、その良い慣行であるというのが答えだと思います。ソフトウェアグループがそれを標準として採用しているのを見てきました。つまり、その理由から、単一行ブロックであっても常に括弧を必要とします。

于 2011-11-05T12:45:55.993 に答える
2

私からの「常にブレース」グループへのさらなるサポート。単一ステートメントのループ/分岐で中括弧を省略する場合は、ステートメントを制御ステートメントと同じ行に置きます。

if (condition) doSomething();
for(int i = 0; i < arr.length; ++i) arr[i] += b;

そうすれば、本体が展開されたときにブレースを挿入するのを忘れにくくなります。それでも、とにかくカーリーを使用してください。

于 2011-11-05T14:17:54.710 に答える
2

最近では、コードのどのブロックがどの/にあるifかを見つけるためにコードを再インデントするのは非常に簡単です。再インデントを行うのは難しいと主張する場合、間違ったインデントに括弧を配置すると、同様にひどく混乱する可能性があります。forwhile

for(int i = 0; i < 100; i++) { if(i < 10) {
    doSomething();
} else { for(int j = 0; j < 5; j++) {
        doSomethingElse();
    }
}}

これをどこでもやると、脳はあっという間に壊れてしまいます。ブラケットを使用しても、コード ブロックの開始と終了を視覚的に見つけるためにインデントに依存しています。

インデントが重要な場合は、正しいインデントでコードを記述しておく必要があります。そうすれば、他の人がコードを再インデントして正しく読み取る必要がなくなります。

前の例があまりにも偽物/意図的であり、括弧が不注意なインデントの問題 (特にコードをコピー/貼り付けする場合) を捉えるためにあると主張したい場合は、次のことを考慮してください。

for(int i = 0; i < 100; i++) {
    if(i < 10) {
    doSomething();
}
else {
    for(int j = 0; j < 5; j++) {
        doSomethingElse();
    }
}

はい、前の例ほど深刻ではないように見えますが、それでもこのようなインデントによって混乱する可能性があります。

私見、コードを書いている人の責任は、コードをチェックして、他のことをする前に物事が正しくインデントされていることを確認することです。

于 2017-11-22T08:28:09.077 に答える
1

結果的には同じです。

考慮すべきことは2つだけです。

- コードの保守
性 - 疎結合のコード。(ループのスコープを指定していないため、何か他のものを実行する可能性があります。)

注:私の観察では、ループ内のループの場合。ブレースなしのインナーループも安心です。結果は変わりません。

于 2015-07-31T03:48:47.930 に答える
1

ループ内にステートメントが 1 つしかない場合も同じです。

たとえば、次のコードを参照してください。

for(int i=0;i<4;i++)
            System.out.println("shiva");

上記のコードにはステートメントが 1 つしかありません。だから問題ない

for(int i=0;i<4;i++)
            System.out.println("shiva");
            System.out.println("End");

ここでは 2 つのステートメントがありますが、最初のステートメントのみがループ内に入り、2 番目のステートメントは入りません。

単一のループの下に複数のステートメントがある場合は、中かっこを使用する必要があります。

于 2015-11-04T07:28:49.423 に答える