web-dev-qa-db-ja.com

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

else while賢明な「安全な」メンテナンスと見なされる介在ブレースなしで?

if-else以下のような中括弧のないコード...

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

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

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

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

またはelse while「安全」と見なされる介在ブレースなし?

26
user541686

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

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

中括弧を忘れてインデントを増加させずに2種類のブロックを組み合わせるたびに、理解と維持が非常に難しいコードを作成しています。

57
Sulthan

多分それは Jackson Entity Structure Diagram メソッドを使用して(いつか戻って)取引を学習したためですが、唯一の正しいifまたはelseの後の括弧なしの用語は後続のifです(つまり、_else if_ラダーを許可します)

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

私はまた、elseと同じ行にwhile()を含めることについて非常に注意を払います。それは私には正しく読みません... else句であるという余分なインデントマスクの欠如。そして、明快さの欠如は誤解を生みます(上記参照)。

したがって、この例では、次のことについて強く助言/推奨します(そして私のチームで主張します)。

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

もちろん、適切なコメントも期待しています。

-編集-

最近Appleは、不十分なメンテナンス修正によって引き起こされたSSLの脆弱性に苦しみました-それは括弧なしの単一行に2行目を追加しました。 ?

55
Andrew

私は常にすべてを中括弧で囲み、字下げしてコメントするように教えられてきました。エラーの読み取りと特定がはるかに簡単になると思います。個人的にはモジュール性が重要だと感じているので、常に次のようなコードを記述します。

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

メソッドを抽出して、それを作ります

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);
}
6
user470365

個人的には嫌いですが、最も単純なif/elseコードブロックでも中かっこを使用するのが好きですが、そのように単純なままであれば問題ないかもしれません。それは私にとっては整然としています。

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

重要なのは、他のプログラマーが何が正しくて何が間違っているかを一目で確認できるように、内容を明確にすることです。パターンが正しく見え、ジャーにならないようにコードを記述します。

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

4

私はそれをコーディングの悪い習慣と考えています。時々それは完全にうまく働き、あなたはコードをコンパイルして実行することに問題がないでしょう。それ以外の場合は、深刻なバグを引き起こし、そのバグの修正に何時間も費やすことになります。

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

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

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

4
Sandeep Gupta

まあ、誰もが中括弧の使用について議論し、それらを愛しているように見えるにもかかわらず、私は実際には反対を好みます。中かっこを使用するのは、必要がない場合だけにします。

_if (...)
   foo();
else while(...)
   bar();
_

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

結局のところ、私たちは皆、それを中括弧でばかからないようにする傾向があります...

3
dagnelies

中括弧の何が問題になっているので、多くの人がそれらを書かないようにしていますか?

正確に何の問題else while 解決する ?

中かっこは安くて良いです、そして、それらは利口で機知に富んだものとは対照的に、コード意図を明白で明白にします。

Unix哲学の引用:

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

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

2

急いでいるときに別の行を追加してインデントし、中かっこを忘れて何が起こっているのか頭を掻くかもしれないので、私はいつも中かっこを置きます。開始ブラケットを同じ行に置いていますが、それは問題ではありません。私はどちらの場合もそれらを持っている方が良いです。

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

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

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

何も問題がないように

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

適切な状況で(状況は異なる場合がありますが、その特定のスタイルは、多くの反復的なコードがある場合に最適に使用されます。その場合、各行の表示はスタイルのインデントよりも重要です)

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


その上、私は以前にこのコードを見たことがあります:

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

そしてそれはコーディング標準のナチス自身が書いた(彼はすべての括弧を主張した)。

1
gbjbaanb

最新のIDEは、ファイルの保存時にコードの再フォーマット(不要な中括弧の削除や追加を含む)やコードの再インデントを簡単に構成できます。したがって、あなたの例は自動的に次のようになります

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

インデントにより、不要なブレースがなくても、入れ子が常に簡単に表示されます。したがって、このようなIDE=設定を強制的に実行しても、リスクはありません。

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

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

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

1