Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
If statement 使用相同的else重构多个嵌套if_If Statement_Design Patterns_Refactoring - Fatal编程技术网

If statement 使用相同的else重构多个嵌套if

If statement 使用相同的else重构多个嵌套if,if-statement,design-patterns,refactoring,If Statement,Design Patterns,Refactoring,这不是关于一段现有的代码,而是我在寻找一些可能存在的模式,如果一些嵌套的if在其else语句中执行相同的操作 if(condition1(a)) { doSomethingWith1(a); if(condition2(a)) { doSomethingWith2(a); } else { elseFn(); } } else { elseFn(); } doSomethingWith

这不是关于一段现有的代码,而是我在寻找一些可能存在的模式,如果一些嵌套的
if
在其
else
语句中执行相同的操作

if(condition1(a)) {       
    doSomethingWith1(a);        
    if(condition2(a)) {
        doSomethingWith2(a);
    } else {
        elseFn();
    }    
} else {
    elseFn();
}
doSomethingWith…
函数正在更改
a
的值,使得将所有条件都包含在一个
中变得复杂

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


感谢各位

在您的情况下,看起来第一个if,
if(条件1(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();
}
int count=0;
如果(条件1(a)){
剂量1(a);
计数++;
如果(条件2(a)){
2(a)的剂量;
计数++;
如果(条件2(a)){
2(a)的剂量;
计数++;
}    
}    
}
如果(计数<3){
elseFn();
}

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

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

doSomethingWith2(a)
必须在
condition1(a)
为真时执行。
elseFn()
必须在
b1
为真且
b2
为假时执行。当然还有另一种方法!布尔逻辑总是有替代方案的。有关广泛的示例,请参见;有关具体示例,请参见此问题的其他答案。还有,为什么要将问题代码复制到答案中?