05 April 2022

C++ 核心指南目录

F.2: A function should perform a single logical operation

理由

一个函数一次只处理一个逻辑上相关的操作,更容易理解、测试、重用。

例子

void read_and_print()    // bad
{
    int x;
    cin >> x;
    // check for errors
    cout << x << "\n";
}

这样的整块代码,限定了需要特定的输入,很难复用。相反,拆分成多个逻辑相关的函数,并参数化,就变得更清晰,更容易复用:

int read(istream& is)    // better
{
    int x;
    is >> x;
    // check for errors
    return x;
}

void print(ostream& os, int x)
{
    os << x << "\n";
}

这样,就可以根据需要组装函数:

void read_and_print()
{
    auto x = read(cin);
    print(cout, x);
}

如果需要,还可以进一步将read()print() 的数据类型、输入输出机制、以及错误处理等进行参数化。

auto read = [](auto& input, auto& value)    // better
{
    input >> value;
    // check for errors
};

auto print(auto& output, const auto& value)
{
    output << value << "\n";
}

强化

  • 遇到有多个输出参数的函数,看看可不可以用返回值,或者用 tuple 返回多个值。
  • 遇到无法在一个页屏幕显示的函数,考虑是否可以拆分成命名良好、规模小的子函数
  • 看到有 7 个以上参数的函数,考虑是否能进行优化