質問
これは聖戦ではないし、「どちらが優れているか」という問題でもない。
単一ステートメントの if ブロックに次の形式を使用する利点は何ですか。
if (x) print "x is true";
if(x)
print "x is true";
とは対照的に
if (x) { print "x is true"; }
if(x) {
print "x is true";
}
括弧なしで単一ステートメント if をフォーマットする場合 または、プログラマを知っている人がいますか。そもそも、あなたや彼らがこのスタイルを採用するきっかけとなったのは何ですか?これによってどのようなメリットがもたらされるのか、特に興味があります。
アップデート:最も人気のある回答は実際の質問を無視しているため(たとえそれが最も賢明なアドバイスを示していたとしても)、ここでは括弧なしの専門家をまとめました。
- コンパクトさ
- 一部の人には読みやすくなる
- 括弧はスコープを呼び出しますが、場合によっては理論的なオーバーヘッドが発生します。
解決
これを見つけました:
if( true ) {
DoSomething();
} else {
DoSomethingElse();
}
これよりも良い:
if( true )
DoSomething();
else
DoSomethingElse();
こうすることで、後で私 (または他の誰か) がブランチの 1 つにさらにコードを追加するためにこのコードに戻ってきた場合でも、コードを中括弧で囲むのを忘れることを心配する必要がなくなります。私たちの目はインデントを私たちがやろうとしていることへの手がかりとして視覚的に認識しますが、ほとんどの言語はそうではありません。
他のヒント
私は if のテストと本体を同列に置くスタイルは大嫌いです。
これは、行を共有すると、多くのデバッガでは if の本体にブレークポイントを設定できなくなるためです。ブレークポイントは通常、行番号に基づいているためです。
常にブレースを使用することは良い考えですが、「誰かがコードのラインを追加してブレースを追加するのを忘れた場合はどうなるか」と常に与えられている標準的な答えは常に与えられています。かなり弱い理由です。
最初から中括弧を付けないことによって発生する可能性のある微妙なバグがあります。私にも何度か同じことが起こりましたし、他のプログラマにも同じことが起こったのを見てきました。
それは、何の罪もなく、単純な if ステートメントから始まります。
if (condition)
do_something();
else
do_something_else();
それはそれでいいことだ。
その後、誰かが現れて、if に別の条件を追加します。&& を使用して if ステートメント自体に追加することはできません。ロジックが正しくないため、別の if を追加します。現在、次のものがあります。
if (condition)
if (condition2)
do_something();
else
do_something_else();
問題がわかりますか?正しく見えるかもしれませんが、コンパイラーはそれを異なるように認識します。それは次のようになります。
if (condition)
if (condition2)
do_something();
else
do_something_else();
つまり、まったく異なるものになります。コンパイラはフォーマットを気にしません。else は最も近い if と一致します。一方、人間は書式設定に依存しているため、問題を簡単に見落とす可能性があります。
いつも使っています
if(x)
{
print "x is true";
}
中括弧を省略すると、コードを管理している人が現在の行の後に行を追加すると、if 句に追加していると誤って認識する可能性があります。
私が使う
if (x) { DoSomething(); }
複数行の場合もありますが、私は括弧なしの 1 行の方が好きです。
if (x) DoSomething(); else DoSomethingElse();
外部の括弧は視覚的に攻撃的であることがわかりましたが、別のステートメントを追加するときにブラケットを追加しない上記の間違いの1つを作成したことはありません。
if
{
// code
}
else
{
// else code
}
コードのブロックが (中括弧も含めて) 並んでいるのが好きだからです。
コードを書くと:
if(x)
print "x is true";
6 か月後、新しい行を追加する必要があります。中かっこがあると、入力する可能性が大幅に低くなります。
if(x)
print "x is true";
print "x is still true";
これと比較すると、論理エラーが発生します。
if(x) {
print "x is true";
print "x is still true";
}
したがって、中括弧を使用すると、そのような論理エラーが読みやすくなり、回避しやすくなることがわかりました。
Matt (上記 3) と同様に、私は次のことを好みます。
if (x)
{
...statement1
...statement2
}
そして
if (x)
...statement
else
...statement
後から誰かが現れて、複数行の if ブロックを形成するために中括弧を追加する必要があることに気づかないかもしれないと考えるのは、かなり奇妙だと思います。それが彼らの能力を超えているなら、他のことは何なのかと思います!
単一ステートメントの if ブロックに中括弧がありません:
長所:
- 文字数が少なくなる
- よりクリーンな外観
短所:
- 均一:if ブロックがすべて同じに見えるわけではない
- ブロックにステートメントを追加するときにバグが発生する可能性があります。ユーザーが中括弧を追加するのを忘れると、新しいステートメントが if でカバーされなくなる可能性があります。
次のように:
if(x)
print "x is true";
print "something else";
私は関数の先頭でブレーク条件をテストするときは 1 行のみにする傾向があります。これは、このコードをできるだけシンプルですっきりとしたものにしたいためです。
public void MyFunction(object param)
{
if (param == null) return;
...
}
また、中括弧を避けて if 節のコードをインライン化したい場合は、if 節に新しい行を追加する人にとって、括弧を追加する必要があることが明らかになるように、コードを 1 行にまとめることもできます。
私が使う
if (cond) {
...
} else {
...
}
- すべてに常に中括弧を含める必要があります。今は if ブロックに 1 行しかないとしても、後でさらに追加します。
- 中括弧はスペースを無駄に浪費するため、独立した行には配置しません。
- 読みやすさを考慮して、ブロックを条件文と同じ行に置くことはほとんどありません。
ジョエル・スポルスキー 良い記事を書きました: 間違ったコードを間違ったものに見せる
彼は特にこの問題について言及しています…
if (i != 0) foo(i);
この場合、コードは 100% 正しいです。それはほとんどのコーディング規則に準拠しており、それには何の問題もありませんが、内臓の単一ステートメント本体がブレースに囲まれていないという事実はあなたを悩ませているかもしれません。そこに別のコード行を挿入する可能性があります
if (i != 0) bar(i); foo(i);
…そして、ブレースを追加するのを忘れて、したがって誤ってfoo(i)無条件になります!したがって、ブレースにないコードのブロックが表示されると、不安になる汚れの小さな、おしっこしたスープを感じるかもしれません。
彼はあなたに次のように提案しています…
…あなたの鼻の不汚人のためにあなたのコードがあなたのコードを正しくする可能性が高くなるように、あなたのコードを故意にアーキテクチャ化します。
私は必要のない中括弧を使用するのが嫌いです。メソッドの行数が肥大化し、読みにくくなるような気がします。したがって、私はほとんどの場合次のようにします。
if (x)
print "x is true"
for (int i=0; i<10; i++)
print "y is true"
などなど。別のステートメントを追加する必要がある場合は、中括弧を追加するだけです。R# などを持っていなくても、それは非常に小さなことです。
それでも、ステートメントに 1 行しかない場合でも、中括弧を使用する場合があります。それは、行が特に長い場合、または「if」内にコメントが必要な場合です。基本的には、自分の目に映りやすいと思われるものをそのまま使用しています。
ホワイトスペースはあなたの友達です...
でも、繰り返しになりますが、私は次のことが好きです。
if (foo)
{
Console.WriteLine("Foobar");
}
真剣に、誰かが原因でコードにバグがあったのはいつですか。
if (a)
foo();
bar();
ええ、絶対に...* ここでの唯一の本当の「プロ」は、周囲のコードのスタイルにただ一致させ、美学の戦いを大学を出たばかりの子供たちに任せることです。
*(foo() の場合には注意してください。バー();これはマクロ展開でしたが、それはマクロの問題であり、if の中括弧の問題ではありません。)
if (x) {
print "x is true";
}
else {
do something else;
}
私はいつも中括弧を入力します。それはただの良い習慣です。考えることに比べれば、タイピングは「作業」ではありません。
条件の前のスペースに注意してください。これにより、メソッド呼び出しのように見えなくなります。
他の方法は次のように書くことです:
(a==b) ? printf("yup true") : printf("nop false");
これは、次のように単純な条件を比較する値を保存する場合に実用的です。
int x = (a==b) ? printf("yup true") : printf("nop false");
if (x)
{
print "x is true";
}
同じ列内で開始中括弧と終了中括弧を使用すると、不一致の中括弧を見つけやすくなり、ブロックが視覚的に分離されます。「if」と同じ列で中括弧を開くと、ブロックが条件文の一部であることが簡単にわかります。中括弧のみを含む行によってブロックの周囲に余分な空白が作成されるため、コードを流し読みするときに論理構造を簡単に見つけ出すことができます。常に明示的に中括弧を使用すると、後でコードを編集して、どのステートメントが条件文の一部でどのステートメントがそうでないかを読み間違えるという問題を回避できます。インデントは実際と一致しない可能性がありますが、中括弧で囲むことは常に一致します。
中括弧なしが受け入れられると思われるのは、メソッドの開始時にパラメーターが変数をチェックするときだけです。
public int IndexOf(string haystack, string needle)
{
// check parameters.
if (haystack == null)
throw new ArgumentNullException("haystack");
if (string.IsNullOrEmpty(needle))
return -1;
// rest of method here ...
唯一の利点はコンパクトさです。次のことが明らかな場合、プログラマは不必要な {} を歩き回る必要はありません。
- メソッドは真のブランチで終了します
- これらはすべてワンライナーであることは明らかです
そうは言っても、他の人が述べた理由により、私はプログラム ロジックに対して常に {} を使用します。中かっこを削除すると、中かっこが存在しないときに精神的にかっこつけてしまい、コードに微妙な欠陥が生じやすくなります。
H8ers の皆さん、くそー、私は独断的なルールにはあまり興味がありません。特定の状況では、特定の幅を超えない場合は、実際にはコンパクトさを優先します。次に例を示します。
if(x > y) { xIsGreaterThanY(); }
else if(y > x) { yIsGreaterThanX; }
else { xEqualsY(); }
私にとって、これは以下よりもはるかに読みやすいです。
if( x > y ){
xIsGreaterThanY();
}else if( x < y){
yIsGreaterThanX();
}else{
xEqualsY();
}
これには、より多くのロジックをネストされた if-else ブロックにまとめ続けるのではなく、(私がやったように) ロジックをメソッドに抽象化することを人々に奨励するという追加の利点もあります。また、7 行ではなく 3 行を使用するため、複数のメソッドやその他のコードを表示するためにスクロールする必要がなくなる可能性があります。
私が括弧付きスタイルを好むのは、主に目に明確な開始点と終了点を与えるためです。これにより、ステートメントに実際に何が含まれているか、そしてそれが実際に if ステートメントであることが簡単にわかります。おそらく小さなことですが、それが私がそれを使用する理由です。
働いているチーム内で一貫性がある限り、それほど問題にはなりません
誰もが同じことをすることが重要です
ワンライナーの if ステートメントを括弧で囲むことには、後であなた (またはコードを保守または変更する他のプログラマー) がその条件ブロックの一部にステートメントを追加する必要がある場合に、頭痛の種から身を守ることができるという非常に賢明な利点があります。
次のようなことをすると:
if(x)
{
somecode;
}
else
{
morecode;
}
これは、長い間生きているコード上のソースコントロールとプリプロセッサディレクティブの方がうまく機能します。声明を不注意に破ったり、追加の行を追加したりすることなく、#IFを追加する方が簡単です。
慣れるのは少し奇妙ですが、しばらくすると非常にうまく機能します。
それが if の 1 行 (およびオプションで else の 1 行) の場合は、括弧を使用しないことを好みます。より読みやすく、簡潔になっています。私がそれを好むと言うのは、それは純粋に好みの問題だからです。常に中括弧を使用しなければならないという基準を強制しようとするのは、ある意味愚かなことだと思いますが。
誰かが if ステートメントの本文に別の行を追加し、(その場合にのみ必要な) 中括弧を追加しないことを心配する必要がある場合、サブビザンチンのコーディング標準よりも大きな問題があると思います。
/* I type one liners with brackets like this */
if(0){return(0);}
/* If else blocks like this */
if(0){
return(0);
}else{
return(-1);
}
私はタブ以外に余分な空白を使用することはありませんが、常に括弧を含めることで時間を大幅に節約できます。
私は、次のキーワードと同じ行に右中括弧を入れるのが嫌いです。
if (x) { print "x is true"; } else { do something else; }
これにより、else 句だけを削除/コメントアウトすることが難しくなります。次の行に follow キーワードを置くことで、たとえば、ある範囲の行を選択し、それらを一度にコメント/コメント解除できるエディタを活用できます。
if (x) { print "x is true"; } //else { // do something else; //}
私はいつもこれを好みます:
if (x) doSomething();
if (x) {
doSomthing();
doOtherthing();
}
ただし、常に言語と実行するアクションに依存してください。中括弧を付けたい場合もあれば、付けたくない場合もあります。コードによって異なりますが、私は一度書いて、10回書き直し、100回読む必要があるようなコーディングをしています。だから、自分のやりたいように、もっと早く読んで理解したいようにやってください。
何があっても、これが私の進む道です!見た目は最高です。
If(x)
{
print "Hello World !!"
}
Else
{
print "Good bye!!"
}
さまざまなコード書式設定スタイルの名前に興味がある場合は、Wikipedia に次の記事があります。 インデントのスタイル.