if(!结果)返回false;的C 糖语法;

C++ sugar syntax for if (!result) return false;

本文关键字:语法 false 返回 结果 if      更新时间:2023-10-16

重构一些代码时,我经常遇到以下内容:

bool highLevelFunc foo()
{
  // ...
  bool result = LesserLevelFunc();
    if (!result) return false;
  // ... Keep having fun if we didn't return
}

有什么方法可以使它更加性感和更少的详细信息?当然没有任何开销或陷阱。

我能想到一个宏

#define FORWARD_IF_FALSE(r) if (!r) return r;
bool highLevelFunc foo()
{
  // ...
  FORWARD_IF_FALSE(LesserLevelFunc());
  // ...
}

有什么好处,即没有预处理器宏?

对我来说,"可读"代码是性感的。我发现原始代码比您的建议更可读,因为原始代码使用标准C 语法,后者使用了一个宏,我必须去查找。

如果您想更加明确,则可以说if (result == false)(或者更好,if (false == result)以防止可能的分配 - 符合时间表的错误),但是了解!操作员在我看来是一个相当合理的期望。

也就是说,没有理由将退货值分配给临时变量;您可以轻松地说:

if (!LesserLevelFunc()) return false;

这对我来说是很可读的。

编辑:您也可以考虑使用异常而不是返回值来传达失败。如果LesserLevelFunc()提出异常,则您无需在highLevelFunc()中编写任何特殊代码即可检查成功。例外将通过呼叫者传播到最近匹配的catch块。

,因为如果LesserLevelFunc返回True,您可能会继续进行,我建议保持它与现在的状态非常接近:

if (!LesserLevelFunc())
    return false;

首先,介绍了您制作代码不安全的宏。此外,您的宏无效。

否定操作员之后的表达式应包含在括号中。

#define FORWARD_IF_FALSE(r) if (!( r ) ) return r;

其次,宏调用r两次。有时,两个函数的调用不等于一个相同函数的调用。例如,该函数可以具有某些副作用或内部标志,这些函数在函数的每个调用中都打开/关闭。

因此,我将保留代码不在不引入宏的情况下,因为宏不等于原始代码的汇声。