降低圈复杂度:一种有效的代码优化策略
一、圈复杂度概念
圈复杂度(Cyclomatic complexity,简写CC)也称为 条件复杂度 或 循环复杂度,是一种代码复杂度的衡量标准。
由 Thomas J. McCabe 于1976年(McCabe1976)提出,用来表示程序的复杂度,其符号为 VG
或是 M
。它可以用来衡量一个模块判定结构的复杂程度,数量上表现为独立路径的条数,也可理解为覆盖所有的可能情况最少使用的测试用例数。圈复杂度大说明程序代码的判断逻辑复杂,可能质量低且难于测试和维护——程序的逻辑出错率和圈复杂度呈正相关关系。
原则上,一个方法(函数)的圈复杂度最好保持在 10 以内。这是因为对人类记忆力的研究表明,人的短期记忆只能存储 7 件事(偏差为正负 2)。如果开发人员编写的代码有 50 个线性独立的路径,那么为了在头脑中描绘出方法中发生的情况,需要的记忆力大约超过短期记忆容量的5倍。简单的方法不会超过人的短期记忆力的极限,因此更容易应付,事实证明它们的错误更少—— Enerjy 在2008年所做的研究表明,在圈复杂度与错误数量之间有很强的相关性。复杂度为 11 的类的出错概率为 0.28,而复杂度为 74的类的出错概率会上升到 0.98。