Javaで中括弧を省略しても大丈夫ですか?[閉まっている]


83

私はこれを探しましたが、答えが見つかりませんでした。何百人もの人々があなたを見つめているときのその気持ちのために、どういうわけか私は教授に尋ねるのが恥ずかしかったです...

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

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

vs

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

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


混乱の多くの潜在的な原因を解決するため、私は常に読みやすさのためにコードフォーマッターを使用しています。これにより、中括弧の使用が冗長になる可能性があります
Peter Lawrey 2018年

回答:


146

コードの保守性を除けば、何も変わりません。私はこのようなコードを見てきました:

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

個人的に私はいつもは、コードを読んだり変更したりするときに混乱する可能性を減らすために、角かっこを含めています。

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

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


12
@vedran:それで、あなたは問題に気づいていますが、それが決してあなたを噛まないだろうと思っているだけですか?そして、あなたのコードを読んでいる誰もが何を期待するかを知っているだろうか?私が言っているのは-私が一緒に働いたコーディング規約でそれらが必要とされる理由があります:)
Jon Skeet 2011年

12
私はちょうどプライベートがsargeによって話しかけられているように感じました。はい、それは私にとってより便利ですが、私のグループの他の人はそれが迷惑で問題があると感じています。これからは必ずブラケットを使っていきます。
vedran 2011年

13
@vedran素敵な比喩、ジョンスキートが最高司令官ではないことを除いて、彼は最高司令官です:-)
stivlo 2011年

5
@stivloああ、彼の恵みは軽微な不従順を許すと確信しています;)個人的には、これまでに見たすべてのコーディングガイドの一部であるため、ステートメントの後に角かっこを付けますが、今日はかなり弱い議論だと思います。どこでも自動コードフォーマットを使用すると、コードが最初の形式で表示されることはありません。インデントが正しい場合、角かっこは追加情報を提供しません。
Voo 2011年

4
常に

32

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

コードをよりコンパクトにするために、ガード句に中括弧を使用することをスキップすることがあります。これに対する私の要件は、またはのようなジャンプステートメントifが後に続くステートメントであるということです。また、イディオムに注意を引くために、それらを同じ行に保持します。例:。returnthrow

if (!isActive()) return;

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

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

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

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

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

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


7
ループ内の+1ガード句は、通常、中括弧なしでより明確になります。
viccari 2012

2
ガード条項に同意しました。私の意見ではコードが読みやすくなり、実際に保守性が向上します。ただし、受け入れられた回答のポイントは非常に有効であるため、中括弧の省略はガード句に限定します。
ChrisK 2015年

11

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

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


3
最初のポイントは良いですが、2番目のポイントは間違っています。ブレースバージョンでも問題が発生する可能性があります。for(int i = 0; i <3; i ++); {System.out.println( "なぜこれが1回だけ印刷されるのですか?"); }。私は常に中括弧を使用しているので知っていますが、誤ってセミコロンを追加することがあります。
エモリー2011年

3
ブレースバージョンはそれを持つことができますが、ブレースが同じ行にある場合はより見やすくなります。次の行に中括弧があるので、確かに、それはかなり厄介です。
マット

私にとって2番目のバージョンは最初のバージョンと同じくらい重要です。2番目のバージョンを見ると、実際に実行して世界で何が起こっているかを確認するまで、何が悪いのかを見つけることはほとんど不可能だからです。開発者は、このような波状のブラケットが導入されていれば簡単に見つけられるようなコードのデバッグに多くの時間を費やしています。私にとって、これらの波状の括弧を省略することは、スタイルの問題であるだけでなく、バ​​グの可能性のあるコードの良い指標です。
theyCallMeJun 2016

5

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

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

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


Pythonではインデントが重要です。Java、C、C ++、またはその他のCスタイルの言語では、そうではありません。
クリストファーシュナイダー

1
@ChristopherSchneiderそれはポンです。
–MátéMagyar 2016

5

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

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

ここで、内部の問題が原因でこのコードが機能していないとします。入力を確認したい。したがって、次の変更を行います。

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

問題を修正してこのコードをデプロイするとします(おそらくレビュー担当者であり、「Prod」条件内にないため、これによって問題が発生することはないと思います)。魔法のように、本番ログは、ログを見ることができるすべての担当者に表示される顧客のクレジットカード情報を印刷するようになりました。それらのいずれかが(悪意を持って)このデータを入手した場合、神は禁じられています。

したがって、中括弧を付けず、少し不注意なコーディングを行うと、安全な情報の侵害につながることがよくあります。また、CERT(Software Engineering Institure、CMU)によってJAVAの脆弱性として分類されています。


そもそもそれはかなりひどいデザインだと思いますが、要点は正しいです。
クリストファーシュナイダー

4

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

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

{

//Block of code
}

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

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

必要がない場合も、角かっこで記述すると読みやすくなります。

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

4

角かっこを使用すると、コードが読みやすくなります。また、同じブロックに演算子を追加する必要がある場合は、発生する可能性のあるエラーを回避できます


3

角かっこを使用すると、将来の変更に対してコードが保護されます。角かっこが省略され、後で誰かがコードを追加して、その時点で角かっこを入れなかった場合があります。その結果、彼らが追加したコードは、彼らが思っていたセクションの中には入りませんでした。したがって、答えは、コードの将来の変更に照らして、そのグッドプラクティスであると思います。私はソフトウェアグループがそれを標準として採用しているのを見てきました。つまり、その理由で単一のラインブロックでも常にブラケットが必要です。


私はこれに同意する。角かっこはあなたには向いていません。彼らはあなたの後ろに来る人のためです。何度か、角かっこを使用せず、インデントが悪いコードに慣れていないというコードがありました。この段階では、おそらくバグを修正しているので、何が起こるかを知っておくとよいでしょう。中かっこを省略するとわかりにくくなり、コードをステップ実行する必要があり、時間を無駄にします。
クリストファーシュナイダー

2

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

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

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


2

冗長な中括弧を使用してコードがより保守しやすいと主張すると、次の質問が発生します。コードを書いたり、疑問に思ったり、さらに保守したりする人が、前に説明したような問題(インデント関連または読みやすさ関連)がある場合は、プログラムしないでください。 。


1

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

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

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

注:私の観察では、それがループ内のループである場合。中かっこなしのインナーループも安全です。結果は変わりません。


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

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


1

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


1

今日では、コードを再インデントして、コードのどのブロックがどの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

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


0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.