我正在开发一个最初用C编写的项目。几年前,只进行了一些小的更改,源代码是在C ++下编译的。项目非常庞大,不幸的是它看起来像这样:
#define DEVICE_A 0
#define DEVICE_B 1
..
#define DEVICE_N 50
#define COMPANY_A 0
#define COMPANY_B 1
..
#define COMPANY_N 50
//and now the interesting part in other files:
if(giCompany == COMPANY_A || giCompany == COMPANY_B ||
giCompany != COMPANY_C && giDevice == DEVICE_A)
{
//... do something
}
else
{
if(giCompany == COMPANY_D)
{
// so something different
}
}// and so on ...
在C ++中处理如此多的if-elses的最佳方法是什么?我的例子真的很小,在真正的代码中更糟糕的是,如果分支有很多,分析它需要很长时间......项目是如此之大,以至于我不会触及现有的代码,而是添加了这样的混乱就像现在我不想做的那样。我开始使用多态(每个设备的接口,设备必须实现自己的方法,而不是创建另一个if / else分支),它看起来好多了。但我想问一下,在C ++中处理这种 if / else 问题的常用方法是什么。
答案 0 :(得分:1)
使用switch-case:
it { is_expected.to install_python_package('foo') }
如果使用第二个变量(如switch(giCompany)
{
case COMPANY_A:
case COMPANY_B:
{
// Stuff
break;
}
case COMPANY_C:
{
// Stuff
break;
}
// ...
}
)进行额外检查,那将会有点棘手
答案 1 :(得分:-2)
如果所述比较函数返回std::vector
,您可以创建一个true
来保存2个函数:一个用于比较(如同语句标题),另一个用于操作。
例如:
std::vector<std::pair<std::function<bool()>, std::function<void()>>> operations =
{
{
[=]
{
return giCompany == COMPANY_A || giCompany == COMPANY_B ||
giCompany != COMPANY_C && giDevice == DEVICE_A;
},
[&] { /*... do something */ }
},
{
[=] {return giCompany == COMPANY_D;},
[&] { /* do something different */ }
},
};
for (auto const& pair: operations)
{
if (pair.first ())
{
pair.second ();
}
}
或者,如果所有if-else
个案例仅依赖于giCompany
和giDevice
,则可以将它们作为参数传递给仿函数:
std::vector<std::pair<std::function<bool(int, int)>, std::function<void()>>> operations =
{
{
[] (int company, int device)
{
return company == COMPANY_A || company == COMPANY_B ||
company != COMPANY_C && device == DEVICE_A;
},
[&] { /*... do something */ }
},
{
[] (int company, int device) {return company == COMPANY_D;},
[&] { /* do something different */ }
},
};
for (auto const& pair: operations)
{
if (pair.first (giCompany, giDevice))
{
pair.second ();
}
}
由于所有仿函数都在vector
中 - 它们将被迭代,并以与if-else
树中完全相同的顺序进行求值。但是,如果你想指定,满足某些条件,迭代应该停止,你可以添加一个输出参数:
std::vector<std::pair<std::function<bool(int, int, bool&)>, std::function<void()>>> operations =
{
{
[] (int company, int device, bool& stop)
{
stop = true;
return company == COMPANY_A || company == COMPANY_B ||
company != COMPANY_C && device == DEVICE_A;
},
[&] { /*... do something */ }
},
{
[] (int company, int device, bool& stop)
{
stop = false;
return company == COMPANY_D;
},
[&] { /* do something different */ }
},
};
for (auto const& pair: operations)
{
bool stop = false;
if (pair.first (giCompany, giDevice, stop))
{
pair.second ();
}
if (stop)
{
break;
}
}