if(!结果)返回false;的C 糖语法;
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两次。有时,两个函数的调用不等于一个相同函数的调用。例如,该函数可以具有某些副作用或内部标志,这些函数在函数的每个调用中都打开/关闭。
因此,我将保留代码不在不引入宏的情况下,因为宏不等于原始代码的汇声。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 1d 智能指针不适用于语法 (*)++
- 助记符和指向成员语法的指针
- 伪造事实↔false
- 有人能分解一下这个c++模板的语法吗
- C++避免重复声明的语法是什么
- QueryWorkingSet总是返回false
- QMetaObject invokeMethod的基于函数指针的语法
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 如何区分地图中的 0 和 false?
- 单独定义模板化嵌套类方法的正确语法
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 错误 C2760:语法错误:映射迭代器上意外的标记"标识符",预期的";"
- 为什么我会收到错误 C2143 语法错误:缺少"*"之前的';'?
- 奇怪的代码抛出编译错误模板< J,int aSize=10> C2143:语法错误:在"<"之前缺少";"
- 模板参数列表中的 false 在模板初始化期间计算为什么?
- 使用基类指针调用基类的值构造函数的语法是什么?
- Arduino-C++ bool 不会从 false 变为 true
- if(!结果)返回false;的C 糖语法;