C++核心准则边译边学 In.1: Express ideas directly in code 直接在代码中表达想法

源网址:CppCoreGuidelines

简介(我自己写的,其他是翻译的)

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(检测成员函数是否修改类成员;检测函数是否修改按指针或者引用传递的参数)
  • 标记类型转换(强制转换类型系统)
  • 检测模仿标准库的代码(困难)
上一篇:Winform Echarts 显示百度地图的用法(3)


下一篇:node.js&express操作cookie