有时,if
语句可能相当复杂或很长,因此为了可读性,最好在if
之前提取复杂的调用。
例如:
if (SomeComplicatedFunctionCall() || OtherComplicatedFunctionCall())
{
// do stuff
}
进入到这个
bool b1 = SomeComplicatedFunctionCall();
bool b2 = OtherComplicatedFunctionCall();
if (b1 || b2)
{
//do stuff
}
(提供的例子并没有那么糟糕,它只是为了说明……假设其他调用有多个参数,等等。)
但是通过这个提取,我失去了短路评估(SCE)。
发布于 2016-10-17 16:09:25
一种自然的解决方案如下所示:
bool b1 = SomeCondition();
bool b2 = b1 || SomeOtherCondition();
bool b3 = b2 || SomeThirdCondition();
// any other condition
bool bn = bn_1 || SomeFinalCondition();
if (bn)
{
// do stuff
}
这样做的好处是易于理解,适用于所有情况,并具有短路行为。
这是我最初的解决方案:方法调用和for循环体的一个好模式如下:
if (!SomeComplicatedFunctionCall())
return; // or continue
if (!SomeOtherComplicatedFunctionCall())
return; // or continue
// do stuff
短路评估可以获得同样好的性能优势,但代码看起来更具可读性。
发布于 2016-10-17 19:28:02
我倾向于将条件分解为多行,例如:
if( SomeComplicatedFunctionCall()
|| OtherComplicatedFunctionCall()
) {
即使在处理多个运算符(&&)时,您也只需要使用每对括号进行缩进。SCE仍然有效--不需要使用变量。多年来,以这种方式编写代码使我更加易于阅读。更复杂的示例:
if( one()
||( two()> 1337
&&( three()== 'foo'
|| four()
)
)
|| five()!= 3.1415
) {
发布于 2016-10-17 16:10:41
如果你有很长的条件链和保持一些短路的东西,那么你可以使用临时变量组合多个条件。以你的例子来说,可以这样做。
bool b = SomeComplicatedFunctionCall() || OtherComplicatedFunctionCall();
if (b && some_other_expression) { ... }
如果您有一个支持C++11的编译器,您可以使用lambda expressions将表达式组合成函数,如下所示:
auto e = []()
{
return SomeComplicatedFunctionCall() || OtherComplicatedFunctionCall();
};
if (e() && some_other_expression) { ... }
https://stackoverflow.com/questions/40081279
复制相似问题