CppCoreGuidelines F.3 函数要短小、简洁
06 April 2022
F.3: Keep functions short and simple
理由
长函数复杂难读、导致变量范围过大。复杂逻辑结构过长,容易隐藏逻辑错误。
例子
double simple_func(double val, int flag1, int flag2) // simple_func: takes a value and calculates the expected ASIC output, // given the two mode flags. { double intermediate; if (flag1 > 0) { intermediate = func1(val); if (flag2 % 2) intermediate = sqrt(intermediate); } else if (flag1 == -1) { intermediate = func1(-val); if (flag2 % 2) intermediate = sqrt(-intermediate); flag1 = -flag1; } if (abs(flag2) > 10) { intermediate = func2(intermediate); } switch (flag2 / 10) { case 1: if (flag1 == -1) return finalize(intermediate, 1.171); break; case 2: return finalize(intermediate, 13.1); default: break; } return finalize(intermediate, 0.); }
以上代码太过复杂。很难判断分支有没有全部覆盖到。
我们可以这样重构:
double func1_muon(double val, int flag) { // ??? } double func1_tau(double val, int flag1, int flag2) { // ??? } double simple_func(double val, int flag1, int flag2) // simple_func: takes a value and calculates the expected ASIC output, // given the two mode flags. { if (flag1 > 0) return func1_muon(val, flag2); if (flag1 == -1) // handled by func1_tau: flag1 = -flag1; return func1_tau(-val, flag1, flag2); return 0.; }
注意
一个函数“无法满屏显示”就太长了。5 行以内的函数比较正常。
注意
把长函数拆成高内聚的独立函数。小函数也很容易内联,这样函数调用也不会带来太大开销。
强化
- 标注无法“一个屏幕显示”的函数。一屏多大?140 字符x 60行。差不多一张书页大小。
- 标注太复杂的函数。多复杂?可以使用圈复杂度分析。10 个逻辑分支以上就够复杂的了。