如果有一个大的(大约100加)if else语句如下,if else条件可能是不规则的(例如一些取决于3个变量,有些取决于4),有没有办法让它变得更简单?
基本上我有一个大约100多行的表,其中a,b,c和d作为列.基于a,c和d,我需要执行3种不同类型的功能.
该表描述了一组业务规则.
uint8 a; uint8 b; uint16 c; uint8 d; if ( a == 1 && b == 1 && c == 0) { functionA();} else if ( a == 5 && b == 5 && c == 2 && d == 2) { functionB();} else if ( a == 1 && (b ==36 || b == 7) && c == 0) { functionC();} else if ( a == 3 && b == 3 && d == 50) {functionA();} : :
解决方法
有很多方法可以使它更简单,例如:
>您可以从包含a,c和d值的结构填充地图以检查要调用的函数(填充地图的代码可能仍然是一团糟,但它会更快更清晰地执行;可以为案例添加两个键ala b == x || b == y)
>你可以手动分析条件:给出你的例子,如果(a == 1)if(b == 1&& c == 0)functionA();否则if((b == 36 || b == 7)&& c == 0)functionC();. switch语句可以使这个更干净.在这样的分解中,您还可以使用<,< =,>和/或> =来划分更大的搜索空间,从而将性能从O(N)提高到O(log2N).
>对于测试a,c和d一次的常见简单情况,使用宏ala #define ELIF_ABCD(A,B,C,D,F)否则if(a ==(A)&& b ==(B)&& c ==(C)&& d ==(D))F();.根据需要为其他测试组合添加宏,例如ABD,ABC,AD.
>(可能使代码更加神秘),但可以探索位移和将值组合成一个足够大的类型(int64_t),然后例如.二进制搜索函数指针数组
值得注意的是,if / else链可能包含以下内容:
if (a == 1 && c == 3 && d == 2) functionY(); else if (a == 1 && b == 2 && c == 3) function X();
这里,顺序很重要,因为输入可以匹配两者.如果不同地考虑搜索或者使用某种方式对函数指针进行索引,则这个方面很容易丢失或改变,这是支持上述宏方法的一个论据.