CppCoreGuidelines I.1 接口定义要清晰明确
22 February 2022
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
作用域的变量写数据