ブロックifの単一ステートメント-中括弧またはno?[閉まっている]


59

どちらが良い/より一般的に受け入れられていますか?

この:

if(condition)
{
  statement;
}

または:

if(condition)
  statement;

私は最初のものを好む傾向があります。実際にifブロックに属するものを簡単に伝えることができ、他の人が後で括弧を追加する(または忘れてバグを作成する)のを防ぎ、すべてのifステートメントを作成するためです中括弧のあるものとないものの代わりに均一。ただし、2番目のものはまだ構文的に正しく、間違いなくよりコンパクトです。どちらがより一般的に他の人に好まれているかを知りたいのですが。


2
しかし、オープニングブレースの位置が間違っています。それだけは確かです。
クリスチャンマン

多くの言語では、ブロックは声明で、それゆえ、構文的に、それは常に場合(expresion)の文である
インゴ

2
あなたは何について...言語を指定していなかったので、statement if condition;
デイブシェロマン

@クリスチャン-良いもの。それはこれとは別の別の質問でしょうか?
ザンジャミンダーソン

@Ingo-良い点。
ザンジャミンダーソン

回答:


131

2番目はエラーが発生しやすいため、最初の方が優れています。たとえば、何かをデバッグするために一時的にコードをコメントアウトしているとしましょう:

if(condition) 
//      statement;
otherStatement;

または、急いでコードを追加します。

if(condition) 
    statement;
    otherStatement;

これは明らかに悪いことです。一方、最初の人は時々冗長に感じます。したがって、十分に短く単純な場合は、すべてを1行に配置することを好みます。

if(condition) statement;

これにより、構文上のノイズが削減され、コンストラクトが実際に実行されるように見えるため、エラーが発生しにくくなります。この構文が非常に単純で短い条件とステートメントにのみ使用されるとすれば、完全に読みやすくなります。


35
すべてを1行にまとめることの良い点。
ニール・エイトケン

7
@artjomka:ステートメントが長く、独自の行に行かなければならない場合、読みやすさのために中括弧を使用します。ポイントは、あなたがそれを精査するのではなく、それを素早く読んでいる人間にとって明白である、最短で、構文的にノイズの少ない構成が欲しいということです。
dsimcha

15
すでに述べた理由から、ブレース付きのものが好きです。デバッガーで行をステップオーバーするとどうなるかがすぐにはわからないので、私はワンライナーが好きではありません。どの条件が評価されるかを確認するには、別の手順を実行する必要があります。
ジム

10
@TMNの空白は無料で、モニターは大きく、脳はコードの解析に役立つ形状を認識することを学習します。
マーフ

5
@Murph:空白は無料ですか?私はそれを見逃したに違いない。私の画面では、それは本当に多くのスペースを占有します。実際には50%以上です。私の本ではこれは大きな無駄のようです。個人的には、コードの1平方センチあたりのコンテンツを最大化するのが好きです。
コンラッドルドルフ

44

私は常に安全のためにブラケットを使用しています。

あなたがそれを書くとき、それは問題ありませんが、誰かが将来やって来て、それを括弧で囲まずに別のステートメントを挿入することを知っています。


20
人々は実際にこれが起こるのを見ましたか?私はこれを10年間のプログラミングで見たことがないと思います。たぶん私はあまりにも避難してきました。:)
デビッド

9
私はノーと言いたいのですが、悲しいことに私はそれを見ました。
ニール・エイトケン

13
ブラケットを使用することを決して忘れないように、常にブラケットを使用します。
マーフ

12
+1から@Murph。誰もいないとき、そして駐車場でターンシグナルを使用するのと同じ理由です!
ダン・レイ

7
これは、ブランチからトランクへ、またはブランチ間でマージするときのエラーを防ぐのに役立つプラクティスです。
JBRウィルキンソン

27

可能であれば、括弧なしのバージョンを好みます

以下の説明は長めです。どうか我慢してください。このスタイルを好む理由を説得します。また、通常の反論が成り立たないと思う理由も説明します。

(近く)空の行は無駄です

この理由は、閉じ括弧には余分なコード行が必要であり、スタイルに応じて開き括弧も必要なためです。1

これは大したことですか?表面的には、ありません。結局のところ、ほとんどの人はコードに空行を入れて論理的にわずかに独立したブロックを分離するため、読みやすさが大幅に向上します。

しかし、私は垂直スペースの浪費を嫌います。最新のモニターには、実際には十分な水平スペースがあります。しかし、垂直方向のスペースはまだ非常に限られています(直立したモニターを使用する場合を除き、これは珍しいことではありません)。この限られた垂直方向のスペース問題です:個々のメソッドはできるだけ短くする必要があり、対応するブレース(または他のブロック区切り記号)は画面の高さの差以下でなければならず、ブロック全体が表示されないことが広く認識されていますスクロール。

これは根本的な問題です。画面上でブロック全体が表示されなくなると、把握が複雑になります。

結果として、冗長な空の行を嫌います。独立したブロックを区切るために単一の空行が重要である場合(このテキストの視覚的な外観を見てください)、連続した空行は私の本では非常に悪いスタイルです(そして、私の経験では通常、初心者プログラマーのサインです)。

同様に、単にブレースを保持し、節約できる可能性のあるラインもそうでなければなりません。中括弧で区切られた単一ステートメントブロックは、1〜2行を無駄にします。画面の高さあたり50本の線だけで、これは顕著です。

中かっこを省略しても害はありません

中かっこを省略することに対する引数が1つだけあります。誰かが問題のブロックに別のステートメントを後で追加し、中かっこを追加するのを忘れて、コードのセマンティクスを不注意に変更するということです。

これは確かに大したことでしょう。

しかし、私の経験ではそうではありません。私はずさんなプログラマーです。それでも、プログラミングの10年間で、シングルトンブロックに余分なステートメントを追加するときに中かっこを追加することを忘れたことは一度もありません

これはよくある間違いであると信じることさえできません。ブロックはプログラミングの基本的な部分です。ブロックレベルの解決とスコーピングは、プログラマーにとって自動的に根付く精神的なプロセスです。脳はそれを行うだけです(そうでなければ、プログラミングについての推論はずっと難しくなります)。中括弧を置くことを覚えておくために必要な追加の精神的な努力はありません。プログラマーは、結局、新しく追加されたステートメントを正しくインデントすることも覚えています。そのため、プログラマーはブロックが関係していることをすでに精神的に処理しています。

今、私はいない括弧を省略すると、ミスを起こさないことを言って。私が言っているのは、何らかの形で証拠がないということです私たちは、単に知らない、それが害を引き起こすかどうか。

だから誰かが科学実験から集められたハードデータを見せて、これが実際に問題であることを証明するまで、この理論は「まあまあの物語」のままです。なければならない引数として使用します。


1この問題は、ブレースを含むすべてを同じ行に置くことで解決される場合があります。

if (condition)
{ do_something(); }

しかし、ほとんどの人がこれを軽deしていると言っても安全だと思います。さらに、中括弧なしのバリアントと同じ問題があるため、両方の世界で最悪です。


6
中括弧を省略すると読みやすさが損なわれ、コードが変更されたときに問題が発生しやすくなります。
ジョシュK

15
@Josh:Pythonなどの言語が示すように、最初の主張はばかげています(そうでないと思われる場合は、証拠でそれをバックアップしてください)。2番目は、私の答えで反論されました。バックアップする証拠はありますか?そうでなければ、あなたのコメントは、あなたが実際に私のテキストを読んでいないことを示しています。それを批判する前にそうしてください。
コンラッドルドルフ

8
あなたの考えを+1しますが、あなたの立場は自滅的だと思います。あなたは「科学実験から収集されたハードデータを見せて、これが実際に問題であることを示しています」と言いますが、あなたの立場を守るために逸話的な経験(あなた自身)に頼ります。「私の経験では...私の10年の経験では...信じられないことだ...」などと言います。科学実験から収集された「ブレースを省略しても害はない」という主張を裏付けるハードデータを表示できますか?意見を支持する場合、個人的な経験は問題ありませんが、あなたが喜んで提供する以上の「証拠」を求めないでください。
ベッドウィール

3
@bedwyr:しかし、質的な違いがあります。まず、私は実際にデータに説得されることを明確にします。また、私は単なる仮説であり、データに裏打ちされていないことも明確にします。第二に、私は(少なくとも私には)主張が偽であるという信念と、それを裏付ける必要がある理由についてもっともらしい議論を述べました。それが私を第三に導きます:ここでの責任は、彼らの主張を証明する反対であり、それを反証することではありません。そして、妥当性の問題に加えて、コーディングスタイルをサポートする1​​つの無関係な事実上の議論を示しました。
コンラッドルドルフ

4
@Konrad- インデントが重要であり、したがって中括弧が暗黙的であるため、Python それ以外の場合表示されません。ここにいる優秀な優秀なプログラマーは、たぶん間違いを犯すことはほとんどないでしょう(長年、おそらく数回しか問題が見られませんでしたが)バカなことをするプログラマーは、そもそもコーディング標準が必要な理由の1つです。(そして、期限とストレスが私たちのベストをより良くすることができるからです。)
マーフ

19

二番目に行きます。簡潔で冗長ではありません。

私は最小公分母に書かないようにしているので、他の開発者が今日のプログラミングで最も一般的な制御フロー構造の1つを書く方法を知っていることを期待しています。


11
絶対に!結局、コードを書くのが難しかったなら、それも維持するのが難しいはずです!;-)
スティーブンA.ロウ

3
@Stevenブレースを忘れた場合、ここには他の問題があると思います。
TheLQ

more succint ==冗長性が低い
-UncleZeiv

5
@SnOrfus:余分な2文字は些細なオーバーヘッドであり、非常に一般的な保守ミスを防ぐため、やや皮肉です。マイレージは異なる場合があります;
スティーブンA.ロウ

1
私にとって、インデントは何が起こっているかを明確にします。最初のフォームは余分な画面スペースを消費するため、私にとってはマイナスです。
ローレンペクテル

16

私は以下を使用します(ここでのコンセンサス):

if (condition) {
    any_number_of_statements;
}

また可能:

if(condition) single_compact_statement;

特にC / C ++のような言語ではあまり良くありません:

if(condition) 
    single_compact_statement;

Pythonでの選択はありません;-)


Perl、あなたが使用したいです:

$C = $A**3 if $A != $B;

または

$C = $A**3 unless $A == $B;

(これは擬似コードではありません ;-)


1
私の考えは正確に。if句の後の1行で単一のステートメントが適切に見える場合、中括弧は使用しません。他のifステートメント(または複数行を使用するステートメント)については、常に中括弧を使用します。特に、else句がある場合、各ケースには常に中括弧があります。
エスワルド

9
perlと疑似コードを混同する人を見たことはありません。ランダムな文字はい、擬似コード-いいえ。
ジョーD

3
誰もが...ちょうどPerlインタープリタへの/ dev /ランダムをフックでPerlプログラムジェネレータを作られているのだろうか
クリスチャン・マン

ここでルビーのアプローチが好きです。perlスタイルの単一行<statement> if <condition>または複数行のブロックスタイルif <condition>/ <do something>/を提供しますend(ルビーはブレースを回避するため、ここでは開始ブレースが暗黙的に示されif、終了ブレースはリテラルに置き換えられendます)。奇妙な複数行ですが、実際にはちょうど1行のifステートメントさえ提供していません。
ベン・リー

ワンライナーは、ほとんどのデバッガーでは機能しません( 'if'句のコンテンツが実行される直前にブレークをトリガーすることはできません)。
ピーターモーテンセン

11

中かっこを使用します-上記のすべての理由に加えてもう1つ。

コードのマージ。自動マージによって壊れた単一ステートメントifで作業したプロジェクトで発生することが知られています。恐ろしいのは、コードが間違っていてもインデント正しく見えるため、このタイプのバグを見つけるのは難しいことです。

だから私は中括弧で行く-彼ら自身の行に。そのようにレベルを見つけるのは簡単です。はい、それは垂直スクリーンの不動産を無駄にします、そしてそれは本物の欠点です。バランス上、しかし、私はそれが価値があると思います。


10

中括弧なし。他のプログラマーが私のコードに2番目のステートメントを追加した場合、誰かが私の車を運転させて、彼らが崖を越えたのと同じくらい私のせいではありません。


3
まさに!彼/彼女が構文を知らないのは私たちのせいではありません。
kirk.burleson

3
悪い例。良いものは、ペダルの置き場所が間違っている-ブレーキではなくガスです。それはあなたの車ですので、あなたは誰も気にしません。彼らがあなたのペダルのユニークなポジショニングについて知らないという問題があります。この場合、あなたは優れた自動車技術者ですか?
yegor256

酔っ払っている可能性があることを知って車を渡せば、それはあなたのせいです。同様に、メンテナンスを容易にするために、将来の開発者についてできる限り想定しないようにする必要があります。
アラムコチャ

8

ここでこの議論を複数回行ってきましたが、全体的なコンセンサスは常に中括弧を使用することです。主な理由は、読みやすさ/保守性に関するものです。

ifブロックにコードを追加する必要がある場合は、中括弧を覚えたり検索したりする必要はありません。将来のプログラマがコードを読むとき、中括弧は常に明確です。

プラス面として、ReSharperはVisual Studioの怠zyなプログラマーにブレースを自動的に追加します。他のIDEにも同様に追加するアドオンがあると思います。


3
私は明確に読みやすさの主張を購入しません。Pythonは、最も読みやすい言語の1つであり、区切り文字を必要としません。その主張は真実ではありません。また、メンテナンス性に関する主張は、今のところ証明されておらず、繰り返し再ハッシュされているため購入しません。しかし、この場合、私は実際に経験的証拠に非常に興味があります。これは、研究が非常に簡単に見つけて解決できるものです。
コンラッドルドルフ

Pythonは区切り文字の代わりにインデントを使用するため、暗黙の有効な比較ではありません。
マーフ

@Konrad-経験的証拠:私が新しいプログラマーだったとき、前のプログラマーがブレースに悩まされていなかったことに気付かずに、個人的にブレースされていないifブロックにコードを追加しました。他の人が自分の目でこれをしているのを見てきました。確かに、コードを実行した後に誰かが問題を見つけるのに助けが必要だと思ったのは一度だけでしたが、それは悪いテストスキルに関係していました。
シモニーク

@shimonyk:基本的にあなたの観察は、この問題は取るに足らないという私の主張を裏付けていますか?ところで、個人的な観察は逸話であり、経験的証拠とはみなされません。
コンラッドルドルフ

@Konradとてもよく、あなたのソースも引用してください。私はあなたが参照しているピアレビュー二重盲検研究を持っていると思いますか?そうでない場合、他のポスターが「証拠」を参照することを要求している間、他人が間違っていることを証明するためにあなた自身の逸話を単にoutるよりも、せいぜい偽善的です。このトピックのさらに下の誰かが書いたように、「ここでの責任は、私がそれを反証するのではなく、彼らの主張を証明する反対にある」。
シモニーク

7

ほとんど例外なく、最初の構文を使用します。誤解されないからです。

「私に考えさせないでください」はユーザーインターフェイスだけに当てはまりません、y'all ;-)


4
以前はこれをやっていましたが、プログラマーは言語を知る必要があり、考えさせる必要があるという議論に勝ちました。
kirk.burleson

2
私はそれを一般的な礼儀だと思います...私の将来の自己に。
スティーブンA.ロウ

5

個人的には2番目の方が好きです。最初のものはく、扱いにくく、水平方向のスペースを無駄にします。2番目の問題の主な問題は、マクロと、後でコードを修正する人が間違っていることです。

これに対して、「マクロを使用しない」と言います。また、「いまいましいコードを正しくインデントします」と言います。プログラミングに使用されるすべてのテキストエディタ/ IDEが自動的にインデントを行う方法を考慮すると、これはそれほど難しくないはずです。Emacsでコードを書くとき、自動インデントを使用して、前の行に何か間違ったことを書いたかどうかを識別します。Emacsがインデントを台無しにしたときはいつでも、私は通常、何か間違ったことをしたことを知っています。

実際には、私が自分の前に設定したコーディング規約に従っています。しかし、これらは私をイライラさせます(そして、Pythonでコーディングし、この大惨事全体がなくなったとき、私はより幸せになります):

if (condition) {
    statement;
} // stupid extra brace looks ugly

それから

if (condition) // the brackets have now just become noise
{ statement; } // also can't see the indentation, harder to read

正直なところ、ifステートメントの2つのステートメントは、1つのステートメントよりもはるかに悩ましいものです。ほとんどの場合、括弧が必要であり、ifステートメント内の2つのステートメントだけではおかしく見えます。


マクロを作成する場合は、マクロを作成して、コードのどこにでも挿入できることを確認してください。
コバール

4

中括弧なしの2行バージョン(2番目の形式)を使用しますが、スペースを節約するためではありません。

このフォームを使用するのは、読みやすく、視覚的に魅力的で、入力しやすいからです。これらの条件が満たされている場合にのみ、このフォームを使用します。つまり、if条件は1行にうまく収まる必要があり、対応するステートメントは次の行にうまく収まる必要があります。そうでない場合は、中括弧を使用して読みやすくします。

このフォームを使用する場合、ifステートメントの前後(またはコメントが存在する場合はコメントの上)に空行(または中括弧のみを含む行)があることを確認します。これは私が意識的に従うルールではありませんが、この質問を読んだ後に気づきました。

画面スペースの節約は私にとって優先事項ではありません。もっとスペースが必要な場合は、より大きなモニターを使用します。私の画面はすでに、私が注意を向ける必要があるかもしれないものを読むのに十分な大きさです。私が画面全体を占めるほど多くのコード行に一度に集中する必要があるとは考えにくい。一度に多くのコードを表示しないと理解できないコードの塊でネストが進行している場合、リファクタリングによってロジックをより適切に表現できるかどうかを検討する必要があります。

以下は、この形式のifステートメントの使用方法を示すいくつかの例です。

    string GuardConditions(Plan planForWorldDomination)
    {
        if (planForWorldDomination == null)
            throw new ArgumentNullException("planForWorldDomination");

        if (!planForWorldDomination.IsComplete())
            return "Doh!";

        planForWorldDomination.Execute();
    }

    void ProcessingLogic()
    {
        OneBlankLineAbove();

        if (simpleCondition)
            simpleStatement();

        OneBlankLineBelow();
        OneBlankLineAbove();

        // optional comment on the line above an if statement
        if (simpleCondition)
            simpleStatement();

        OneBlankLineBelow();
    }

    void Assignment(string drive)
    {
        OneBlankLineAbove();

        string prompt;
        if (simpleCondition)
            prompt = "simple assignment";
        else
            prompt = null;

        OneBlankLineBelow();
    }

    string Return()
    {
        OneBlankLineAbove();

        if (simpleCondition)
            return "simple return";
        else
            return null;

        OneBlankLineBelow();
    }

3

中かっこ。常に。私はそれらのファンのようなものです。コードに一貫性を与えるからです。また、@ dsimchaが書いたように、コードの追加行でエラーが発生する可能性が低くなります。

コードの単一行を囲むブレースの「Uさ」は、デバッグやコードの追加を伴う場合に発生する可能性のある追加作業よりも有害ではありません。


1
あなたが話しているエラーを誰かが犯すのを見たことはありません。
kirk.burleson

1
私は昨日、他の誰かのコードでそれを作りました。:-)コードへの追加の中で、アップストリームがどのように見えるのか、彼のifのすべてにブレースを追加するのはどうなのかと思うだけです。:-)(落ち着いて、私は冗談を言っています、私がしなければならないことだけを編集しました...)
ヴェドランクリヴォクチャ

2

個人的にはブラケットを使用します。

どうして?

誰かがやって来てifステートメントにコードを追加する必要がある場合、スコープがどこにあるかは100%明確です。

ifブロック内にステートメントがいくつあっても、ステートメントの形式を一貫させます。

ただし、プロジェクトのスタイルをそのままにする場合は、それに固執します。


1

ほとんどの場合、安全のためにブラケットを使用しています。ただし、ブロックの内容が本当に短い場合は、それらをオフにして、次のようにワンライナーにします。

if (x==5) Console.WriteLine("It's a five!");

誰かが簡潔さのファンではないと思います。
JohnFx

2
読みやすくするために簡潔にしますか?絶対違う。これはコードであり、ゴルフコンテストではありません。
ジョシュK

3
個人的には、読みやすさが簡潔さの大きな理由だと思います。いずれにせよ:ホワイトスペースは私のコードゴルフのルールブックには含まれていません。
JohnFx

これで一つの問題は、それが虐待に向いている
コンラッドFrix

2
その後、それを乱用しないでください。コーディング標準として使用すると言っているのではありません。本当に短い条件文の後に本当に短い単一の文が続く場合が多くありますが、これはうまく機能します。たとえば、if(アサート)log.write( "assert failed");
JohnFx

1

一貫性を保つためにブレースを好みますが、余白をあまり無駄にしません(したがって、読みやすい形式のコードが私の限られた視野にあります)。だから私はこれを十分に短い行のために書いています:

If (cond) { statement; }

興味深いことに、私はこのようなコードを実際に見ていませんが、ちょっと好きです。
トーマスエディング

0

私は通常中括弧を使用しますが、使用しない場合もあります。

object GetObject() {
    // calculate obj1
    if(obj1 != null)
        return obj1;

    // calculate obj2
    if(obj2 != null)
        return obj2;

    // calculate obj3
    if(obj3 != null)
        return obj3;

    return defaultObj;
}

私にとっては、そこに追加するのはばかげているだけです。の後に誰かが文を追加するとreturn、スコープの問題よりも大きな問題が発生します。


同様に簡単に使用できますreturn (obj != null) ? obj : "Error";
ジョシュK

@ジョシュ、編集を参照してください
自己への注意-

その場合、次のようなものを使用しますObject returnObj = defaultObj; /* Three else-if's to change it to obj1/2/3 */ return returnObj;
ジョシュK

@ジョシュ、stackoverflow.com / questions / 36707 /…を読んでください。最初の回答に対する最初のコメント、「複数の出口点があると手に負えなくなる可能性がありますが、IFブロックに関数全体を入れるよりも間違いなく良いと思います。」
自己への注意-

0

IDEで利用可能なコードフォーマットがある場合、ブレースを使用しません。

一方、自動フォーマットをサポートしない他のエディターでコードを編集する可能性がある場合、他の投稿で言及されているように中括弧を入れないことは危険です。しかし、それでもブレースを使用したくないので、問題ありません。

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