:如何避免代码中的if嵌套

http://top.jobbole.com/4960/

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用的好也能发挥不错的作用

 

 

 

你可能感兴趣的:(代码)