2016-07-13 11 views
0

私はこのようなコードを持っています。 'if else'チェーン。各関数には、その関数が呼び出されるべき条件の長いリストが含まれています。多くの条件で 'else else'チェーンをリファクタリングする

if (conditionA1() || conditionA2() && conditionA3() || ... && conditionAN()) { 
    functionA(); 
} 
else if (conditionB1() || conditionB2() && conditionB3() || ... && conditionBN() { 
    functionB(); 
} 
... 
else if (conditionZ1() || conditionZ2() && conditionZ3() || ... && conditionZN()) { 
    functionZ(); 
} 

これはリファクタリングするのに良いデザインパターンがあるかどうかは分かりにくいかもしれません。

+0

異なる言語には、これを簡単にするさまざまな機能があります。あなたの例から、これはCベースの言語に見えますが、C、java、javascript、C#などがあります。実際にどの言語で作業していますか? – AggieEric

+0

JavaScriptで作業していますが、言語に固有のものではないと考えていました。それぞれの言語に対して何かをするなら、私は別のものについての詳細を知りたいと思うでしょう – user2802557

+0

[条件式の単純化](https://sourcemaking.com/refactoring/simplifying-conditional-expressions) – jaco0646

答えて

0

私は条件文の長い鎖に対応するために2つの良いトリックを知っています。

最初に、結合条件を記述する名前付き変数を作成します。

firstCompoundCondition = conditionA1() || conditionA2() && conditionA3() || ... && conditionAN(); 
secondCompoundCondition = conditionB1() || conditionB2() && conditionB3() || ... && conditionBN(); 
... 
nthCompoundCondition = conditionZ1() || conditionZ2() && conditionZ3() || ... && conditionZN(); 

if (firstCompoundCondition) { 
    functionA(); 
} 
else if (secondCompoundCondition) { 
    functionB(); 
} 
... 
else if (nthCompoundCondition) { 
    functionZ(); 
} 

二 - これは一種の微妙な、おそらく最終的にはより強力であるが - 単に理想的な内部関数の結果を返す、返すようにあなたのコードを構成することにより、すべてのelseのための必要性を排除することであるが、ブロック内に戻ることもできます。これは多くのように見えない関数を抽出することを意味することができますが、すべてが言われて実行されるときれいになります。

firstCompoundCondition = conditionA1() || conditionA2() && conditionA3() || ... && conditionAN(); 
secondCompoundCondition = conditionB1() || conditionB2() && conditionB3() || ... && conditionBN(); 
... 
nthCompoundCondition = conditionZ1() || conditionZ2() && conditionZ3() || ... && conditionZN(); 

if (firstCompoundCondition) return functionA(); 
if (secondCompoundCondition) return functionB(); 
... 
if (nthCompoundCondition) return functionZ(); 
+0

「これは意味する多くのようには見えない関数を抽出すると、抽出され得るものは何を指していますか? – user2802557

+0

この質問の文脈では、表示するのは難しいですが、if-elseブロックの後ろにコードのブロックがあった場合、if-elseブロックを抽出して残りの関数実行します。元の関数は新しい関数を呼び出し、残りの関数を呼び出します。 –

0

条件がすべて異なる場合、ネストはできません...しかし、私が時々もっと読みやすくなるのは、それぞれの条件(または2つの条件ごと)を別々の行に入れた場合です:

if (conditionA1() || 
    conditionA2() && conditionA3() || 
    ... && 
    conditionAN()) { 
    functionA(); 
} 
else if (conditionB1() || 
     conditionB2() && conditionB3() || 
     ... && 
     conditionBN() { 
    functionB(); 
} 
... 
else if (conditionZ1() || 
     conditionZ2() && conditionZ3() || 
     ... && conditionZN()) { 
    functionZ(); 
} 

それはおかしいここで一種のように見えますが、私は、実際の条件文でそれを行う場合、通常はそれが良く見える:)