如果使用相同的else,则重构几个嵌套

时间:2015-11-24 08:56:41

标签: if-statement design-patterns refactoring

这不是关于现有的一段代码,但我正在寻找一些嵌套ifelse语句中执行相同操作的情况下可能存在的模式。

if(condition1(a)) {       
    doSomethingWith1(a);        
    if(condition2(a)) {
        doSomethingWith2(a);
    } else {
        elseFn();
    }    
} else {
    elseFn();
}

doSomethingWith...函数正在更改a的值,使得在if中包含所有条件变得复杂。

所以我只是想知道是否有更清晰的方式来编写它(如果可能的话,用C语言)。

谢谢你们

4 个答案:

答案 0 :(得分:0)

在您的情况下,在调用if(condition1(a))以避免异常之前,看起来像第一个if a是绝对必要的,以测试doSomethingWith1(a);的值。所以,不,没有其他办法可以做到。

if(condition1(a)) {       
    doSomethingWith1(a);        
    if(condition2(a)) {
        doSomethingWith2(a);
    } else {
        elseFn();
    }    
} else {
    elseFn();
}

答案 1 :(得分:0)

你可以只计算" doSomethings"并调用elseFn,除非所有都被执行。

int count = 0;
if (condition1(a)) {
    doSomethingWith1(a);
    count++;
    if (condition2(a)) {
        doSomethingWith2(a);
        count++;
        if (condition2(a)) {
            doSomethingWith2(a);
            count++;
        }    
    }    
}
if (count < 3) {
    elseFn();
}

答案 2 :(得分:0)

我发现重复检查第一个条件更具可读性,但效率更低。这种重构消除了嵌套,没有多个功能。通过将每个逻辑路径分组为单个代码块,它还可以更清楚地显示三种不同的执行路径。

if (condition1(a) && condition2(a)) {       
    doSomethingWith1(a);
    doSomethingWith2(a);
}
else if (condition1(a)) {
    doSomethingWith1(a);
    elseFn();
}
else {
    elseFn();
}

答案 3 :(得分:-1)

我不知道在C中,但在Java中你可以写如下:

void function(int a) {
boolean b1 = condition1(a);
if (b1) {
    doSomethingWith1(a);
    boolean b2 = condition2(a);
    if (b2) {
        doSomethingWith2(a);
    }
}

if (b1 || b2) {
    return;
}
elseFn();
}