重构' if else'链条有很多条件

时间:2016-07-13 13:14:36

标签: oop if-statement design-patterns refactoring

我的代码看起来像这样。一个' if else'每个链包含一长串条件列表,该条件列表应该何时调用该函数。

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

它看起来像混乱的代码,可能难以维护,并想知道是否有一个好的设计模式来重构这个。

2 个答案:

答案 0 :(得分:0)

如果条件都不同,那么嵌套是不可能的......但是,我发现有时更具可读性的是我将每个条件(或每两个条件)放在一个单独的行上,例如:

    select temp.content,MAX(temp.AvgContent)
    FROM
    (
    select ContentType AS content, AVG(Result) as AvgContent 
    from dopractice 
    where StudentId = @S_Id 
    group by ContentType order by ContentType desc
    ) AS temp
   group by  temp.ContentType;

这看起来很有趣,但通常如果我用实际条件做它看起来更好:)

答案 1 :(得分:0)

我知道处理长条件条件的两个好方法。

首先是创建命名变量来描述组合条件。

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();