简介(我自己写的,其他是翻译的)
c++核心准则是C++之父Bjarne Stroustrup针对现代C++(C++11\14\17)开发制定的一套,旨在提高程序质量的实时更新准则,在github社区维护。这套准则针对代码安全性、可读性、兼容性、并发及效率等提出了一系列启发性的建议和可行的改进措施。我认为是提升代码质量的一套非常有价值的建议,希望可以坚持翻译下去。
原因
编译器和大多数程序员不会阅读注释和设计文档,但是在代码中表达的语义可以通过编译器和其他工具检查。
例子
class Date {
public:
Month month() const; // do
int month(); // don't
// ...
};
第一个声明的month
明确表示返回一个Month
并且不会修改Date
的状态。第二个版本留给了读者猜测的空间并且可能导致难以捕获的bug。
反例
这个循环是std::find
的一个受限形式:
void f(vector<string>& v)
{
string val;
cin >> val;
// ...
int index = -1; // bad, plus should use gsl::index
for (int i = 0; i < v.size(); ++i) {
if (v[i] == val) {
index = i;
break;
}
}
// ...
}
正例
一个更清晰的表达形式应该是:
void f(vector<string>& v)
{
string val;
cin >> val;
// ...
auto p = find(begin(v), end(v), val); // better
// ...
}
设计友好的库能够比直接使用语言特性更好的表达意图(要做什么,而不是怎么做)。
一个C++程序员应该了解基本的标准库,并且适当的使用它。任何程序员都应该了解所在项目的基础库的基本知识,并且适当的使用它们。任何遵循当前准则的程序员应该了解准则适用库,并且适当的使用它。
例子
change_speed(double s); // bad: what does s signify?
// ...
change_speed(2.3);
更好的方式是去明确浮点数的意义(新速度或者旧速度的增量?)以及使用的单位:
change_speed(Speed s); // better: the meaning of s is specified
// ...
change_speed(2.3); // error: no unit
change_speed(23_m / 10s); // meters per second
我们可以接受一个无单位的double
作为增量,但是这可能很容易出错。如果我们想要同时接受绝对速度和增量,我们最好定义一个Delta
类型。
补充
通常比较难的部分:
- 一致的使用
const
(检测成员函数是否修改类成员;检测函数是否修改按指针或者引用传递的参数)- 标记类型转换(强制转换类型系统)
- 检测模仿标准库的代码(困难)