18 March 2022

C++ 核心指南目录

I.6: Prefer Expects() for expressing preconditions

理由

可以明确前置条件,可以通过某些外部工具进行检查确保。

例子

int area(int height, int width)
{
    Expects(height > 0 && width > 0);            // good
    // ...
}
int area(int height, int width)
{
    if (height <= 0 || width <= 0) my_error();   // obscure
    // ...
}

注意

前置条件可以通过多种方式声明:注释、 if 条件语句、assert()断言。然而,这些方式要么很难和普通代码区分开,要么很难更新,要么很难让工具处理,而且可能语义上是错的。(你希望在 debug 模式下总是中断程序进行检查?然后在实际生产环境不做检查?)

注意

前置条件应该是接口的一部分,而不是实现的一部分。但是C++语言目前还不支持。一旦语言支持,核心指南会引入标准的前置条件、后置条件与断言判断。

注意

Expects() 也可以在算法过程中,检查条件是否满足。

注意

不建议用无符号型数据来确保传入的数据非负。

强化

  • 目前语言层面还不支持,请检查assert()判断是否合理。