次のうち、ステートメントのネストを構造化するためのより良い方法はどれですかIf
。
if (x && y)
doXY();
else if (x)
doX();
else if (y)
doY();
(また)
if(x)
if(y)
doXY();
else
doX();
else if(Y)
doY();
次のうち、ステートメントのネストを構造化するためのより良い方法はどれですかIf
。
if (x && y)
doXY();
else if (x)
doX();
else if (y)
doY();
(また)
if(x)
if(y)
doXY();
else
doX();
else if(Y)
doY();
最初のものは入れ子が少ないので、そう言います。
2 番目のブロックでは、「x」が true かどうかを評価し、次にそのブロックに入り、「y」が true かどうかを評価します。一般に、コードをできるだけネストしないようにすることをお勧めします。
if (x && y)
{
// doXY
}
else if (x)
{
// doX
}
else
{
// doY
}
1.) kyndigs が言ったように、入れ子を減らすことは良い習慣です。
{ }
2.) もう 1 つの良いアドバイスは、呼び出されるメソッドが 1 つだけであるか複数であるかに関係なく、演算子のブロックを角かっこで囲むことです。
3.) 常に「if」ステートメントを単純化するようにしてください。つまりif (isTrue)
、よりも優れていますif (!(!isNotFalse))
上記のコードを次のように記述します。
if (x && y) {
doXY();
}
else if (x) {
doX();
}
else if (y) {
doY();
}
読みやすさに関しては、間違いなく最初のオプションを使用します。
しかし、それが何百万回も実行されるロジックの一部であり、x と y の両方が真である場合と x のみが真である場合、または y のみが真である場合の確率の分布が後者のいずれかを支持することがわかっている場合は、パフォーマンスのために可読性を犠牲にします。ただし、そのような最適化に飛びつく前に必ずプロファイリングを行い、if ステートメントをそのように構造化する理由を文書化して、他の開発者があなたのコードをリファクタリングしてあなたに有利に働くことがないようにしてください。
別の可能性:
if (x && y)
doXY();
if (x && !y)
doX();
if (!x && y)
doY();
これは - 前もって述べておきますが - 効率は悪くなりますが、非常に小さいため、ほとんど問題にはなりません。可読性と保守性の観点から、状況によっては、節が他の節に依存せず、指定された順序で実行する必要がないため、より良い場合があります。必要に応じて、個々の句を独自のメソッドに抽出できます。
次のこともできます。
switch (x + (y<<1))
{
case 1: doX(); break;
case 2: doY(); break;
case 3: doXY(); break;
}
免責事項:これは高速でも読みやすいものでもないことに注意してください。これは単なる代替手段であり、まれに許容できる解決策となる場合があります。
最初のものは、読みやすさと構造化の点で優れていると思います
私は、コード行を保守コストと考えるのが好きです。回線数が少ない = 低コスト。あなたの場合、最初のコード ブロックは 1 行短いので、それに投票します。
一般的に、これは当然、ステートメントのコンテキストに依存します。
SLOCのこの Wiki ページをチェックしてください。
DoXY のアクションは、アクション DoX() および DoY() と相互に排他的ですか? つまり、次のように動作するようにアクションを作り直すことはできますか:
if (x) { DoX(); }
if (y) { DoY(); }
if (X && y) { DoXY(); }
おそらく DoXY() のパラメータとして
if (X || y) { DoXY(x,y); }
しかし、読みやすさのために、おそらく最初のオプションを使用します...