1.圈复杂度的定义
圈复杂度是由Thomas J. McCabe, Sr. 在1976年提出的概念,用于判断代码复杂度。圈复杂度(Cyclomatic complexity)又称为条件复杂度或循环复杂度,用于衡量要给模块判定结构的复杂程度;数量上表现为独立的现行的路径条数,也可理解为覆盖所有的可能情况的最少使用的测试用例数。
2.圈复杂度的计算方法
圈复杂度的概念计算方法有3种。
1)控制流程图
一般来说,软件程序的流程分为三种:顺序、条件和循环。用流程图标识出所有分支,可以表示出所有的圈复杂度。如下如所示:
2)节点判定法
一个比较简单的方法是:圈复杂度就是等于判定节点的数量加上1。在编程语言中国,条件判断if-else, swtich-case、for循环、while循环、三木运算符,都可以作为一个判定节点。(国内一些公司,比如华为等公司,就是这么计算的)
样例如下:
funciton complexityExample(param) {
if(param > 0) {
print(0);
}
else {
print(1)
}
return param < -1 :True ? False;
}
可知,这段程序的圈复杂度为3+1= 4.
3)点边计算法
计算方法为C = E - N + 2P,其中, E为控制流图(需要的方法为1)中的边的数量,N为控制流图中的节点数量,P为独立组件的数目。
可得,E为9, N为6,P为1,可得C为5。
3.圈复杂度的衡量标准
一般来说,代码复杂度第,代码不一定好;但代码复杂度高,代码质量一定差。具体衡量标准如下:
圈复杂度 | 代码状况 | 可测性 | 维护成本 |
1 - 10 | 清晰、结构化 | 高 | 低 |
10 - 20 | 复杂 | 中 | 中 |
20 - 30 | 非常复杂 | 低 | 高 |
>30 | 不可读 | 不可测 | 非常高 |
4.降低圈复杂度的方法
降低圈复杂度的方法为重构。但是,重构应该保持原有功能不变,并不断完成。
降低圈复杂度方法如下;
1)抽象配置;
2)单一职责-提炼函数;
3)合并条件;
4)提取条件。
同事,针对圈复杂度过于高的语句部分,可以提出来一个函数。