代码复杂度是指代码中的分支数量,比如有一个if分支,代码复杂度就加1,如果if中有“||”或者“&&”那么代码复杂度就加2,for和while同理。一般复杂度超过10的类就算是比较复杂的了,而这个类的复杂度竟然达到了30,代码的糟糕程度可见一斑,现在我们就来重构一下这个类的代码。
圈复杂度:
复杂度越高,软件质量就越低,测试就越困难。
圈复杂度(McCabe),其复杂度V(G)可按以下公式计算:
V(G) = E – n + 2 其中,E为图G中的边数,n为图G中的节点数。
验证:
我们采用圈复杂度的其他计算方法进行验证:平面被控制流图划分成的区域数即为圈复杂度。
针对复杂的控制流图使用区域计算更为简单,但多数采用上述计算方式。
减小圈复杂度的方法
a. 提取函数 - 将独立业务或模块代码独立出来,封装为函数,通过函数名诠释代码作用,做到见名知意。
b. 替换算法 - 复杂算法会导致bug可能性的增加及可理解性/可维护性的降低,如果函数对性能要求不高,提倡使用简单明了的算法。
c. 分解条件式 - 复杂的条件表达式,使用函数进行封装
d. 合并条件式 - 将一系列得到相同结果的条件表达式合并,可以的话封装为函数
e. 合并重复的条件片段 - 不同条件的分支,有相同的处理,可以提炼出分支以外,或者封装为函数
f. 移除控制标记 - 使用控制标签作为条件的,使用break 和 return取代
g. 将查询函数和修改函数分离 - 单一职责原则,强调函数的复用性而不是多用性
h. 函数携带参数 - 使用带参函数,强调函数的复用性
i. 以明确函数取代参数 - 强调函数的功能的明确性