http://stackoverflow.com/questions/24430504/how-to-avoid-if-chains
在Stack Overflow上的一个挺有趣的问题,详细整理问题和部分巧妙的回答如下。
假设我刻意写了一段代码:
bool conditionA = executeStepA(); if (conditionA){ bool conditionB = executeStepB(); if (conditionB){ bool conditionC = executeStepC(); if (conditionC){ ... } } } executeThisFunctionInAnyCase();
从代码可以看出,executeStepX 函数只有在前面的条件为真时才执行。executeThisFunctionInAnyCase 无论如何(异常除外)都会在最后执行。现在我有一个很基础的问题: 在C/C++当中,有没有什么方法可以避免这种冗长的 if 条件语句嵌套?
我知道如果不要求最后执行 executeThisFunctionInAnyCase 的话,代码可以重构成这样:
bool conditionA = executeStepA(); if (!conditionA) return; bool conditionB = executeStepB(); if (!conditionB) return; bool conditionC = executeStepC(); if (!conditionC) return;
但是,如果最后调用executeThisFunctionInAnyCase是必须的,我该如何重构if条件嵌套呢?
感觉最好的方案:
if (executeStepA() && executeStepB() && executeStepC()){ ... } executeThisFunctionInAnyCase();
猪头点评:
粗粗看来这是最好的方案,因为他简洁明白,极大的减少了代码,不过个人认为表达式不宜太复杂,如果子表达式超过3个,或者executeStep需要提供复杂的函数参数,那么就合适再写一个函数,把executeStepA() && executeStepB() && executeStepC()包装起来。
其他方案:
do { if (!executeStepA()) break; if (!executeStepB()) break; if (!executeStepC()) break;
doSomething(); }while(0); executeThisFunctionInAnyCase();
猪头点评:
这个方案也是不错的,如果不希望对代码做大的调整,这个方案可以增加一个层次,用来控制是否执行doSomething(),同时代码也被极大的简化了
void Execute() { if (!executeStepA()) return; if (!executeStepB()) return; if (!executeStepC()) return; doSometing(); } Execute(); ExecuteThisFunctionInAnyCase();
猪头点评:
这个方案实际上是猪头一开始也想到的方案,一样达到效果,不过对比之前的方案,显然还是复杂了,因为他搞出一个函数来,虽然第一个方案也可能需要包装一个函数,但明显还是比这个方案简单,因为那个方案是复杂度到了才需要加函数,这个方案是一开始就要搞出一个函数,而不看内部复杂度
goto版本:
void execute() { if(!executeStepA()) goto error; if(!executeStepB()) goto error; if(!executeStepC()) goto error; doSomething(); error: executeThisFunctionInAnyCase(); }
猪头点评:
这个方案看起来也不错,看起来goto用的好也能发挥不错的作用