重构if-else-if结构

Joh*_*lis 7 c++ refactoring c++11

我怎样才能重构以下C++代码?我在我的程序中使用C++ 11

void f(int a, int b, int c, int d, int e, int f) {

  // MAX1..MAX6 are constants, N1..N6 are constants
    if( a > MAX1) {
        .. code block 1..
    }
    else if(b > MAX2) {
        .. code block 2..
    }
    else if(c > MAX3) {
        .. code block ..
    }
    else if(d > MAX4) {
        .. code block 3 ..
    }
    else if(e > MAX5) {
        .. code block 4 ..
    }
    else if(f > MAX6) {
        .. code block5 ..
    }
    else if(( a > N1) && ( b > N2)) {
            .. code block 6 ..
    }
    else if(( c > N3) && ( d > N4)) {
            .. code block 7 ..
    }
    else if (( e > N5) && ( f > N6)) {
            .. code block 8 ..
    }
    else if (( a > N1) && ( b > N2) && (d > N4)) {
            .. code block 9 ..
    }
    else if (..some combination of (a > N1) to (f > N6)...) {
            // there are more than 30 such combinations in my code
            .. code block XX ..
    }
    else {
            .... code block ....
    }
Run Code Online (Sandbox Code Playgroud)

Aki*_*nen 1

函数中最多有 64 个代码块,每个代码块都可以使用匿名函数或命名函数:

my_func_array[64] = {
    [CONDITION(1,0,0,0,0,0)] = { codeblock1 },
    [CONDITION(0,1,0,0,0,0)] = { codeblock2 },
     ...
};
Run Code Online (Sandbox Code Playgroud)

该宏基本上会将前 6 个输入连接到一个索引,本质上转换为:

 my_func_array[64] = {
    [32] = { ... },
    [16] = { ... },
 };
Run Code Online (Sandbox Code Playgroud)

这意味着您不必按任何特定顺序输入条件......

运行时,您还必须评估所有条件:

 int condition = CONDITION(a < MAX1, b < MAX2, c < MAX2, ...);
 if (my_func_array[condition])
      my_func_array[condition]();
 else
 {
      // this second block should cover all the other cases
      int condition2 = CONDITION(a < N1, b < N2, c < N3, ... );
      if (my_func_array2[condition2])
          my_func_array2[condition2]();
 }
Run Code Online (Sandbox Code Playgroud)