0

我正在使用 C/C++ 中的一个布尔函数来验证多个条件(它们本身就是布尔函数),并且只有在所有条件都为true时才返回true

前段时间我开始使用 Guard Clauses 而不是嵌套的if s,即使它需要有多个返回,如下所示:

bool foo(){
 //some initialization

 if( !condition_1() ){
  return false;
 }

 if( !condition_2() ){
  return false;
 }

 ...

 if( !condition_n() ){
  return false;
 }

 return true;
}

但现在我问自己,仅使用一个布尔逻辑返回是否是一个不错的选择,例如:

bool foo(){
 //some initialization
 return condition_1() && condition_2() && ... && condition_n() ;
}

我没有任何代码可以在守卫之后运行,而且只有少数几个,所以 return 语句不是那么拥挤,代码也不难阅读。这个想法是避免嵌套if s 并在我的函数中只使用一个退出点。

我测试了代码,它运行良好,即使 condition_1() 对 condition_2() 进行了一些更改。所以我知道保护条款代码和这个版本是等价的,执行顺序是从左到右保持的。那是对的吗?是否有任何隐藏的差异使两个版本不是 100% 等效?

谢谢!

4

2 回答 2

3

您的新方法很好,取决于您是否想做的不仅仅是 concat bool 操作,使用本地可能对维护和可读性很有用。

bool foo(){
 //some initialization
 bool returnCondition = condition_1() &&
                        condition_2() && 
                        condition_3() && 
                        .... && 
                        condition_n();

 return returnCondition;
}

顺便说一句,没有什么是最好的选择。实际上,如果您的目标是代码混淆,那么您的第一个选择比第二个要好。

于 2019-07-25T12:00:37.827 回答
1

从技术上讲,如果函数 condition_n() 仅用于检查,则您使用的两种方法是正确的。

但是,如果您需要根据某些情况更改它们内部的某些内容,那将是一个问题。

编写函数体的最佳实践如下:

  • 定义默认返回值
  • 一些处理
  • 返回结果

让我们重写上面的函数:

bool foo(){
//some initialization
  bool ret = true;

  if(condition_1() == false){
     ret = false;
  }
  else if(condition_2() == false){
     ret = false;
  }

  ...

  else if(condition_n() == false){
     ret = false;
  }

 return ret;
}
于 2019-07-25T12:19:12.833 回答