22 February 2022

C++ 核心指南目录

I.1: Make interfaces explicit

理由

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

例子

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

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 作用域的变量写数据