中括弧は独自の行に表示する必要がありますか?[閉まっている]


273

中かっこは独自の行にあるべきですか?あなたはそれについてどう思いますか?

if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}

またはそれがあるべき

if (you.hasAnswer())
{
    you.postAnswer();
}
else
{
    you.doSomething();
}

あるいは

if (you.hasAnswer())
    you.postAnswer();
else
    you.doSomething();

建設的にしてください!理由を説明し、経験を共有し、事実と参考文献でバックアップします。


104
「== true」は、ブレースの配置の選択よりも気が散ることがわかります。
ダン・ダイアー

11
@Dan:条件式を常に明示することは、明確さを高めるのに大いに役立つと思います。
Wizard79

4
これが問題になる唯一の理由は、IDE /エディターが一致する中括弧認識をサポートしていない場合です。
leeand00

4
@ leeand00:私たちの何人かはまだそれを研究/注釈するために複雑な/なじみのないコードを印刷します。ただし、優れたプリティプリンターはほとんどの問題を軽減します。
Shog9

2
悲しい質問は閉じられました。インデントベースの構文使用をしばらくしてから、別のブレース構造に切り替えました(おそらく奇妙です)。ブロックの最後の行の最初だが閉じ括弧のように。(コード行の後)
CND

回答:


88

私が学生だったとき、私は同じ行に中括弧を置いていたので、行が少なくなり、コードがより少ないページに印刷されます。行の中で唯一のものとして印刷された単一のブラケット文字を見るのは面倒です。(環境、紙の無駄)

ただし、大規模なアプリケーションをコーディングする場合、中括弧のみを使用した一部の行を許可すると、「グループ化」の感覚を考慮して手頃な価格になります。

どのスタイルを選択する場合でも、関連するコードの複数のスタイルを処理するためにあなた自身の脳にとってオーバーヘッドにならないように一貫性を保ってください。さまざまなシナリオ(上記など)では、さまざまなスタイルを使用してもかまいません。高いレベルで「コンテキストを切り替える」のは簡単です。


6
一方、新しいラインのブレースはANSI標準ですが、K&Rはそうではありません。しかし、標準の美しさは、非常に多くの異なるものがあるということです(uncyclopedia.wikia.com/wiki/AAAAAAAAA!も参照してください)。
苦境

「行が少ない」テラバイトのスペースとたくさんのピクセルがあります。より多くの行を使用する必要があるのはなぜですか?
12431234123412341234123

1
@ 12431234123412341234123:コードレビューのためにコードを印刷する人もいるからだと思う。そして、絶対に必要ではない改行はそれぞれ紙の無駄、または大規模な森林の平方キロメートルの無駄です。ただし、印刷しない場合(確かに印刷しない場合)、ANSIはK&Rよりもはるかに優れています。また、印刷しようとする人は、おそらく自動化されたコードフォーマッタを使用する必要があります。したがって、これはコーディングスタイルではなくツールの問題です。
苦境

247

3番目の方法を実行しないでください。

中かっこをスキップすると、最初にいくつかのキーストロークを節約できますが、次に来るコーダーは、ブロックが中かっこが欠落していることに気付かずにelse句に何かを追加します。

他の人のためにコードを書いてください。


113
その少しの知恵がどこから生まれたのか知っていたらいいなと思います。それを読むことを気にしないだろう人々のためにコードを書くことは、あなたが...得ることができると同じくらい無意味なので
Shog9の

69
2番目のプログラマは、何かを追加するときに自分のブレースを追加できます。彼は愚かではなく、このような単純なものの中括弧を省略することを奨励するコーディング規約では、彼は見ることを知っています。
ケンブルーム

25
オプションの中括弧はオプションではありません。Cで行われ、その子孫に引き継がれたより悪い設計決定はほとんどありません。C#のように最近の言語で生き続けることは私を怒らせます。
アダムクロスランド

28
どれだけ賢くても、1行省略されたカーリーのコーディング標準がどの程度浸透していても問題ありません。問題やバグを解決しようとしている場合、カーリーが省略されたことに気付かないでしょう。そして、合計2秒間の作業で、明示するのは本当に悪いことですか?
ヨルダン

11
スタイル#3には、すべてが欠けているという1つの利点があります。一度に画面に表示されるコードが増えます。
ローレンペクテル

203

長い間、私は彼らが同等の価値がある、または非常に近いと主張していたので、正しい選択をすることによって得られる利益はそれについて議論するコストをはるかに下回っていました。

ただし、一貫性を保つことは重要です。それで、コインをひっくり返してコードを書くことにしましょう。

プログラマーがこのような変化に抵抗するのを見たことがあります。乗り越えろ!私は私のキャリアの中で何度も切り替えました。PowerShellではなくC#で異なるスタイルを使用します。

数年前、私はチーム(約20人の開発者)で作業しており、入力を求めてから決定を下し、それをすべてのコードベースに適用することにしました。決定するのに1週間かかります。

たくさんのうめき声とアイローリング。たくさんの「私は自分のやり方が好きだ、なぜならそれはより良いからだ」が実質はない。

質問のより細かい点を検討しているときに、誰かがこの問題を同じ行に括弧で囲む方法で対処する方法を尋ねました。

void MyFunction(
    int parameterOne,
    int parameterTwo) {
    int localOne,
    int localTwo
}

パラメータリストがどこで終了し、ボディが開始するかはすぐにはわからないことに注意してください。と比較:

void MyFunction(
    int parameterOne,
    int parameterTwo) 
{
    int localOne,
    int localTwo
}

世界中の人々がこの問題にどのように対処しているかを読んで、開き中かっこの後に空白行を追加するパターンを見つけました。

void MyFunction(
    int parameterOne,
    int parameterTwo) {

    int localOne,
    int localTwo
}

視覚的な中断を行う場合は、ブレースを使用して行うこともできます。そうすると、視覚的な切れ目も一定になります。

編集:K&Rを使用する場合の「余分な空白行」ソリューションの2つの選択肢:

1 /関数の引数を関数本体とは異なるインデント

2 /最初の引数を関数名と同じ行に配置し、新しい行の引数をその最初の引数に合わせます

例:

1 /

void MyFunction(
        int parameterOne,
        int parameterTwo) {
    int localOne,
    int localTwo
}

2 /

void MyFunction(int parameterOne,
                int parameterTwo) {
    int localOne,
    int localTwo
}

/編集

私はまだ一貫性が他の考慮事項よりも重要であると主張しますが、前例確立されていない場合、ブレースオンネクストラインが道です。


33
参考までに、私は理にかなった人のように聞こえるかもしれませんが、私は実際には夢中です。単純な単一行のブロックの場合、ブレースも改行も使用せず、「if(foo)bar()」をすべて1行にします。私はコードが問題にならない程度にシンプルにするよう努めています。
ジェイバズジ

38
正確にこれを投稿するためにここに来ました。同じ行の左中括弧を保持している多くの人々は(特にクラスとメソッドの開始時に)空白行でそれに続きます。そうでなければ、クラス/メソッドヘッダーを本文から分離するのが難しいからです。とにかく余分な行を使用する場合は、そこにブレースを配置して、インデントが見やすいという追加の利点を得ることができます。
エフゲニーブリクマン

27
空白行は見ていません-MyFunction()のパラメーターが別の行に迷い込んだときのパラメーターの二重インデントに慣れています。
アルマン

34
そのような複数の行にパラメータを分割することは気が狂います。
フォスコ

10
「関数パラメーター」引数は赤いニシンです。明らかに、引数は二重に意図されている必要があります。次のコードと区別しても問題ありません。
デビッドオンガロ

99

基本的なルールは次のとおりです。

  1. プロジェクトの既存のコーディング標準に従ってください。
  2. コーディング標準がなく、他の誰かが所有する既存のコードベースを編集している場合-どれだけ好きでも嫌いでも、既存のコードのスタイルと一貫性を保ってください。
  3. グリーンフィールドプロジェクトに取り組んでいる場合は、他のチームメンバーと話し合い、公式または非公式のコーディング標準について合意に至ります。
  4. 唯一の開発者としてグリーンフィールドプロジェクトに取り組んでいる場合は、自分で考えてから、冷酷に一貫性を保ってください。

外部からの制約がない場合でも、既存の(広く使用されている)コーディング標準またはスタイルガイドラインを探して、それに従うことを(IMO)最適です。独自のスタイルを展開する場合、数年後には後悔する可能性が高くなります。

最後に、既存のスタイルチェッカーとコードフォーマッタを使用して実装/実装可能なスタイルは、手動で「強制」する必要があるスタイルよりも優れています。


10
この回答は、より多くの票に値します。
AShelly

1
一貫性が重要
MediaVince

70

最初の方法の利点は、垂直方向にコンパクトであるため、より多くのコードを画面に収めることができることです。そのため、この方法をお勧めします。私が2番目の方法を支持して聞いた唯一の議論は、開きブラケットと閉じブラケットのペアリングが簡単になるということですが、ほとんどのIDEにはそのためのキーボードショートカットがあり、実際には間違ったステートメントです-開きブラケットと閉じブラケットのペアリングの代わりに同じインデントレベルで閉じ括弧を「ブロックの開始」式(if、else、for、while)にペアリングできるため、ブロックの開始位置を簡単に判断できます。

前のfor / while / ifコンストラクトがすでにブロックの開始を視覚的に示している場合、ブラケットだけのために行全体を無駄にする理由はありません。

そうは言っても、ブロックの終わりとそのインデント構造を目に見える形で示すために何かが必要なので、閉じ括弧はそれ自身の行にあるべきだと思います。


12
いいえ...コードの明瞭さに追加しないことをすることで、画面に収まるコードの量を減らす理由を言っていますか?
EpsilonVector

6
コーディングを始めたとき、私はそれぞれのブレースを独自の行で好きでしたが、今では最初の方法が好き
です-NimChimpsky

57
初期のSteam時代にさかのぼる膨大な量の研究があり(Weinberg、「コンピュータープログラミングの心理学」)、見るべきコードの量が多すぎるとプログラマーの理解が劇的に低下することを示しています。一度に表示されます(つまり、1画面、1プリンターページ)。この現象は、垂直空間を価値のあるリソースと見なし、無駄に無駄にしないことを強く主張しているため、最初の方法が好まれます。
ジョンR.ストローム

10
LOL @「すべての行を無駄にしている」。ああ、神様!しないこと!!= P
ニックスプリッツァー

6
@Julio大学では、方法1を強く支持し、方法2を読むことができませんでした。標準が方法2であるC#を使用している会社で働いた後、私もそれを好むようになりました。どちらかを読むか使用することができます。どちらも私を悩ませません。どちらか一方に対して強い嫌悪感を持っている人は、一般的に、自分がなじみのないものに過剰に反応しています。
KChaloux

46

私は好む

if (you.hasAnswer())
{
    you.postAnswer();
}
else
{
    you.doSomething();
}

以上

if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}

you.postAnswer();が一目で読みやすく、見つけやすいからです。2番目の方法では、上にある線と混ざり合って(you.hasAnswer())、読むために目を集中させる必要があります。


7
これは、プログラムが画面の高さを超えるまで当てはまります。;)
weberc2

13
@ weberc2私はあなたのプログラムが画面の高さを超えたとき、2行はそれほど変わらないと思います。
マギー

13
10年前には、画面スペースについて同意していました。今日、私は1920 * 1200の画面を使用しています。私の脳が一度に処理できる以上の多くのコードに適合します。最初の方法では、読み取らずに別のスコープを開いたり閉じたりすることができます。
LightStriker

3
私がこの方法を好んだ理由を私は決して推測できませんでしたが、まさにこれのためです。
デクランマッケナ

2
@Mageekこれは遅れていますが、2行ではなく、すべてのスコープで2行です。それはO(1)ではなくO(N)です。私は実際にそれについて強く感じていません。長いパラメーターリストを読みやすくするスタイルを選択することがより重要です。
weberc2

38

私は最初の方法を好みます。中かっこはまったく別の行に値しません。

問題は、中括弧は重要ではないということです。それらは単なる構文上のゴミです。これは、コードの目的、目的、実装方法を理解するために絶対に不要です。これらは、使用可能な画面スペースが少ないためにオペレータの視覚的なグループ化が不可能だった古いスタイルのCのような言語へのオマージュです。

括弧なしで問題ない言語(Python、Haskell、Ruby)があります。これは、ブレースがゴミであることを確認するだけであり、可能であればいつでもそれらのための行に値するべきではありません:

if (you.hasAnswer()){
    you.postAnswer();
}else{
    you.doSomething();
}

7
HaskellやRubyについては知りませんが、Pythonは空白文字に敏感です。そのため、ブロックを示す中括弧やその他の区切り文字は必要ありません。ブレースは単なる構文上のノイズではありません。それらは実際の目的を果たします。
ロバートハーヴェイ

14
@ Robert、Cでは、空白と中括弧の両方を行う必要があります。Pythonでは、空白のみを実行する必要があります。どちらが良いですか?
P Shved

5
@ Pavel、C 'ではホワイトペースをする必要はありません。
ケンブルーム

7
空白のない@KenBloom Cプログラムは読み取ることができません。とにかくそれらをしなければなりません。
P

6
ブレースが良いアイデアであるかどうかに関係なく、それらを使用しない言語の単なる存在は、それらに対する賛成または反対の議論のようには見えません。それは、それらなしで言語を持つことが可能であることを示唆しているだけであり、それが良いまたは貧弱な言語設計であることを示唆していません。
ジェイソン

37

Pythonを使用して、引数を完全に回避します。


17
+1SyntaxError: not a chance
セス

6
これは、膨大な大多数のプロジェクトの選択肢ではありません。さらに、グループ化のためのインデントには問題があります。
ブライアンオークリー

@ブライアン、これはあまり実用的ではないことを理解しています。私はそれがただのコメントよりも強い、そこにある必要がある視点だと思った。そして、おそらくタブとスペースを混在させないために、あなたが暗示するインデントによって引き起こされる問題に遭遇したことはありません。
マークランサム

Goを使用して、引数を完全に回避します(さらに静的型付け、速度、およびコンパイラ!):)
weberc2

4
次に、スペースバーを1回押しすぎて、コンパイラ/通訳があなたを笑うのを見てください。ほとんどのブレース言語ではそれは起こりません。
ファラップ

27

中括弧の位置は

メタデータ

プログラマーによってIDEで構成可能。そうすれば、作成者に関係なく、すべてのコードの厄介な中括弧は同じように見えます。


7
完全に同意する。データではなくプレゼンテーションです。
ペトルザ

問題は、すべての人が自分で設定できるようにすると、コミットが完了するとすぐに物事が乱雑になることです。
アンディ

1
@Andy:それがまさにポイントです。IDEは外観を変更しますが、それはIDEだけです!実際のソースは変更されません。バージョン管理のために、中括弧の設定が一般的な状況にあったものを変換するフックを追加して、誰もが同じ方法でコードをチェックアウトできるようにします。
クラール

@klaar私が使用したすべての最新のIDEは、タブをスペースに変更し、ブレースを独自の行または「開始」行の終わりに移動します。これらのケースでソースが触れられていないと思う理由がわかりません。それが私のコメントの理由です。これは通常、開発者の設定に応じてIDEによって変更されます。つまり、コミット中にブレースが自分の行に移動したためにノイズである多くの変更が表示され、実際の変更が非表示になります。
アンディ

@Andy:あなたが説明したノイズの問題を回避するために、ホワイトスペースとブレースに関するこれらの不一致を均一な標準upponコミットに変換するフックを使用する可能性はありませんか?いずれにしても、適切なバージョン管理システム、空白やその他の無意味なもののようなささいなもの超越するはずです。
クラール

19

場合によります。

JavascriptまたはjQueryでコーディングしている場合、最初の形式を使用します。

jQuery(function($) { 
    if ($ instanceOf jQuery) { 
        alert("$ is the jQuery object!"); 
    } 
}); 

しかし、C#でコーディングする場合は、2番目の形式を使用します。これは、C#でそれを行う標準的な方法だからです。

public int CalculateAge(DateTime birthDate, DateTime now) 
{ 
    int age = now.Year - birthDate.Year; 
    if (now.Month < birthDate.Month 
        || (now.Month == birthDate.Month && now.Day < birthDate.Day)) 
        age--; 
    return age; 
} 

あなたの例を書くことができることに注意してください

if (you.hasAnswer())
    you.postAnswer();
else
    you.doSomething();

C#で。


1
ブロックステートメントはステートメントであるため、そのような多くの言語で記述できます。追加!:-)
タマラウィスマン

2
「フレームワーク設計ガイドライン」によると、「標準的な方法」は、オープニングブレースを同じ線上に配置することです(つまり、最初のフォーム)。ただ、コト...
ウーヴェHonekamp

3
@Uwe:おそらく。しかし、Microsoftは、そのMSDN C#の例のすべてについて「整列ブレース」アプローチを採用し、それは、Visual Studioに焼いていますので...
ロバート・ハーヴェイ

@Uwe:それはCwalinaの本であり、それ以上のものであるためひどく名前が付けられています。MSDNのFDGについては、何も言えません。また、フレームワーク 設計ガイドラインでは、C# コーディングの実践について何と言っているのでしょうか?
R.マルティーニョフェルナンデス

3
実際には、Javascriptの同じ行に中括弧を配置する必要があります。中括弧が独自の行にある場合、エラーが発生する可能性があります。例えば、参照encosia.com/...
ジョセフ・ハンセン

18

この例の間違いを見ることは私にとって難しいので、私は最初のものを好む。

if (value > maximum);
{
    dosomething();
}

この例よりも

if (value > maximum); {
    dosomething();
}

; {終わる行よりも間違っているように見える;ので、私はそれに気付く可能性が高くなります。


11
あなたは良い議論をしますが、個人的には、これは私の5年のプログラミングで一度だけ起こったことがあります。私はなぜそれが実行されなかったのか理解できず、SOに投稿し、誰かがすぐにセミコロンを私に指摘しました。ただし、その1行少ないものを使用することが凝縮されるたびに、読みにくくなります。
JDイザックス

6
「; {」は、一種の不機嫌そうな顔のように見えるか、口ひげのある人のようです。
グレナトロン

+1答えの素晴らしい例:非常に微妙な間違い、簡単に見落とされます。これを示すレイアウトについても考えさせられます。
therobyouknow

10
もちろん、適切なIDEは空の制御ステートメントにフラグを立て、適切なコンパイラーは警告を発行します。
ダンク

@Dunkあなたの議論の唯一の欠陥(私は強く同意します)は、非常に多くの人々が最近インタプリタ言語(JavaScript、PHPなど)を使用しているため、多くの「プログラマー」が二重のコンパイラを知らないことですラテ。
クレイグ

15

1)のわずかなバリエーションを好む

if (you.hasAnswer()) {
    you.postAnswer();
} // note the break here
else {
    you.doSomething();
}

どうして?

  • ブレースを常に自分の行に置くと読みやすさが低下すると思います。私の画面には、一定量のソースコードのみを収めることができます。ブラケットスタイル2)は、多くのネストされたループと条件付きのヒーブアルゴリズムを非常に長くします。

  • しかし、私は欲しい elseので、新しい行に開始するifelse、視覚的に、一緒に属しています。の前にブラケットがある場合else、何が何に属しているかを見つけるのははるかに困難です。

  • 3)自分自身を失格にする。かっこを外して忘れてしまうと、どんな悪いことが起こり得るかを知っています。


1
私はこれを私が働いている場所で見ました。それは面白いです。
アルモ

1
またelse、必要に応じて行の上にコメントを追加したり、if-blockとelse-blockの間に空白行を入れて物事を詰め込みにくくしたりできるので、このスタイルの方が好きです。ブラケットスタイル#2は、アクションを条件から遠ざけること以外は何もしません。そうは言っても、私のお気に入りは間違いなくpythonのブラケットなしスタイルです:)
sayap

4
画面上のコード行の数を最大にすることが重要な場合は、改行を完全に削除してください。1つの画面で多くの行を取得できます。読んでいる間、一時停止して考えさせるものは何も持たないことを好みます。より読みやすいの私の定義。かっこで私の心はそれらを無視します。ブレースがなければ、私の心は制御ブロックを一時停止し、調整する必要があります。長い一時停止ではなく、それでも一時停止です。
ダンク

1
はい、そうでなければ一緒に属しますが、{と}もそうです。}は別の行にあるため、{も別の行にある必要があります。「画面に表示できるソースコードの量は限られています」そして、3)が「自分自身を失格にする」と言うのはまったく選択肢ではありません。3)での10年間の作業の後、新しいコード行を追加するときにかっこを追加することを忘れていません。適切に読めない人に合わせてコードを調整する必要がある場合、どこで終わりますか?一部のコードリーダーがそれらを理解できない可能性があるため、特定の言語機能の使用を停止しますか?
カイゼルディ

10

私はどこかの本の著者がコードを次のようにフォーマットすることを望んでいることをどこかで読みました。

if (you.hasAnswer())
{
    you.postAnswer();
}
else
{
    you.doSomething();
}

しかし、出版社からのスペースの制約は、これを使用しなければならなかったことを意味しました。

if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}

今はそれが本当かどうかわかりません(もう見つけられないので)が、本では後者のスタイルが非常に普及しています。

個人的なレベルでは、次のように別の行の括弧を好む:

a)新しいスコープを示します
b)ミスマッチがある場合に見つけやすくなります(ただし、これはエラーを強調するIDEの問題ではありません)。


... 2番目のオプションは、両方のポイントを容易にします(インデントだけで、ブレース/インデントコンボの目的を果たします)。:)
weberc2

10

ああ、 1つの真のブレーススタイル

聖なる道のために、リチャードの「私の道か高速道路」のストールマンでさえ、すべてが聖道のために作られています。

その男は非常に多くのことについてとても間違っていましたが、GNUはブレースに関してはスポットオンです。


[更新]私は光を見て、今オールマンを崇拝しています


9
Lispコードをモデル化する以外、GNUスタイルのポイントは見当たりません。少しの利益のために多くの仕事のようです。
ロバートハーヴェイ

GNUスタイルを使用している人は誰もいません。1TBSずっと。
ジェキュー

言うまでもなくLispスタイルを除き、ブロックごとに2つのインデントレベルよりも悪いことはできません。
エルゴシス

4
括弧スタイルのリンクについては+1。あなたのスタイルが何であれ、多くの偉大な人々があなたに反対していることを示しています。
フロリアンF

@RobertHarvey余分な作業はありません。もしそうであれば、適切なツールを使用してコードを記述したり、適切に構成したりしないでください。利点は、はるかに読みやすいコードです。ブラケット内のすべてのエラーが非常に高速に表示され、サブブロックを無視しながらコードのみを簡単に読み取ることができます。
12431234123412341234123


9

簡単な答え:デバッグが簡単なものは何ですか?

// Case 1:
void dummyFunction() {
  for (i = 0; i != 10; ++i) {
    if (i <= 10)
      std::cout << "i is: " << i << "\n";
      std::cout << 10 - i << " steps remaining\n";

      // Some hard work here
      // which is really hard
      // and does take some screen estate
    }
    else
      std::cout << "We'll never get there";
  }
} // COMPILER ERROR HERE


// Case 2:
void dummyFunction()
{
  for (i = 0; i != 10; ++i)

    if (i <= 10)
    {
      std::cout << "i is: " << i << "\n";
      std::cout << 10 - i << " steps remaining\n";

      // Some hard work here
      // which is really hard
      // and does take some screen estate
    }
    else
      std::cout << "We'll never get there\n";
  }
} // COMPILER ERROR HERE

どの場合に最初に問題を診断しましたか?

私は個人的な好みのためにあまり気にしない(WhitesmithのとAlを含む他の多くのスタイルは、。があります)、私はそれがコードと読んで自分の能力阻害しない限り...あまり気にしないデバッグを。

「無駄スペース」の議論に関しては、私はそれを購入しません。論理グループの間に空白行を追加して、プログラムをより明確にする傾向があります...


1
主に短いコードブロックであるため、どちらも簡単にデバッグできます。インデントは一貫しており、実際のコードブロックを簡単に視覚化できます。
Htbaa

@Htbaa:確かに:)では、なぜわざわざ?
マチューM.

なつみ 関数シグネチャ、forステートメント、ifステートメントの間にある(2番目のブロックの)改行は、それらが無関係であると信じていますが、明らかにそうではないため、最初のブロックは私にとってより意味があります。空白行は、コードの無関係なビットを分離するためのものです。コードの他の行に近いコードは、それらが実際に関連していることを意味します。これはもちろんすべて「イモ」ですが、あなたのポイントは何だったのでしょうか。編集:また、適切なIDEはブレースがないことに気づき、コードを解釈するときにエラーがわずかに表示されます。
クラール

7

誰も気付かないことではありませんが、これが中括弧が条件と同じ行に属する理由です(非常に長い条件を除き、それはエッジケースです):

Cでは、これは有効な構成体です。

while(true);
{
    char c;
    getchar(); //入力待ち
}

早く!このコードは何をしますか?「入力を求める無限ループ」と答えた場合、あなたは間違っています!入力すらしません。でキャッチされwhile(true)ます。最後にセミコロンがあることに注意してください。このパターンは実際にはより一般的であるように思われます。Cでは、ブロックの先頭で変数を宣言する必要があるため、新しい変数が開始されました。

コード行は思考です。中括弧は、条件またはループを含む思考の一部です。したがって、それらは同じ行に属します。


これは私が見たK&Rスタイルの圧倒的な最良の議論であり、残りはコード折りたたみサポートを備えた今日のIDEシステムで笑えるでしょう。これは、;ブロック終了をサポートするCスタイル言語にのみ適用されます。これが、私見が時代遅れで、Go言語がそれを証明しているこのブロックエンディングシステムを軽deする理由でもあります。このシナリオではないが、私はこの問題を何度も見ました。通常、ステートメントに何かを追加して忘れようとする場合に発生します。
ジェレミー

5

私は最初の方法が好きです。IMOがすっきりしていて、よりコンパクトで、気に入っています。

編集:ああ、3番目。それはさらに小さく/きれいなので、私は可能な限りそれが一番好きです。


5

あなたはそれを書くことができます:

you.hasAnswer() ? you.postAnswer() : you.doSomething();

質問に答えるために; 以前は自分の行では中括弧を好んでいましたが、ブラウザでのセミコロンの自動挿入によるバグについて考える必要を避けるために、Javascriptでエジプト風のスタイルを使用し始めました。また、EclipseでJavaをコーディングするとき、デフォルトのブレーススタイルとの戦い(または構成)に興味がなかったので、その場合もエジプト人と一緒に行きました。今、私は両方で大丈夫です。


そのように使用する、postAnswer()そしてdoSomething()多くの場合、そうではありません三項演算子、の値を返す必要があります:彼らは非常によく、ボイド(値なし)を返すことができます。また、(少なくともC#で)の結果?:、いくつかの変数に代入されるべきである

4

ここでのほぼすべての回答は、「あなたがすることは何でも、1つまたは2つに固執する」というバリエーションを言っています。

だから私はしばらくそれについて考え、私はそれがそんなに重要だとは思わないことを認めなければなりませんでした。誰もが、次のことは難しいと正直に言うことができますか?

int foo(int a, Bar b) {
    int c = 0;
    while(a != c)
    {
        if(b.value[a] == c) {
            c = CONST_A;
        }
        c++;
    }
    return c;
}

私は他の誰かについてはわかりません...しかし、私は精神的にスタイルを行き来するのに全く問題がありません。コードが何をするのかを理解するのに少し時間がかかりましたが、それはCのような構文をランダムに入力した結果です。:)

私のそれほど謙虚な意見では、中括弧を開くことはコードの可読性とほとんど完全に無関係です。上記のいくつかのコーナーケースでは、いずれかのスタイルが違いを生むことがありますが、ほとんどの場合、空白行を賢明に使用することでクリーンアップできます。

FWIW、私たちの職場のコーディングスタイルは、少し構造化されたフォーム1と修正されたフォーム3を使用します。(C ++)

            // blank line is required here
if (x) {
            //This blank line is required
   y = z;
}
            // blank line is required here too, unless this line is only another '}'

if (x) y = z; //allowed

if (x)
    y = z;  // forbidden

フォーム2を強く好む人がフォーム1のこのバージョンをより良く見つけられるかどうか、私は興味があります。なぜなら、空白行がより強い視覚的分離を与えるからです。


4
あなたの例が示すように、インデントは読み取り可能なコードの中括弧よりも非常に重要です。実際、一部の言語ではインデントがステートメントをネストする唯一の方法にしています!

1
正直なところ、一貫性のない例は読みにくいと思います。本当に難しいわけではありませんが、一貫性がある場合よりも難しくなります。
アルモ

アルモに同意します。「本当に難しいのか」ということではありません。それは、たとえ難しくなくても、「間違いなく難しい」場合です。なぜ物事を難しくするのですか?もちろん、「おもちゃ」の例では、ほとんど違いはありません。私の経験では、悪意のあるコードを他の誰かから継承し、メソッド1を使用した場合、ロジックに従うためだけにメソッド2に変換することが非常に頻繁に必要になります。頻繁に必要になるという事実のため。どのメソッドがより良く、理解しやすいかという質問に自動的に答えます。
ダンク

@Dunk:そのような無関係な詳細を前後に入れ替えることで著しく改善されるコードを推測することはできません。
jkerian

@ jkerian-どうやら、プロジェクトや会社を長く離れている他の人から多くのコードを引き継いでいないようです。私は、数年の経験を持つ人がそのような状況に陥らないことを推測できません。しかし、再び、すべての人の仕事の状況は異なります。また、「正式な」コードレビューを行う必要がある場合は、書式設定によって大きな違いが生じます。コードを自然に読み取ることができることは非常に重要です。確かに一時停止し、ブレースを一致させると考えることができますが、プロセスが遅くなります。1つの方法は一時停止を必要としませんが、他の方法は一時停止を必要としません。そのため、他の選択肢が推奨される理由がわかりません。
ダンク

4

これはまだ提起されていないことに驚いています。ブロックをより簡単に選択できるので、2番目のアプローチの方が好きです。

ブレースが同じ列と独自の行で開始および終了する場合、マージンから選択するか、列0のカーソルで選択できます。これは通常、マウスを選択するとより寛大な領域になり、キーボードを選択するとより少ないキーストロークになります。

もともとは条件付きと同じ行でブレースを使用していましたが、切り替えたときに作業速度が加速することがわかりました。もちろん、昼夜ではありませんが、条件文の横にある中括弧を使用すると作業が少し遅くなります。


私のような古いタイマーは、3つのキーストロークを使用して、いまいましいブレースがどこにあってもブロックを選択します。
エルゴシス

2

個人的には2番目の方法が好きです。

しかし、私がこれから実証する方法は、最高の仕事の安全をもたらすため、私の意見では最高です!私の大学の仲間の学生が宿題を手伝ってくれと頼みましたが、これが彼のコードの様子です。プログラム全体が1つのブロックのように見えました。興味深いのは、彼が作成したプログラムのバグの95%が、括弧の不一致によるものだということです。他の5%は、ブレースが一致すると明らかになりました。

while(1){
i=0;
printf("Enter coded text:\n");
while((s=getchar())!='\n'){
         if(i%1==0){
            start=(char*)realloc(input,(i+1)*sizeof(char));
if(start==NULL){
printf("Memory allocation failed!");
exit(1);}
input=start;}
      input[i++]=s;}
start=(char*)realloc(input,(i+1)*sizeof(char));
if(start==NULL){
printf("Memory allocation failed!!!");
exit(1);}
input=start;
input[i]='\0';
                puts(input);

8
悪い、悪い、私はひどい、ひどい例を意味します。問題はブレースではありません!クレイジーなインデントです!
R.マルティーニ・フェルナンデス

@Martinho Fernandes中括弧とインデントを一緒に配置すると思った
...-AndrejaKo

2
必ずしもそうではありません...上記の適切なインデントを行ってから、ブレーススタイルをランダムに切り替えてください。理解できることがわかります。
jkerian

実際、このことを考えると、この質問に対する私自身の答えが動機付けられました。
jkerian

「彼が作ったプログラムのバグの95%は、括弧の不一致によるものでした」-インタプリタ言語のみで、コンパイルされていません。
Mawg 14

2

私の個人的な好みは最初の方法です。おそらくそれが最初にPHPを学んだ方法だからです。

単一行ifステートメントの場合、次を使用します

if (you.hasAnswer()) you.postAnswer();

そうではないyou.postAnswer();が、もっと長いもの、たとえばyou.postAnswer(this.AnswerId, this.AnswerText, this.AnswerType);最初のタイプに戻るとしたら:

if (you.hasAnswer) {
    you.postAnswer(this.AnswerId, this.AnswerText, this.AnswerType);
}

改行は使用しませんelse。また、ステートメントがある場合は、このメソッドを使用しません。

if (you.hasAnswer()) you.postAnswer();
else you.doSomething()

理論的な可能性ですが、私が今まで使用したことはありません。これはに変換する必要があります

if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}

2

彼らはすべきではありません。私の最初の方法。

2番目の行を見ると、使用されていない行(最後の閉じ中かっこ以外に中かっこのみが含まれている行)があるため、コードの連続性が壊れているように感じます。私は通常、コードの目的またはこのような何かの分離を意味する空の行に特別な注意を払う必要があるため、それを速く読むことはできませんが、「この行は中括弧に属している」ことはありませんインデントの)。

とにかく、テキストを書くときと同じように、段落の先頭にインデントを追加することは、その前に空白行がある場合は不要です(段落変更の二重記号)、中括弧の行を無駄にする必要はありません適切にインデントします。

さらに、既に述べたように、画面に多くのコードを収めることができますが、そうでなければ少し逆効果になります。


2

プラットフォーム/言語/慣習に依存します

Javaの場合:

void someMethod() { 
     if (you.hasAnswer()) {
         you.postAnswer();
     } else {
       you.doSomething();
     }
}

C#で

void someMethod() 
{ 
     if (you.hasAnswer()) 
     {
         you.postAnswer();
     } 
     else 
     {
       you.doSomething();
     }
}

Cで:

void someMethod() 
{ 
     if (you_hasAnswer()) {
         you.postAnswer();
     } else {
       you_doSomething();
     }
}

Javaの人がC#コードで自分のスタイルを使用し、その逆の場合は嫌です。


3
Cスタイルはいつも私を悩ませました。一貫してください!
クリスチャンマン

1

私が言えることは、もしあなたが方法#3のファンなら、あなたは地球上のすべてのIDEコードフォーマッタによって迫害されるだろうということです。


1

最初の方法を使用する理由は、それがよりコンパクトで、画面上でより多くのコードを使用できるためです。私自身、ブレースのペアリングに問題はありませんでした(if条件を追加する前にステートメントと一緒に常に記述し、ほとんどの環境では対応するブレースにジャンプできます)。

ブレースを視覚的にペアにする必要がある場合、2番目の方法をお勧めます。ただし、それにより一度にコードが少なくなり、より多くのスクロールが必要になります。そして、少なくとも私にとっては、適切に配置されたブレースを持っているよりも、コードの読み取りに大きな影響を与えます。スクロールが嫌いです。繰り返しになりますが、1つのifステートメントをスクロールする必要がある場合は、大きすぎる可能性が高く、リファクタリングが必要です。

しかし; 最も重要なことは一貫性です。どちらか一方を使用してください-両方を使用しないでください!


0

12でプログラミングを初めて学んだとき、Microsoftのコーディングチュートリアルはそのようなものなので、中かっこを次の行に追加しました。そのとき、4スペースTABSでインデントしました。

数年後、私はJavaとJavaScriptを学び、同じ行の中括弧のコードを見たので、変更しました。また、2スペースのスペースでインデントを開始しました。


5
+ 1、-1。エディターはタブの長さを任意の長さに調整できるので、なぜタブでインデントしないのですか?それ以外の場合は、8の真のインデントが好きな私たちの多くをリードして、コードを呪います。
ジェキュー

0

中括弧を揃えるが、スペースを無駄にしない4番目のオプションがあります。

if (you.hasAnswer())
{    you.postAnswer();
     i.readAnswer();
}
else
{   you.doSomething();
}

唯一の問題は、ほとんどのIDEのオートフォーマッターがこれにこだわっていることです。


9
...これにこだわるほとんどのプログラマーもそうです。
ジェキュー

4
それは恐ろしいようです。一番上に行を挿入したり、一番上の行を削除したりする場合は、余分な労力を考慮してください。行を削除して先に進むことはできません。中括弧を再挿入することを忘れないでください。
ブライアンオークリー

これはすごい!:)最初のスタイルよりも優れています!
ノーファル

どうやら名前もあるようです。Horstman Syyleウィキペディアで言及されています。私はこのようなコードベースで作業しましたが、実際に使用するのは悪くありません。
AShelly

-1

コーディングの制約や標準がプロジェクトマネージャーによって設定されているプロジェクトに取り組んでいない限り、そのプロジェクトに取り組んでいるすべてのプログラマーがコーディング中に従う必要があるということは、すべてあなた次第です。

私は個人的には第一の方法を好むでしょう。

また、私はあなたが3番目の方法で見せたいものを手に入れませんでしたか?

それは間違った方法ではないでしょうか?たとえば、次のような状況を考えます。

if (you.hasAnswer())
  you.postAnswer();
else
  you.doSomething();

誰かがifブロックにさらにステートメントを追加したい場合はどうでしょうか?

その場合、3番目のメソッドを使用すると、コンパイラは構文エラーをスローします。

if (you.hasAnswer())
   you.postAnswer1();
   you.postAnswer2();
else
   you.doSomething();

2
さらに悪いことに、誰かがやって来てしまった場合は:if(you.hasAnswer())you.postAnswer(); それ以外の場合you.doSomething(); you.doSomethingElse(); -それは、目には簡単にオーバースリップすることができますし、コンパイラはどちらか助けていないだろうという微妙なバグのためのレシピです
FinnNk

@FinnNk:その通り!
チャンキーPathak

2
誰かが別のステートメントを追加したい場合は、括弧自体を入れることができます。彼の塩に値するプログラマは、本当にそれを理解できるはずです。
ロバートハーヴェイ

私は彼の3番目の方法が間違っていると言いたかった。
Chankey Pathak

3
@Robert Harvey、非常に経験豊富なコーダーが、既存のコードを変更するときにブレースを追加するのを見逃しているのを見てきました。問題は、インデントはブレースよりもはるかに強力な意味の手がかりだと思います(特に複数のブレーススタイルがあるため)。
AShelly
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.