中括弧を省略するのはなぜ悪い習慣と考えられているのですか?[閉まっている]


177

なぜ誰もが私にこのようなコードを書くことは悪い習慣だと言っているのですか?

if (foo)
    Bar();

//or

for(int i = 0 i < count; i++)
    Bar(i);

中括弧を省略することについての私の最大の議論は、中括弧が2倍になることがあるということです。たとえば、C#でラベルのグロー効果をペイントするコードは次のとおりです。

using (Brush br = new SolidBrush(Color.FromArgb(15, GlowColor)))
{
    for (int x = 0; x <= GlowAmount; x++)
    {
        for (int y = 0; y <= GlowAmount; y++)
        {
            g.DrawString(Text, this.Font, br, new Point(IconOffset + x, y));
        }
     }
 }
 //versus
using (Brush br = new SolidBrush(Color.FromArgb(15, GlowColor)))
    for (int x = 0; x <= GlowAmount; x++)
        for (int y = 0; y <= GlowAmount; y++)
            g.DrawString(Text, this.Font, br, new Point(IconOffset + x, y));

また、usings何百万回もインデントする必要なしに、連鎖の追加の利点を得ることができます。

using (Graphics g = Graphics.FromImage(bmp))
{
    using (Brush brush = new SolidBrush(backgroundColor))
    {
        using (Pen pen = new Pen(Color.FromArgb(penColor)))
        {
            //do lots of work
        }
    }
 }
//versus
using (Graphics g = Graphics.FromImage(bmp))
using (Brush brush = new SolidBrush(backgroundColor))
using (Pen pen = new Pen(Color.FromArgb(penColor)))
{
    //do lots of work
}

中括弧の最も一般的な議論は、保守プログラミングと、元のifステートメントとその意図した結果との間にコードを挿入することによって発生する問題を中心に展開します。

if (foo)
    Bar();
    Biz();

質問:

  1. 言語が提供するよりコンパクトな構文を使用するのは間違っていますか?これらの言語を設計する人々は賢いです、彼らがいつも使うのが悪い機能を置くとは思えません。
  2. 最も一般的な分母が理解し、問題なく動作できるようにコードを書くべきか、すべきでないか?
  3. 私が見逃している別の議論はありますか?

6
仰るとおりです。それらを省略します。限目。
AndreiRînea2008

67
誰がどのように多くのラインが2010年にあるかについて気にします。モニターは広くて安価で高解像度です!私のモニターは2048 X 1152で、2つ持っています!読みにくいことは、見つけるのが難しい微妙なエラーが簡単に発生する可能性がある場合に、2本の縦線を保存することよりも重要です。

51
モニターは広くて安いですが、背が高くて安くはありません。垂直方向のスペースは、水平方向のスペースよりも希少です。
アダムは言う-モニカを復活させる

32
@AdamRuthそれらを横に向ける:)
ザカリー・イェーツ

16
つまり、2014年2月に発見されたSSLバグでAppleのように失敗することはありません。
learnvst 2014

回答:


183

実は、本当に私に噛まれたのは、デバッグしていて、bar()をコメントアウトしたときだけでした。

if(foo)
  // bar();
doSomethingElse();

それ以外に、私は使用する傾向があります:

if(foo) bar();

上記のケースを処理します。

編集質問を明確にしてくれてありがとう、私は同意します、私たちは最低の共通項にコードを書くべきではありません。


31
もちろんそれは大雑把ですが、メンテナにとっての最大の問題は、2行目を追加することであり、実際にはそうであるように見えても、条件文の一部ではないことに気付かないことです。
danieltalsky 2008

23
私はいつも下のループ本体を探しに行くので、ワンライナースタイルは好きではありません。
Nosredna 2009年

18
(特に深い入れ子の場合-ugh)ステートメントが簡単に読み直され、混乱が生じる可能性があるので、ワンライナースタイルは役立つよりも苛立たしいと思います。入力検証(つまり、早期のリターン)またはループ制御(ファイルシステムウォークで無関係なファイル名を無視するなど)には、このような単一ステートメントのifをほぼ排他的に使用しますが、空白行はメインコードからそれらを区別するのに役立ちます。
アランプラム

1
また、1行のスタイルは、テスト対象範囲からbar()を隠します。fooが常にfalseであっても、カバーされているように見えます。
Bohumil Janda 2013年

1
これは、別の言い方をすると、「ソースに中括弧が含まれていれば、デバッグ中に時間を無駄にすることはなかっただろう」。-ブレースを追加するのは簡単で、次の人に落とし穴を残さないようにします。これに対する唯一の議論は「可読性」であり、これは省略した場合に暗黙的に何かが発生する場合であるため、かなり微妙です。
Andrew Theken 2014

156

読む速度...

すでに言及されているものは別として。この時点で、中括弧と空白を含むifステートメントを解析する条件がすでに整っています。だから私は読んだ:

if (condition)
{
    DoSomething();
}

DoSomethingElse();

私が読んだよりも少し速い:

if (condition) DoSomething();

DoSomethingElse();

次のようになっていると、少し遅く読みます。

if (condition) DoSomething();
DoSomethingElse();

私はこれを以前よりもかなり遅く読んだ:

if (condition) 
    DoSomething();
DoSomethingElse();

私は仕方がないので、念のためもう一度読んで、作者が意図したかどうか疑問に思います:

if (condition)
{
    DoSomething();
    DoSomethingElse();
}

一般的にはすでにカバーされていますが、以下を読むことになると、著者が意図したことを確認するために、しばらくこれを調査します。確認のために元の作者を探し出すこともできます。

if (condition) 
    DoSomething();
    DoSomethingElse();

29
4番目のサンプルで、ifステートメントの後に空行を挿入してDoSomethingElse()から分離すると、問題は解決します。これが私が行うことであり、読みやすさは最初のサンプルと実質的に同じです(良くない場合は;-P)。もう1つは、2行または3行のグループに行を入れると読みやすさが大幅に向上することです。コードをすばやくスキャンするだけです。
Piotr Owsiak 2009

6
多分それは私がPythonに慣れているからかもしれませんが、最初の波括弧をifステートメントと同じ行に置くことで、それをさらにすばやく理解することができます。
Ponkadoodle、2010年

16
ブレースレススタイルの問題は、ブロックがより重要なものではなくブレースを持っているかどうかについて考える貴重な集中力を無駄にします。これだけでも、常に中かっこである最も単純な規則を使用する十分な理由になります。
ネイトCK

2
ブレースは本質的に明示的です。私はそれに固執します、ありがとう。
TheOptimusPrimus 2013

2
最後のケースでは、元の作者を追い詰めて彼
Lundbergによる

55

小さい場合は、次のように記述します。

if(foo()) bar();

2行に分割できるほど長い場合は、中括弧を使用します。


ええ、それも私がやっていることです。別の行を追加する場合は中括弧を追加する必要があり、bar()が実際にifの一部であることは明らかであるため、コメント化するだけで問題が発生します。
2008

10
ただし、デバッガにはあまり対応していません。「バー」部分にブレークポイントをどのように設定しますか?
Nemanja Trifunovic

9
@Nemanja:カーソルをbar();に置くだけです。F9キーを押します。VS2005とVS2008はどちらも、行内ブレークポイントを処理します(それらが別個の「ステートメント」の場合)。
GalacticCowboy

4
GalanticCowboy:ご存知の環境よりも多くの環境があります。:-)

20
確かに、しかし、コンテキストは、ユーザーの大多数をカバーする必要がありますC#、...されているので
GalacticCowboy

47

私はまた、本当に必要なときだけ中括弧を使う方が良いと思っていました。しかし、主な理由はもうありません。多くのコードがある場合、コードが読みやすくなり、一貫したブレーススタイルがある場合は、コードをより速く解析できます。

誰かがifに2番目のステートメントを追加する以外に、常に中括弧を使用するもう1つの理由は、次のようなことが起こります。

if(a)
   if(b)
     c();
else
   d();

else節が実際には「if(b)」の節であることにお気付きですか?あなたはおそらくそうしましたが、この落とし穴に精通している誰かを信頼しますか?

したがって、一貫性のためだけでなく、他の誰か(常に他の人が愚かである場合)がコードを変更したときに予期しない事態が発生する可能性があることがわからない場合は、常に中かっこを付けます。あなたの脳。委任が行われた、またはスイッチのようなifのように、句が拡張されないことがわかっている最も単純なifステートメントについてのみ、中括弧は省略します。


12
これは、中括弧を使用する2つのケースの1つです。そうでない場合。
AndreiRînea2008

3
これはむしろ(a && b)...そもそも考えているように書かれるべきです。
alexander.biskop

8
@ alexander.biskop:確かにそうではありません。それは、elseブロックに(!a || !b)を付けた(!a)または付けなかった(a && !b)とは異なる意味()を与えるためです。
Ben Voigt 2013

1
@Ben Voigt:True!それのために落ちた;-)半年と2票後、誰かが私が行った発言が間違っていることに気付きました...主に私のコメントの背後にある意図が指摘するものとは異なるものだったため、詳細に十分注意を払っていなかったと思いますそのif節の技術的に正しい変換。私が意味したことは、ネストされたインラインifステートメントは一般に読みやすさ(および特に制御フローの追跡可能性)を大幅に低下させるため、むしろ1つのステートメントにまとめる(または完全に回避する)必要があるということです。乾杯
alexander.biskop

3
@ alexander.biskop:同時に、それぞれにシングルステップできるため、条件が単純なネストされたifsを使用するとデバッグが容易になります。
Ben Voigt 2013

35

これは常に悪い習慣とは見なされていません。モノプロジェクトのコーディング・ガイドラインは、それが必要ではない場合、中括弧を使用しないように示唆しています。GNUコーディング標準についても同様です。コーディング標準ではいつものように個人的な好みの問題だと思います。


2
ガイドライン全体を読んだ後、Monoコードを見るのは私にとってかなり異質なようです。
dance2die 2009年

35

ラインは安いです。プロセッサ能力は安いです。開発者の時間は非常に高価です。

一般的なルールとして、絶対にリソース/速度が重要なアプリケーションを開発していない限り、常に次のようなコードを書くのは間違いです。

(a)他の開発者が私がやっていることを簡単に追跡できる

(b)コードを必要とする可能性のあるコードの特定の部分にコメントを付ける

(c)問題が発生した場合のデバッグが容易

(d)将来必要になった場合に簡単に変更できる(つまり、コードの追加/削除)

コードの速度や学術的な優雅さは、ビジネスの観点から見ると、これらの要素に次ぐものです。これは、私が不格好な、または醜いコードを書き始めようとしているわけではありませんが、これは私の優先順位です。

ほとんどの場合、中括弧を省略すると、(b)、(c)、(d)が難しくなります(ただし、不可能ではありません)。中括弧を使用してもしなくても、(a)には影響しません。


9
(a)に関する最後の声明は、他の投稿者を含む多数の開発者が主張するだろうという意見です。
ケリーS.フランス語

34

私は中括弧が提供する明快さを好みます。あなたは正確に何を意味しているのかを知っており、誰かが間抜けしてそれらを放置したかどうかを推測する必要はありません(そしてバグを導入しました)。省略しているのは、ifとactionを同じ行に記述したときだけです。私もそんなことはあまりしません。私は実際に中括弧を独自の行に置くことによって導入された空白を好みますが、K&R Cのようなプログラミングの年月から、括弧で行を終了することは、IDEがそれを強制しない場合に克服しなければならない習慣です私。

if (condition) action();  // ok by me

if (condition) // normal/standard for me
{
   action();
}

23

あなたが取り組んでいるプロジェクトのガイドラインと個人的な好みの問題だと思います。

次のような場合を除いて、必要がない場合は通常省略します。

if (something)
    just one statement; // i find this ugly
else
{
    // many
    // lines
    // of code
}

私は好む

if (something)
{
    just one statement; // looks better:)
}
else
{
    // many
    // lines
    // of code
}

15

これがあなたに噛み付く可能性のあるインスタンスの1つは、昔のC / C ++マクロに戻っています。これはC#の問題であることは知っていますが、多くの場合、コーディング標準は、標準が最初に作成された理由なしに引き継がれます。

マクロの作成時に細心の注意を払わないと、{}を使用しないifステートメントで問題が発生する可能性があります。

#define BADLY_MADE_MACRO(x) function1(x); function2(x);

if (myCondition) BADLY_MADE_MACRO(myValue)

誤解しないでください。C/ C ++でこの問題を回避するためだけに常に{}を実行する必要があると言っているわけではありませんが、このために非常に奇妙なバグに対処する必要がありました。


2
すべてのコードだけがそのように宣言されている場合... ため息
ネイサンストロング

15

私も同じように考えています。

1日まで(なぜあなたの人生を永遠に変えるその「1日」が常にあるのですか?)私たちは、睡眠なしで24〜36時間を費やして、検索/置換の変更と組み合わせて中かっこを付けていない人を見つけるためだけに本番コードをデバッグします。

こんな感じでした。

 if( debugEnabled ) 
      println( "About to save 1 day of work to some very important place.");
 saveDayData();

その後に来たのは

 if( debugEnabled ) 
 //     println( "About to save 1 day of work to some very important place.");
 saveDayData();

システムが毎日500 mbのログを生成していることがわかり、停止するように求められました。デバッグフラグが不十分だったため、printlnの検索と置換が必要でした。

それでもアプリが本番環境に移行したとき、デバッグフラグはオフで、重要な「saveDayData」は呼び出されませんでした。

編集

中かっこを使用しない唯一の場所は、if / tryコンストラクトです。

if( object != null ) try { 
     object.close();
} catch( .....

スーパースターの開発者がそれをしているのを見た後。


3
わかりません。デバッグを制御する変数(debugEnabled)があり、まだコメントを使用してデバッグを無効にしていますか?なぜdebugEnabledをfalseに設定しなかったのですか?
Igor Popov

これは厳密にはシナリオではありませんが、あなたは良い点を述べます。愚かなこと(debugをfalseに設定しないことなど)は、「明白な」バグよりも見つけるのが難しい微妙で愚かなバグを作成します。この場合、中括弧を使用しなくてもあまり効果はありませんでした。
OscarRyz 2010

1
@igorすべての行のログではなく、1行のログを削除したかったのでどうですか。
gman 2017年

14

率直に言って、私はそれを次のように見ています:

優れたプログラマは防御的にプログラミングしますが、悪いプログラマはそうではありません。

上記の例がいくつかあり、中括弧を忘れることに関連するバグに関する私自身の同様の経験があるので、私は常に中括弧を置くための難しい方法を学びました。

安全性よりも個人的なスタイルを選択しているものは何でもあり、それは明らかに悪いプログラミングです。

ジョエルはこれを間違ったコードを間違って見えるようにすることで言及しています

中括弧がないためにバグに遭遇すると、別のバグが発生する可能性があることがわかっているため、中括弧がないと見た目が悪いことがわかります。


開きブレースが単独で行に配置されている場合、ブレースペアなしで2つ以上の行がインデントされている場所は、一致しないブレースペアと同様に正しく表示されません。このような使用法では、ifステートメントがブロックを制御する場合は空白行が発生しますが、ステートメントがブロックでifはなく単一のアクションを制御する場合はブロックが不要になります。
スーパーキャット2014

14

私はとても嬉しいです:

foreach (Foo f in foos)
  foreach (Bar b in bars)
    if (f.Equals(b))
      return true;

return false;

個人的には、理由はわかりません

foreach (Foo f in foos)
{
  foreach (Bar b in bars)
  {
    if (f.Equals(b))
    {
      return true;
    }
  }
}

return false;

これ以上読みやすいです。

はい、行は無料ですが、サイズが半分になる可能性があるのに、なぜページやコードのページをスクロールする必要があるのですか?

読みやすさや保守性に違いがある場合は、確かに中かっこを入れますが、この場合は理由がわかりません。

また、私は常にネストされたifに対して中括弧を置きます。

if (condition1)
  if (condition2)
    doSomething();
  else (condition2)
    doSomethingElse();

if (condition1)
  if (condition2)
    doSomething();
else (condition2)
  doSomethingElse();

ひどく混乱しているので、私はいつも次のように書きます:

if (condition1)
{
  if (condition2)
    doSomething();
  else (condition2)
    doSomethingElse();
}

可能な場合は常に三項演算子を使用しますが、ネストすることはありません


ちょうどこれが私のコードでほとんど起こっているのを見た:)私は周りを見てみると思った、そして見よ...それはすでにそこにある:)
Noctis

10

「もしあなたが誰かにお金を払ってコードを書かせるほど賢いなら、コードの流れを見るのにインデントだけに頼らないように賢くすべきだ」と私は同意します。

ただし、...間違いを犯す可能性があり、これはデバッグするのが面倒です...特に他の誰かのコードを見ている場合は特にそうです。


10

私の哲学は、コードを読みやすくすることですが、なぜそれをしないのですか?

明らかに、どこかで線を引く必要があります。たとえば、簡潔な変数名と過度に記述的な変数名の中間にある幸せな媒体を見つけることです。しかし、ブラケットは本当にエラーを回避し、コードの可読性を向上させます。

プログラマーになるほど賢い人は、ブラケットのないステートメントに起因するバグを回避するのに十分賢くなると主張できます。しかし、正直言って、スペルミスのような単純なものにつまずかれたことは一度もないでしょうか。このようなマニューシャは、大規模なプロジェクトを見ると圧倒されます。


7
もちろん、これは非常に主観的です。それらをオフにしておくと、読みやすさが向上します。
Brian Knoblauch

確かに、括弧を省略しても、他の人が述べたように、1つの行を保持します。私は何度も噛まれましたが、複数行のブラケットのないステートメントです。あなたがそれを探すことを知っているとしても、それはまだ時々あなたを得ることができます。
James McMahon、

10

常に例外はありますが、次のいずれかの形式の場合に限り、中括弧を省略しないように主張します。

if(x == y)
   for(/* loop */)
   {
      //200 lines
   }

//rampion's example:
for(/* loop */)
{
   for(/* loop */)
      for(/* loop */)
      {
         //several lines
      }
}

それ以外は問題ありません。


4
悪い例。どちらの場合も、200行のforループを独自の方法、またはできればいくつかの方法に因数分解します。
アダムJaskiewicz 2008

2
確かに、それは起こります。さらに、ブロックがリーダーの画面の高さよりも長い場合は常に、この問題が発生します。また、コードリーダーの画面の高さを制御することはできません。両側に数行しか表示されない場合があります。
ランピオン

2
それは起こります。それはそれ起こるべきであるという意味ではありません。
アダムJaskiewicz 2008

3
@AdamJaskiewiczそうです。それは起こります。何起こるかというより、何起こるかについて考えなければなりません。何起こるかを制限できれば、バグについて心配する必要はありません。
Beska 2012

10

一番下のコード(複数のusingステートメント)を使用することもありますが、それ以外の場合は常に中かっこを使用します。コードがわかりやすくなるだけです。ステートメントがブロックの一部であること(したがって、おそらくifなどの一部であること)は、単なるインデント以上のものから明白に明らかです。

私は見ました

if (...)
    foo();
    bar();

バグが私(または「私と同僚」-実際にはバグを紹介しなかった)に一度かみついた。これは、当時の私たちのコーディング標準がどこでもブレースを使用することを推奨したという事実にもかかわらずでした。あなたが見たいものを見るので、それを見つけるのに驚くほど長い時間がかかりました。(これは約10年前のことです。たぶん、今はもっと早く見つけたでしょう。)

もちろん、「行末のブレース」を使用すると、余分な行が減りますが、個人的にはそのスタイルが嫌いです。(私は仕事でそれを使用しており、予想よりも不快ではないことがわかりましたが、それでも少し不快です。)


一貫性は実際のスタイルよりも重要であると私はいつも主張していますが、なぜ使用の場合にのみ例外を設ける必要があるのですか?
ボブ

@ボブ:良い点、そして私は時々それを行うだけです。かなり明白であるusingsをネスト(とのみusings)のように、あなたはまだで終わる-私はここに実際の理由:)実際には、合理的な理由があります持っているふりをしたくないブロックを。すぐには危険がわかりません。
Jon Skeet、

もちろん、何の危険もないわけはありません
Jon Skeet、

1
このバグの最善の解決策:Pythonを使用します。(もちろん、
冗談

10

このコンピュータープログラミングの分野(あなたの多く)の仲間が、単一行ブロックで中かっこをスキップした場合の潜在的なバグの見通しに悩まされていないことに感銘を受け、謙虚に感じています。

それは私が賢くないことを意味すると思います。私はこれを何度も間違えました。私はこれについて他の人の間違いをデバッグしました。このため、ソフトウェアがバグとともに出荷されるのを見てきました(VS2002を実行しているマシンへのRDPとウォッチウィンドウフォントが不安定になります)。

コーディングスタイルを変更することで回避できた可能性のあるすべてのミスを見ると、リストは非常に長くなっています。これらの各ケースで自分のアプローチを変更していなければ、おそらくプログラマーとしてそれを実現することはなかっただろう。繰り返しますが、私は頭が悪いと思います。これを補うために、私は長い間、単線ブロックのブレースを頑固に使用してきました。

とはいえ、モーセが私たちに教えてくれたときよりも、「一行ブロックでは中括弧を使用する」というルールの重要性が低くなる、世界のいくつかの変化がありました。

  • 一部の一般的な言語では、プログラマーが行うように(Pythonなど)、コンピューターにインデントを読み取らせることで問題を解決します。

  • 私のエディターは自動的にフォーマットを設定するので、インデントによって誤解を招く可能性が大幅に減少します。

  • TDDは、1行のブロックで混乱したためにバグを導入した場合、バグをすばやく発見する可能性がはるかに高くなることを意味します。

  • リファクタリングと言語表現力は、私のブロックがはるかに短く、単一行のブロックが以前よりはるかに頻繁に発生することを意味します。仮に、ExtractMethodの冷酷なアプリケーションを使用すると、プログラム全体で単一行のブロックしか持てない可能性があります。(どうなるのだろう?)

実際、冷酷にリファクタリングし、単一行ブロックで中括弧を省略することには、明確な利点があります。中括弧が表示されると、頭の中で「複雑さここに注意!」という小さなアラームが鳴ることがあります。これが標準だったと想像してみてください:

if (condition) Foo();   // normal, everyday code

if (condition) 
{
    // something non-trivial hapening; pay attention!
    Foo();
    Bar();
}

コーディング規約を「単一行のブロックには中括弧を付けることはできない」または「条件と同じ行にブロックを置くことができ、すべてが80文字以内に収まる場合」のようなものに変更するという考えに私は心を開いています。ブレースを省略します。」わかります。


私は以前のJavaプログラマーとして、自動化されたフォーマットが問題の真の答えであることについて完全に同意する必要があります。エディターに中括弧を自動的に追加させる必要はありません-自動インデントだけで、あいまいさを回避するのに役立ちます。もちろん今はPythonに切り替えたので、そもそもコードを適切にフォーマットすることに慣れてきました。
アランプラム

ブレースについても同じように感じます。それはすべて複雑さについてです。理想的には、ラインブロックは1つだけです。それは私が読みやすさと呼んでいるものであり、不必要な中括弧ではありません。
Igor Popov

9

3つの規則のうち:

if(addCurleyBraces()) bugFreeSofware.hooray();

そして:

if(addCurleyBraces())
    bugFreeSofware.hooray();

と(開始と終了のブレースを使用したインデントスタイルを表します):

if(addCurleyBraces()) {
    bugFreeSofware.hooray();
}

私は最後のものを好む:

  • すべてのifステートメントが統一された方法で記述されていると、読みやすくなります。
  • これにより、ソフトウェアの堅牢性が高まり、バグがなくなります。ただし、すべての最新のIDEと高度なテキストエディターには素晴らしい自動インデント機能があり、コメントの書式をめちゃくちゃにしたり、チームの標準に違反したりしない限り、誰でも使用できると思います(多くの場合、カスタムの書式設定スキーマを作成できます)チームと共有します)。ここでの私のポイントは、インデントが正しく行われていれば、バグが導入されるリスクが少し軽減されるということです。
  • 実行するブール式とステートメントを別の行に置くことを好みます。デバッグのために行をマークできるようにしたい。ステートメントをマークしてステップするIDEを使用している場合でも、それはインタラクティブな操作であり、デバッグを開始した場所を忘れるか、少なくともコードをいくつかステップ実行するのに少し時間がかかります回(デバッグ中に毎回手動で位置をマークする必要があるため)。

8

中括弧の使用に対する主な議論は、それらが追加の行を使用し、追加のインデントが必要であるということです。

行は(ほぼ)無料です。コードの行数を最小限に抑えることは目的ではありません。

また、インデントはブレースの使用とは無関係です。カスケードの「使用」の例では、中括弧を省略した場合でも、インデントする必要があると思います。


8

私は整頓された簡潔なコードを書くことを強く信じていますが、中括弧を常に使用します。特定のコード行が存在するスコープをすばやく確認するのに便利な方法であることがわかりました。曖昧さはありません、それはあなたの前に明示的に提示されているだけです。

好みのケースだと言う人もいるかもしれませんが、プログラムの論理フローが内部的に一貫していると、追跡がはるかに容易になると私は思います。

if(x < y)
    x = y;
else
    y = x;

そして、このような別のもの;

if(x < y)
{
    x = y;
    x++;
}
else
{
    y = x;
    y++;
}

私はただ一つの一般的なスタイルを選び、それに固執することを好みます:)


7

あなたはワンライナーと非一つの制御なステートメントからの分離に伴いライナー、(領域がある場合の主な問題の一つはforifあなたが持っているもの)となステートメントの終わりを。

例えば:

for (...)
{
  for (...)
    for (...) 
    {
      // a couple pages of code
    }
  // which for block is ending here?  A good text editor will tell you, 
  // but it's not obvious when you're reading the code
}

4
とにかくforループに数ページのコードがあるのはなぜですか?
アダムJaskiewicz 2008

b / c私は鈍感な塊であり、関数呼び出しの「コスト」を取り除くことに夢中になっています。:)
ランピオン

4
数ページのコードは、通常、別の関数にあるべきです。
ジョナサンレフラー

1
すみません、私はそのような土塊の役割を演じていたのです。ただし、小さなビューポートで表示した場合、同じ問題が短い領域でも発生する可能性があると私は思います。そして、それはコーダーの制御の外です。
ランピオン

7

私はかつて「中かっこは必須です!」の巨大な支持者でしたが、単体テストを採用して以来、私の単体テストは次のようなシナリオからブレースレスステートメントを保護することがわかりました。

if (foo)
    snafu();
    bar();

優れた単体テストを使用すると、読みやすさを向上させるために、単純なステートメントでは中かっこを自信を持って省略できます(そうです、これは主観的な場合があります)。

または、上記のようなものについては、おそらく次のようにインライン化します。

if (foo) snafu();

そうすれば、条件にbar()を追加する必要がある開発者は、中括弧がないことを認識し、追加することができます。


2
あなたは「それは必要ない」と言ってから、それを使用する理由を示しました。
tvanfosson 2008

4
それを見つけるために単体テストに依存することはありません。LINT多分、ユニットテストはありません!
クリステン

2
@クリステン-ユニットテストのアイデアは、メソッドの動作をアサートすることです。(上記のように)動作が変化すると、単体テストは失敗します。そこには問題がありません。
Liggy、2009年

しかし、UTに行く前に修正する必要がある明白な明白なものをピックアップするためにユニットテストに依存するのはなぜですか?
Andrew

7

個人的な判断を使用してください。

if (foo)
  bar();

それ自体は問題ありません。あなたが本当にこのようなものを後で入れている警戒心について本当に心配しているのでない限り:

if (foo)
  bar();
  baz();

moronsを心配していない場合は問題ありません(私はそうではありません-基本的なコード構文を正しく取得できない場合は、これが最小の問題です)>

引き換えに、それははるかに読みやすいです。

残りの時間:

if (foo) {
  bar();
  baz();
}

私が覚えている限り、これは私のお気に入りです。さらに:

if (foo) {
  bar();
  baz();
} else {
  qux();
}

私のために働く。

垂直方向のスペース自体はそれほど重要ではなく、読みやすさは重要です。行の開始ブレースは、目が次の行に移動するまで、構文要素の会話を停止します。私が好きなものではありません。


最初のスタイルを好むのは、すぐに戻るか、何か問題が発生した場合にエラーをスローする必要があるときだけです。のようにif (parameter == null) return null;
nawfal 2014

7

さて、これは死に答えられた古い質問です。追加するものがあります。

最初に私はただブレースを使用しなければならない。それらは読みやすさを助けるだけであり、アセンブリを書いているのでない限り、(自分自身と他の人にとって)読みやすさは優先リストで非常に高くなければなりません。常に読み取り不可能なコードは、常にバグを引き起こします。中かっこによってコードが占める領域が多すぎる場合は、メソッドが長すぎる可能性があります。正しく実行している場合、メソッドのほとんどまたはすべてが1つの画面の高さに収まるはずであり、検索(F3)がお友達です。

今私の追加のために:これに問題があります:

if (foo) bar();

bar()が実行される場合にのみヒットするブレークポイントを設定してみてください。コードの後半にカーソルを置くことでC#でこれを行うことができますが、これは明白ではなく、少し面倒です。C ++では、それはまったくできませんでした。この理由により、C ++コードに取り組んでいる最上級の開発者の1人は、「if」ステートメントを2行に分割することを強く求めています。そして私は彼に同意します。

これを行います:

if (foo)
{
    bar(); //It is easy to put a breakpoint here, and that is useful.
}

2
バーを右クリックして[ブレークポイントの挿入...]を選択します。あなたのツールを知っています。
ボブは、

インジケーターバーを右クリックしても何も起こりません。テキストを右クリックするということですか?とにかく、「if」ステートメントがtrueで「bar()」がその行にある場合にのみブレークポイントにヒットする場合は、その行の任意の場所にカーソルを置いてF9キーを押すか、指標マージン。ただし、すべてのコードが1行にある場合は、カーソルを「bar()」に置くか、F9キーを押す前にその場所で右クリックする必要があります。インジケータマージンをクリックしても機能しません( ' if ')。「難しい」というわけではありませんが、コードが2行にある場合はそれほど集中する必要はありません。

あ、ははは、「bar()」を右クリック。あなたはテキストを意味しました。ゴッチャ。承知しました、または単にF9キーを押してください...

>> F9キーを押す前に、「bar()」にカーソルを置くか、そこを右クリックする必要があります(F9キーを押すか右クリックする前に、カーソルを正確にそこに配置することを意味します)

7

中かっこ付きのコードが多くのスペースを占有しないようにするために、「Code Complete」という本で推奨されている手法を使用します。

if (...) {
    foo();
    bar();
}
else {
    ...
}

それはすべてのブラケットペアの1行を保存しdownmoddedた理由私は私がそれをすべての時間使用し得るいけない
エリック・

2
これは、K&Rスタイルとしてより一般的に知られています。KernighanとRitchieによる書籍The C Programming Languageに基づいています:en.wikipedia.org/wiki/The_C_Programming_Language_( book 。そしてそれはあなたを改造させてはならない。
jmucchiello 2008

ありがとう!個人的な好みだと思いました。私はこの構文が私を困らせると思っていましたが、Code Completeを読んだ後でそれを採用し、今では本当に楽しんでいます。
Nathan Prather、

私はこの理由の上のすべての答えを読んでいて、「なぜ誰もこれをまだ提案していないのですか???」と考えていました。閉じブラケットを閉じているブロックに合わせます。つまり、「if」や「while」などであり、意味のない「{」ではありません。+1。
nickf 2009年

左中括弧が常に単独で行に配置されている場合if、1つのインデントされた行が続くものは、中括弧を必要とせずに1つのステートメントを制御していると視覚的に認識されます。したがって、open-brace-by-itselfスタイルは、ifステートメントが意味的に単一のアクション(たまたま単一のステップしか含まない一連のステップとは異なる)であるものを制御する状況で、空白を節約します。たとえば、if (someCondition)/ `throw new SomeException(...)`です。
スーパーキャット2014

6

いくつかのコードがあるとしましょう:

if (foo)
    bar();

そして、他の誰かがやって来て追加します:

if (foo)
    snafu();
    bar();

それが書かれている方法によると、bar(); 無条件に実行されるようになりました。中括弧を含めることで、この種の偶発的なエラーを防止できます。コードは、そのような間違いを困難または不可能にするような方法で書かれるべきです。コードレビューを行っているときに、特に複数の行にまたがって中かっこが見つからない場合は、欠陥を作成します。正当化される場合は、このようなエラーが発生する可能性が再び最小限に抑えられるように、1行に収めてください。


その点はすでに質問で述べられていた。
マイクスコット

実は違います。はい、彼はこの種のバグの可能性について言及しましたが、私はあなたのコードをバグプルーフにし、ベストプラクティスの一部としてエラーの可能性を取り除くことについて話していました。
エリー

本当にバグ証明コードのようなものはありますか?
ボブ

いいえ、でももっと難しくすることができます。ジェイソンコーエンによる「ベストキープシークレットオブピアコードレビュー」を読んで(ここのいくつかのページの横にあるリンクを参照)、これを行う理由についての理解を深めてください。
エリー

このマイクスコットは誰ですか、なぜ彼は回答警察ですか?何が明白かを人々が述べなければならないというのは、いつも私を悩ませます。では、なぜユーザーがこの問題について投稿している追加の説明についてMikeがコメントし続けなかったのですか。すべての回答が質問に言及しているわけではありませんか?
bruceatk 2008

6

線を減らすことは、中括弧を削除するための本当に良い議論ではありません。メソッドが大きすぎる場合は、小さな要素にリファクタリングするか、再構築する必要があります。そうすることで、中括弧を外すだけで読みやすさが向上することは間違いありません。


5

最初の例のように、適切な場合は常に省略します。一目で確認して理解できる簡潔で簡潔なコードは、1行ずつスクロールして読み取る必要があるコードよりも、保守、デバッグ、および理解が容易です。ほとんどのプログラマーはこれに同意するでしょう。

複数の入れ子やif / else句などを使い始めると手に負えなくなるのは簡単ですが、ほとんどのプログラマはどこに線を引くかを指示できるはずです。

それはif ( foo == 0 )vs の議論のようなものだと思いますif ( 0 == foo )。後者は、新しいプログラマー(場合によっては退役軍人の場合もある)のバグを防ぐ可能性がありますが、前者の方がコードを保守しているときにすばやく読み、理解するのが簡単です。


4

ほとんどの場合、企業またはFOSSプロジェクトのどちらであっても、コーディング標準として組み込まれています。

最終的には、他の誰かがあなたのコードを理解する必要があり、各開発者が作業しているコードのセクションの特定のスタイルを理解しなければならないことは、大きな時間の浪費です。

また、誰かが1日に複数回PythonとCish言語の間を行き来していると想像してみてください... Pythonでは、インデントは言語のブロック構文の一部であり、引用するような間違いを犯しがちです。


pythonに関するコメントの+1。言語を絶えず切り替えるとき、私はいつでも自分がいかに「ばかげている」のかと驚きます。
ケナ

3

より安全な面でエラーが発生しました-修正する必要のない可能性のあるバグがもう1つあります。

私のすべてのブロックが巻き毛で包まれていれば、個人的にはより安全だと感じます。ワンライナーの場合でも、これらは簡単に間違いを防ぐための単純な表記法です。これにより、ブロックの本体がブロックの外側にある次のステートメントと混同されないように、ブロックの内容を明確に理解できるという意味で、コードが読みやすくなります。

ワンライナーがある場合、通常は次のようにフォーマットします。

if( some_condition ) { do_some_operation; }

行があまりにも扱いにくい場合は、以下を使用します。

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