重构多个嵌套if with same else

Refactor several nested if with same else

这与现有代码无关,但我正在寻找某些嵌套 if 在其 else 语句中执行相同操作时可能存在的模式。

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

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

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

谢谢大家

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

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

我不知道在 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();
}

您可以只保留 "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();
}

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

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