我有这样的代码,我觉得很难读:
// code1
if( (expensiveOperation1() && otherOperation() && foo())
|| (expensiveOperation2() && bar() && baz()) {
// do something
}
我只是将其更改为以下内容,以使其更具可读性:
// code2
const bool expr1 = expensiveOperation1() && otherOperation() && foo();
const bool expr2 = expensiveOperation2() && bar() && baz();
if(expr1 || expr2){
// one of the conditions met
}
但是我现在应该关注效率吗?
我的意思是,在
code1
中,如果满足了第一个连接子句,那么即使去看看第二个连接子句也不会费心,因为已经很清楚该语句是正确的。但是在我更具可读性的示例中,必须同时计算
cond1
和cond2
。还是如果在其他地方未使用expr2,编译器是否足够聪明,可以将code2
更改为code1
? 最佳答案
我应该说不应该,因为如果任何功能都有副作用,它们在逻辑上是不等效的。
但是,以下内容是等效的,并且它具有使您可以为测试函数指定描述性名称的优点,从而使代码更具自记录性:
// code3
inline bool combinedOp1()
{
return expensiveOperation1() && otherOperation() && foo();
}
inline bool combinedOp2()
{
return expensiveOperation2() && bar() && baz();
}
然后按如下方式调用它:
if (combinedOp1() || combinedOp2())
{
// do something
}