22 February 2022

C++ 核心指南目录

理由:正确性。没有定义的接口推测,很容易忽视,很难测试。

坏例子:通过全局变量控制函数行为。很容易造成误解。

int round(double d)
{
    return (round_up) ? ceil(d) : d;    // don't: "invisible" dependency
}

一旦 round_up 变了,传入相同的参数,返回不同的结果。

例外:有时需要通过环境变量来切换一组操作,比如:

  • 正常输出(normal)
  • 详细输出(verbose)
  • debug
  • 优化(optimized)

坏例子:通过 errno 等非局部变量报错,容易被忽略。

// don't: no test of printf's return value
fprintf(connection, "logging: %d %d %d\n", x, y, s);

connection 可能挂掉,导致没有日志输出。

替代选项:抛出一个异常。异常不会被忽略。

替代配方:避免在接口之间以非局部的或隐藏状态来传递信息。比如非 const 成员函数通过对象状态传递信息给其他成员函数。

替代配方:接口应该是一个函数或一组函数。函数可以是函数模板;一组函数可以是类或类模板。

加强:

  • 函数不该通过 namespace 作用域的变量决定控制流
  • 函数不可往 namespace 作用域的变量写数据