web-dev-qa-db-ja.com

Javaで中括弧を省略しても大丈夫ですか?

私はこれを検索しましたが、答えを見つけることができませんでした。何百人もの人々があなたを見つめているという感じのために、私は教授に尋ねるのが恥ずかしかったです...

とにかく、私の質問は、括弧を持つことの重要性は何ですか?それらを省略しても大丈夫ですか?例:

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

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

両方とも機能することはわかっていますが、括弧を省略した場合(可視性のために多くの場合これを行う傾向があります)、それは何かを変更しますか?私が言ったように、私はそれが機能していることを知っています、私はそれを数十回テストしましたが、今では私のユニ割り当てのいくつかは大きくなっています、そして何らかの理由で私は長期的にはこれが私の問題の原因であるという不合理な恐れがありますか?それを恐れる理由はありますか?

74
vedran

それはまったく何も変更しませんからコードの保守性。私はこのようなコードを見てきました:

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");

...しかし、これはshouldでした:

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

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

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

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

124
Jon Skeet

中括弧を使用すると、コードの保守性と理解性が高まります。したがって、デフォルトではを考慮する必要があります。

コードをよりコンパクトにするために、 guard節 で中括弧の使用をスキップすることがあります。これに対する私の要件は、ifのようなjumpステートメントが後に続くreturnステートメントであることですthrow。また、私はイディオムに注意を引くためにそれらを同じ行に保ちます。

if (!isActive()) return;

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

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

そして、必ずしもメソッド本体の最上部にあるとは限らないメソッドからの他のジャンプ条件へ。

一部の言語(PerlやRubyなど)には、一種の条件ステートメントがありますが、中括弧は適用されません。

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

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

31
Jordão

違いはありません。 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?");
_

したがって、正当な理由がない限り、中括弧を保持してください。それは、ほんの数回のキーストロークです。

10
Mat

ほとんどの場合、これまでに述べた答えは正しいです。しかし、物事のセキュリティの観点からは、いくつかの欠点があります。支払いチームで働いたことがあるので、セキュリティはそのような決定を動機付けるはるかに強力な要因です。次のコードがあるとしましょう:

if( "Prod".equals(stage) )
  callBankFunction ( creditCardInput )
else
  callMockBankFunction ( creditCardInput )

ここで、何らかの内部問題のためにこのコードが機能していないとしましょう。入力を確認します。したがって、次の変更を行います。

if( "Prod".equals(stage) )
  callBankFunction ( creditCardInput )
else
  callMockBankFunction ( creditCardInput )
  Logger.log( creditCardInput )

問題を修正してこのコードを展開するとします(そして、おそらくレビュー担当者であり、「Prod」条件内にないため、これが問題を引き起こさないと思います)。魔法のように、あなたの生産ログは、ログを見ることができるすべての人に見える顧客のクレジットカード情報を印刷するようになりました。それらのいずれか(悪意がある)がこのデータを取得した場合、神は禁止します。

したがって、中括弧を付けずに、少し不注意なコーディングを行うと、多くの場合、安全な情報が侵害される可能性があります。また、Java CERT-Software Engineering Institure、CM により、脆弱性として分類されます。

4
kung_fu_coder

単一のステートメントがある場合は、角括弧を省略できます。コードブロックを宣言するには、複数のステートメントブラケットが必要です。

角かっこを使用すると、コードのブロックを宣言します。

{

//Block of code
}

括弧は、読みやすさを向上させるためにネストされたステートメントの状況にある場合、1つのステートメントのみで使用する必要があります。たとえば、

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

必要でない場合でも、括弧で書かれたより読みやすいです:

for( ; ; ) {
  if(a == b) {
    doSomething()
   }
}
4
aleroot

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

4
Sergey Gazaryan

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

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

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

4
Máté Magyar

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

3
Nerdtron

私からの「常に中括弧」グループへのより多くのサポート。 If単一ステートメントのループ/ブランチの括弧を省略し、ステートメントを制御ステートメントと同じ行に配置します。

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

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

2
Daniel Fischer

ループ内にステートメントが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番目のステートメントは入りません。

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

1
Shiva N

中括弧を削除すると、命令の最初の行のみが読み込まれます。追加の行は読み込まれません。実行する命令の行が複数ある場合は、中括弧を使用してください。そうでない場合は、例外がスローされます。

1
Ashish Patel

結果的には、同じことです。

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

-コードの保守性
-疎結合コード。 (ループのスコープを指定していないため、他の何かを実行できます。

注:私の観察では、ループ内にある場合。ブレースなしの内部ループも安全です。結果は変わりません。

1

冗長な中括弧を使用してコードがより保守可能であると主張すると、次の質問が発生します:コードを書いたり、考えたり、さらに保守したりする人が以前に説明したような問題がある場合(インデント関連または可読性関連)、おそらく彼らはまったくプログラムすべきではありません。 。

1
user962247

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

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();
    }
}

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

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

0
Jai

これをデバッグするのは非常に面倒であるという単純な事実のために、どこでも中括弧を使用するのがおそらく最善です。しかし、それ以外の場合、1行のコードには必ずしもブラケットが必要ではありません。お役に立てれば!

0
Ash_s94

コードを再フォーマットすることも反射的である必要があります...それはもちろんプロチームのプロプログラマーにとってです

0
user962247