メンテナンスに関しては、「その他」はブレースを介在させずに安全と見なされますか?


26

であるelse while「安全」メンテナンスが賢明と考え括弧を介在せずに?

if-else以下のような中括弧なしでコードを書く...

if (blah)
    foo();
else
    bar();

...中括弧がないため、コードの意味を不注意に変更することが非常に簡単になるため、リスクが伴います。

ただし、以下も危険ですか?

if (blah)
{
    ...
}
else while (!bloop())
{
    bar();
}

またはelse while、介入する中括弧なしで「安全」と見なされますか?


20
私にはelse while不快に見えます。を使用しますelse { while (condition) { ... } }
ヨアヒムザウアー

7
適切な答えを出すには主観的すぎると思います。ループが発生することはないと思うので、mzselfは実行しません。読みやすさを難しくすることはないと思います。
ヨハネス

7
私は考えメソッドを抽出しながら、もののため
GNAT

12
正直なところ、それは私にゾッとさせます。if一度だけ評価されるが、whileその両方が私のことを根拠のない感覚与え接続、ループを表し、ifループの一部は...何とか...である
user281377は、

4
そして、else句であなたがやりたいことwhile もっと何かをしたい場合はどうなりますか?中かっこを使ってください。
カルロスキャンデロス

回答:


57

それは私にこのコードを思い出させます:

if ( ... ) try {
..
} catch (Exception e) {
..
} else {
...
}

中かっこを忘れてインデントを増やすことなく、2種類のブロックを組み合わせるたびに、コードの作成と理解が非常に難しくなります。


18
良い例え。それを書くなんて恐ろしい方法です。
レオ

4
うわー、この答えは途方もなく説得力があります!
Mehrdad

中括弧の挿入やインデントの修正など、保存時にコードを自動的にフォーマットする最新のIDEを簡単にセットアップできます。したがって、これは議論の半分にすぎません。これを適切にインデントすると、ブレースが存在するかどうかにかかわらず、読みやすくなります。
ハンスピーターシュトルー

55

おそらく、Jackson Entity Structure Diagramメソッドを使用して自分の取引を(いつ頃までに)学んだかによるものですが、orまたはanの後の唯一の正しい括弧なしの用語は後続(つまり、ラダーを許可)ifelseifelse if

それ以外のもの(しゃれは意図されていません)は、誤解やメンテナンスの問題を引き起こす可能性があります。これが、OPのアイデアが「安全ではない」ことの中心的な側面です。

またwhile()elseブレースするかどうかに関係なく、と同じ行に含めることについても非常に慎重です。それは私には正しく読めません...それがelse句であることの余分なインデントマスクの欠如。また、明確性の欠如は誤解を招きます(上記参照)。

したがって、この例では、次のことを強く推奨/推奨します(チーム内で強く主張します)。

if ( blah )
{
    ...
}
else
{
    while ( !bloop() )
    {
        bar();
    }
}

もちろん、適切なコメントも見られると思います。

-編集-

最近、Appleは不十分なメンテナンス修正が原因でSSLの脆弱性に苦しみました。それでは、ブレースなしの単一行でも大丈夫だという考えに就きましょう。


2
他に続く唯一の正しい用語である場合に同意します。あった場合else while、私はおそらくループは私が探していた条件がある場合によって満たされた場合は特に、コードの迅速なスキミングにあった気付かないでしょう。
ドレイククラリス

3
それはおかしいです。すべてが括弧で囲まれていると読みやすくなります。反対のことが真実だと思います。ステートメントが1つだけの場合は、括弧で囲まないでおくと読みやすくなります。混乱が少ない。それは私がいつもそうしてきたからだろう。
ジェフデイビス

2
@JeffDavisそれは良いキャッチです。「読みやすい」は、無駄な聖戦への典型的な招待です。私は中括弧を好むが、無関係な「読みやすい」ゴミのせいではなく(たとえば、私にとってはまったく逆だ)、それ以上のコード保守を破るのが難しいからだ。ちなみにOPは彼らの質問に良いことを綴ら:あるelse while括弧介在することなく、「安全」と考えを
ブヨ

@JeffDavisは-括弧を使用していない理由は良いアイデアではありません私はこのスレッドは2歳ですけど、Appleは最近発見andrewbanks.com/...
アンドリュー・

@Andrewところで、AppleのSwift言語は、明示的に1行のフロー制御を禁止しています。そのバグがそうする理由の1つである可能性があります。
スルタン

6

私は常にすべてを中括弧で囲み、インデントしてコメントするように教えられてきました。読みやすくエラーを見つけるのがずっと簡単だと思います。個人的には、モジュール性が重要だと感じているので、常に次のようなコードを記述します。

    if(blah)
    {
     ....
    }
    else
    {
       while(!bloop()
       {
        bar;
       }
    }

6

私は考えメソッドを抽出し、それを作ります

if ( blah )
{
    ...
}
else
{
   newMethod();
}

リファクタリングカタログサイトで説明されている「抽出メソッド」アプローチを参照してください。

一緒にグループ化できるコードフラグメントがあります。

フラグメントを、メソッドの目的を説明する名前のメソッドに変換します。

void printOwing() {
    printBanner();

    //print details
    System.out.println ("name:    " + _name);
    System.out.println ("amount    " + getOutstanding());
}

                                                                                                         http://www.refactoring.com/catalog/arrow.gif

void printOwing() {
    printBanner();
    printDetails(getOutstanding());
}

void printDetails (double outstanding) {
    System.out.println ("name:    " + _name);
    System.out.println ("amount    " + outstanding);
}

依存します...たとえば、whileループが関数レベルのデータを使用した場合、そのデータをモジュール(またはC ++を使用している場合はクラス)レベルに追加する必要があります。そして、ほんの小さなコードのスニペットなら、ささいな方法に夢中です。しかし、状況によっては同意することもあります。
アンドリュー

1
+1スマートC ++コンパイラは関数をインライン化できます。.Net環境では、JITにより小さな関数の方が優れています。
ジョブ

4

私はそれをコーディングの悪い習慣と考えています。ときどき完全に正常に動作し、コードのコンパイルと実行に問題がないことがあります。それ以外の場合、深刻なバグが発生する可能性があり、そのバグを修正するのに何時間も費やすことになります。

コードをモジュール化することを常にお勧めします。他の部分にwhileループを配置する必要がある場合は、ブロックに配置して、他の人がコードを操作するときにロジックを簡単に理解できるようにします。

if ( blah )
{
    ...
}
else
{
    while ( !bloop() )
    {
        bar();
    }
}

コードをブロックに配置することをお勧めします。これにより、理解とデバッグもより簡単かつ容易になります。


4

個人的には好きではありませんが、そのように単純なままであれば大丈夫かもしれません。私の好みは、最も単純なif / elseコードブロックでもブレースを使用することです。私にとってはもっときれいです。

しかし、これが面倒になるのは、if / elseループを入れ子にし、中括弧を付けずに入れ子にした場合です。すべてのスパゲッティの真ん中にあるWhileループ!私は悪いコードを扱ってきましたが、デバッグして理解するのは悪夢です。これは最初の点から続き、シンプルで満足している場合は問題ありませんが、他のプログラマーがやって来て、おそらくwhileループ内のif elseに追加します。そもそもきれいに書かれていれば、これが起こる可能性は低くなります。

重要なのは、他のプログラマが一目で何が正しいか間違っているかを見ることができるように、内容を明確にすることです。パターンが正しく見えるように、jarファイルが動かないようにコードを書きます。

これの裏側は、多分私は、ある場合にはこれがよく読めると主張する人々を見ることができるということです。リソースがある場合は、何かを行うのを待っている間に、この処理を行う必要があります。それでも、elseブロック内にwhileループをネストすることに違いはありません。


3

まあ、誰もがブレースを使用することを主張し、それらを愛しているように見えますが、私は実際に反対を好みます。必要な場合にのみ中括弧を使用します。

if (...)
   foo();
else while(...)
   bar();

...実際、これはelse while(...)非常に読みやすいと思います!普通の英語のようにも読める!しかし、控えめに言っても珍しいので、人々は皆それを奇妙だと思うでしょう。

結局、私たちは皆、中かっこでばかしないようにする傾向があります...


3
いくつかの無実のメンテナが変更した後、特に読めるだろうそのelse while(...) bar();ような何かにelse while(...) foobar(); bar();:)
ブヨ

3
まあ、私はそれがかなり愚かで危険な無実のメンテナーだと言うでしょう。私は愚かなエラーを避けるためにそれを馬鹿にする原則を知っています...しかし、これまでのところ行くことはそれにもかかわらずかなり悲しいです。しかし、私はそのようなコメントと下票を得ることを知っていました。問題ない。
dagnelies

2
「あなたのコードを維持する人が、あなたがどこに住んでいるかを知っている暴力的なサイコパスであるかのように常にコードします。」(アランブラギンズ
gnat

1
まあ、すべては、あなたのコードで作業している誰かの最も愚かなレベルであると仮定するものに要約されます。これらの4行のコードで「保守担当者」が混乱した場合は、...大きな問題が手元にあると主張します。そして、もしそれが暴力的なサイコなら、あなたには2つあります。;)
dagnelies

1
if-上記のリンクがこの引用の拡張版です:プログラマー1:「ここにはいい引用があります-「コードを維持する人は、あなたが住んでいる場所を知っている暴力的なサイコパスであるかのように常にコード」」 。プログラマー2:(メンテナーを見てください)「あなたは「あたかも」とはどういう意味ですか?」
gnat

2

急いで別の行を追加したり、インデントしたり、ブレースを忘れたり、何が起こっているのか頭をかいたりするかもしれないからです。オープニングブラケットを同じ行に置いていますが、問題ではありません。私はどちらの場合も持っている方が良いです。

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

中括弧の配置は、おそらく宗教を超えた(または場合によっては含む)何よりも多くの議論を引き起こします!
アンドリュー

同意した。私の答えを編集して、位置ではなく、それらの存在を強調します。
ツベトミールディミトロフ

2

ブレースの何がそんなに間違っているので、非常に多くの人々がそれらを書くことを避けようとしていますか?

どの問題が正確にelse while解決しますか?

ブレースは安価で優れており、巧妙で機知に富んだものとは対照的に、コードの意図を明白かつ明白にします。

Unix哲学の引用:

明快さのルール:明快さは賢さよりも優れています。

メンテナンスは非常に重要で高価なので、プログラムを実行する最も重要な通信は、それらを実行するコンピューターではなく、将来ソースコードを読んで保守する人間(自分を含む)であるかのようにプログラムを作成してください。


1

何も悪いことはありません

if (blah)
    foo();
else
    bar();

何も問題がないように

if (blah) foo(); else bar();

適切な状況(状況は異なる場合がありますが、その特定のスタイルは、繰り返しコードが多い場合に最適です-各行の表示はスタイルのインデントよりも重要です)

ただし、1つの方法を選択する場合は、それを守ってください。一貫性が重要です。したがって、2番目の例は非常に悪いです。if式にはステートメントの括弧が含まれているため、whileステートメントはelse節の外側ではなく、括弧の内側にある必要があります。


その上、私は前にこのコードを見ました:

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

そして、それはコーディング標準のナチ自身によって書かれました(彼はすべての括弧を主張しました)。


1

最新のIDEは、再フォーマット(不要なブレースの削除または追加を含む)および/またはファイルの保存時にコードを再インデントするように簡単に構成できます。したがって、あなたの例は自動的に例えば

if (blah) {
  blub();
} else
  while (!bloop()) {
    bar();
  }

インデントにより、不要なブレースがなくても、ネストが常に簡単に表示されます。そのため、このようなIDE設定を強制できたとしても、リスクはありません。

個人的には、中括弧と改行を省略したコードは、混乱を避けるため、はるかに読みやすくなっています。

if (blah) blub();
else while (!bloop()) bar();

しかし、もちろん、多くの開発者はこのようなことについて永遠に議論することを非常に喜んでいます。

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