如何避免过多嵌入if-else?

时间:2015-12-09 06:13:19

标签: c++

像这样:

if(...){
    if(...){
    }else{
       ...
    }
}else if(...){
    if(...){
    }else{
       ...
    }
}else{
    ...
}
在编码总是遇到这种情况,它看起来很可怕。怎么避免呢?

3 个答案:

答案 0 :(得分:2)

没有一般规则。但是,有两种常见的情况是:

  1. 当开关/案例可以帮助您减少代码量时。
  2. 当您应该使用状态机设计代码时。
  3. 根据您的需求和代码,这些可能是更好的解决方案。

答案 1 :(得分:0)

假设:你想根据if-else ladder中检查的结果来调用某个函数。

如果你有一个使用你在if-else条件中检查的值计算的索引,那么如果梯子太大,那么拥有函数指针的静态数组可能会对你有所帮助。

例如

uint8_t x;
uint8_t y;

if(x == 1)
{
  if (y == 1)
       call11();
  else if (y==2)
       call12();
}
else if( x == 2)
{
  if (y == 1)
       call21();
  else if (y==2)
       call22();
.
.
.
}
else if(x ==3)
.
.
.

以上代码可以替换如下

typedef void (*FuncPtr)();
FunPtr array[65535];

//intialize at once with some function
void initFunArray()
{
 array[1*256 + 1] = call11;
 array[1*256 + 2] = call12;
....
 array[2*256 + 1] = call21;
 array[2*256 + 2] = call22;
....
 array[3*256 + 1] = call31;
 array[3*256 + 2] = call32;
....
// Others will be set to null as array is static
}


uint8_t x;
uint8_t y;

index = x*256 + y;
array[index](); // calling appropriate call.

答案 2 :(得分:0)

一般来说,当我看到这样的代码时,我倾向于畏缩一点。最糟糕的情况是一个文件,长22000行,只有三个功能 - 这让我哭泣。

事实上,在最低级别,你有一系列通常意味着某种类型的条件。

所以你的代码看起来有点像:

    If (...) {
       OnTypeConditionOne(...);
     Else if (...) {
       OnTypeConditionTwo(...);
     Else {
       OnTypeConditionThree(...);
     }

显然,您通过了执行子条款所需的任何变量。然后,您将对这些子条款执行相同的操作,直到您拥有大量小文件。将文件命名为逻辑符号非常重要,否则您可能会在类似的声音名称中丢失。