else while
賢明な「安全な」メンテナンスと見なされる介在ブレースなしで?
if-else
以下のような中括弧のないコード...
if (blah)
foo();
else
bar();
...中括弧がないと、コードの意味を誤って変更することが非常に簡単になるため、リスクを伴います。
しかし、以下も危険ですか?
if (blah)
{
...
}
else while (!bloop())
{
bar();
}
またはelse while
「安全」と見なされる介在ブレースなし?
それは私にこのコードを思い出させます:
if ( ... ) try {
..
} catch (Exception e) {
..
} else {
...
}
中括弧を忘れてインデントを増加させずに2種類のブロックを組み合わせるたびに、理解と維持が非常に難しいコードを作成しています。
多分それは Jackson Entity Structure Diagram メソッドを使用して(いつか戻って)取引を学習したためですが、唯一の正しいif
またはelse
の後の括弧なしの用語は後続のif
です(つまり、_else if
_ラダーを許可します)
それ以外のもの(しゃれは意図されていません)は、誤解やメンテナンスの問題の可能性を残します。それが「安全でない」というOPのアイデアの中心的な側面です。
私はまた、else
と同じ行にwhile()
を含めることについて非常に注意を払います。それは私には正しく読みません... else
句であるという余分なインデントマスクの欠如。そして、明快さの欠如は誤解を生みます(上記参照)。
したがって、この例では、次のことについて強く助言/推奨します(そして私のチームで主張します)。
_if ( blah )
{
...
}
else
{
while ( !bloop() )
{
bar();
}
}
_
もちろん、適切なコメントも期待しています。
-編集-
最近Appleは、不十分なメンテナンス修正によって引き起こされたSSLの脆弱性に苦しみました-それは括弧なしの単一行に2行目を追加しました。 ?
私は常にすべてを中括弧で囲み、字下げしてコメントするように教えられてきました。エラーの読み取りと特定がはるかに簡単になると思います。個人的にはモジュール性が重要だと感じているので、常に次のようなコードを記述します。
if(blah)
{
....
}
else
{
while(!bloop()
{
bar;
}
}
メソッドを抽出して、それを作ります
if ( blah )
{
...
}
else
{
newMethod();
}
リファクタリングカタログ サイトで説明されている「抽出メソッド」アプローチを参照してください:
一緒にグループ化できるコードフラグメントがあります。
フラグメントを、名前がメソッドの目的を説明するメソッドに変換します。
void printOwing() { printBanner(); //print details System.out.println ("name: " + _name); System.out.println ("amount " + getOutstanding()); }
void printOwing() { printBanner(); printDetails(getOutstanding()); } void printDetails (double outstanding) { System.out.println ("name: " + _name); System.out.println ("amount " + outstanding); }
個人的には嫌いですが、最も単純なif/elseコードブロックでも中かっこを使用するのが好きですが、そのように単純なままであれば問題ないかもしれません。それは私にとっては整然としています。
ただし、これが厄介になるのは、中括弧のあるものとないものの入れ子のif/elseループがある場合です。スパゲッティの真ん中にあるWhileループ!私はこれほどひどいコードを扱ってきましたが、デバッグして理解するのは悪夢です。これは最初の点から続いており、シンプルなままで満足していれば問題ありませんが、他のプログラマーが一緒に、おそらくwhileループ内にif elseを追加します。そもそもきれいに書かれていれば、これが起こる可能性は低くなります。
重要なのは、他のプログラマーが何が正しくて何が間違っているかを一目で確認できるように、内容を明確にすることです。パターンが正しく見え、ジャーにならないようにコードを記述します。
これの裏側は、多分私はいくつかの人々が特定の例ではこれがうまく読むと主張するのを見たかもしれないということです。必要なリソースがある場合は、何かを待っている間にこの処理を行います。それでも、elseブロック内にwhileループをネストすることに違いはありません。
私はそれをコーディングの悪い習慣と考えています。時々それは完全にうまく働き、あなたはコードをコンパイルして実行することに問題がないでしょう。それ以外の場合は、深刻なバグを引き起こし、そのバグの修正に何時間も費やすことになります。
コードをモジュール化することは常に推奨されます。他の部分にwhileループを配置する必要がある場合は、他の人がコードを操作するときにロジックを簡単に理解できるように、それをブロックに配置します。
if ( blah )
{
...
}
else
{
while ( !bloop() )
{
bar();
}
}
コードをブロックに配置することをお勧めします。これにより、理解とデバッグも簡単かつ簡単になります。
まあ、誰もが中括弧の使用について議論し、それらを愛しているように見えるにもかかわらず、私は実際には反対を好みます。中かっこを使用するのは、必要がない場合だけにします。
_if (...)
foo();
else while(...)
bar();
_
...実際には、この "else while(...)
"は非常に読みやすいと思います!それは普通の英語のようにさえ読みます!しかし、控えめに言っても珍しいので、人々はそれをすべて奇妙だと思うでしょう。
結局のところ、私たちは皆、それを中括弧でばかからないようにする傾向があります...
中括弧の何が問題になっているので、多くの人がそれらを書かないようにしていますか?
正確に何の問題else while
解決する ?
中かっこは安くて良いです、そして、それらは利口で機知に富んだものとは対照的に、コード意図を明白で明白にします。
Unix哲学の引用:
メンテナンスは非常に重要で非常に費用がかかるため、プログラムを作成するときの最も重要な通信は、プログラムを実行するコンピュータではなく、将来ソースコードを読んで保守する人間(自分を含む)と行うようにしてください。
急いでいるときに別の行を追加してインデントし、中かっこを忘れて何が起こっているのか頭を掻くかもしれないので、私はいつも中かっこを置きます。開始ブラケットを同じ行に置いていますが、それは問題ではありません。私はどちらの場合もそれらを持っている方が良いです。
if(blah) {
foo();
}
else {
bar();
}
何も悪いことはありません
if (blah)
foo();
else
bar();
何も問題がないように
if (blah) foo(); else bar();
適切な状況で(状況は異なる場合がありますが、その特定のスタイルは、多くの反復的なコードがある場合に最適に使用されます。その場合、各行の表示はスタイルのインデントよりも重要です)
ただし、1つの方法を選択する場合は、それに従ってください。一貫性が重要です。したがって、2番目の例は非常に悪いものです。if式にはそのステートメントの括弧が含まれているため、whileステートメントはelse節の括弧の内側ではなく、外側になければなりません。
その上、私は以前にこのコードを見たことがあります:
if (x) foo()
{
bar();
}
そしてそれはコーディング標準のナチス自身が書いた(彼はすべての括弧を主張した)。
最新のIDEは、ファイルの保存時にコードの再フォーマット(不要な中括弧の削除や追加を含む)やコードの再インデントを簡単に構成できます。したがって、あなたの例は自動的に次のようになります
if (blah) {
blub();
} else
while (!bloop()) {
bar();
}
インデントにより、不要なブレースがなくても、入れ子が常に簡単に表示されます。したがって、このようなIDE=設定を強制的に実行しても、リスクはありません。
個人的には、中かっこと改行を省略したコードが混乱を避けるため、はるかに読みやすくなっています。
if (blah) blub();
else while (!bloop()) bar();
しかし、もちろん、多くの開発者はそのようなことについて永遠にそして一日議論することをとても喜んでいます。