[英]C++ sugar syntax for if (!result) return false;
重构某些代码时,我经常会遇到以下问题:
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。 有时,一个函数的两次调用不等同于同一函数的一次调用。 例如,该函数可能具有一些副作用或在每次调用该函数时打开/关闭的内部标志。
因此,我将在不引入宏的情况下将代码保持原样,因为该宏不等同于原始代码的对称性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.