CppCoreGuidelines F.1 把一组相关的操作封装成仔细命名的函数
04 April 2022
理由:
提取公用代码,可以提高代码可读性和重用性,避免代码太复杂导致的错误。如果有些操作已经明确定义了,可以将其从代码中提取出来,起一个有意义的函数名。
错误例子:
void read_and_print(istream& is) // read and print an int { int x; if (is >> x) cout << "the int is " << x << '\n'; else cerr << "no int on input\n"; }
read_and_print
函数几乎全错了。输出到一个固定的输出流、只处理 int
类型,不可重用,逻辑上不相关的操作混在一起,局部变量在作用域范围外使用。
如果一个 lambda
需要在多处使用,可以给把它赋值给一个变量:
sort(a, b, [](T x, T y) { return x.rank() < y.rank() && x.value() < y.value();}); auto lessT = [](T x, T y) { return x.rank() < y.rank() && x.value() < y.value();}; sort(a, b, lessT); find_if(a, b, lessT);
最短的代码,不一定是性能最好、最易维护的代码。
例外:
- 循环体中的代码很少会重用。循环体要保持尽量短。
- 同样的,回调函数也很少重用。
强化:
- 保持代码简短
- 标注代码中相似的 lambda 函数,可能可以给 lambda 命名,从而可以在别处重用