2

私は、次のようなパターンをよく使用しています。

if (a > b) {
    foo();
}
elseif (c > d) {
    bar();
}
else {
    baz();
}

ここでのポイントは、プログラム ロジックに注意深く従わない限り、2 番目の条件が最初の条件に明らかに関連していないということです。これは非常に悪いことですか?上記を次のように表現した方がよいでしょうか。

if (a > b) {
    foo();
}
else {
    if (c > d) {
        bar();
    }
    else {
        baz();
    }
 }

保守性の理由から?私が完全に見逃しているより良いパターンはありますか? 「明らかに接続されていない」ビットは、私のコードのバグのより一般的な原因の 1 つです。

4

5 に答える 5

4

それは本当に問題ではありません。

私は Leaky Rowboat* パターンを好みます:

if (a > b) 
{
    foo();
    return;
}

if (c > d) 
{
    bar();
    return;
}
baz();

あなたが何かを返すとき、これはさらに良いです:

if (a > b) 
    return foo();

if (c > d) 
    return bar();

return baz();

*早く保釈、早く保釈

于 2011-04-01T20:18:17.780 に答える
3

私は最初のものが間違いなく好ましいと思います。2番目を使用するのは、内側のif/elseにないコードを外側のelseに配置する場合のみです。

else ifを見ると、すぐにifを探します。ですから、明らかにつながっていると思います。

于 2011-04-01T20:06:03.620 に答える
1

これはコードの匂いだと思います。ここで何をしているのか、なぜそれをしているのかは明らかではありません。それらが明らかに関連しておらず、バグの頻繁な発生源であると考えているという事実は、この方法でこれを行うべきではないことを示しています.

これらの条件で分岐する理由が明確になるように、このコードを書き直してください。理想的には、コードを読み取って、意図や仕様を表現できるようにすることができます。

taller_than_wide = a > b;
more_expensive_than_normal = c > d;

if (taller_than_wide) {
      foo();
}
elseif (more_expensive_than_normal) {
      bar();
}
else {
      baz();
}
于 2011-07-12T04:55:49.920 に答える
0

2番目よりもはるかに読みやすいので、私は確かに最初のものを使用します。

2番目のオプションでは、読者は、ネストされたif場所に到達するためにどの条件が真でなければならないかを覚えておく必要があります。3番目または4番目のネストでは、ifこれは非常に煩わしく、非常に脆弱で、論理的に追跡が困難になります。

于 2011-04-01T20:27:27.507 に答える
0

2 番目の方法は使用しないでください。大きな条件のインデントが多くなるからです。

于 2011-04-01T20:16:13.693 に答える