if(...){
if(...){
}else{
...
}
}else if(...){
if(...){
}else{
...
}
}else{
...
}
在编码总是遇到这种情况,它看起来很可怕。怎么避免呢?
答案 0 :(得分:2)
没有一般规则。但是,有两种常见的情况是:
根据您的需求和代码,这些可能是更好的解决方案。
答案 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(...);
}
显然,您通过了执行子条款所需的任何变量。然后,您将对这些子条款执行相同的操作,直到您拥有大量小文件。将文件命名为逻辑符号非常重要,否则您可能会在类似的声音名称中丢失。