最近使用SourceMonitor工具做代码优化,过程中对一些原来耳熟能详的名字现在有点模糊了。这里记录一下。


函数复杂度,这里一般指的是函数圈复杂度。(Function Complexity


概念:

所谓圈复杂度是一种代码复杂度的衡量标准。在软件测试的概念里,圈复杂度“用来衡量一个模块判定结构的复杂程度,数量上表现为独立现行路径条数,即合理的预防错误所需测试的最少路径条数,圈复杂度大说明程序代码可能质量低且难于测试和维护,根据经验,程序的可能错误和高的圈复杂度有着很大关系”。


公式:

计算公式1:V(G)=e-n+2p。其中,e表示控制流图中边的数量,n表示控制流图中节点的数量,p图的连接组件数目(图的组件数是相连节点的最大集合)。因为控制流图都是连通的,所以p为1。

计算公式2:V(G)=区域数=判定节点数+1。其实,圈复杂度的计算还有更直观的方法,因为圈复杂度所反映的是“判定条件”的数量,所以圈复杂度实际上就是等于判定节点的数量再加上1,也即控制流图的区域数。

计算公式3:V(G)=R。其中R代表平面被控制流图划分成的区域数。


函数深度(Block Depth

这个概念在网上没有找到,我在SourceMonitor中试了一下。这里的深度是基于文件来的。比如文件内容如下:

Prize {
    String (String s1String s2String s3){}
    (String a){}
}

block depth(0):1

block depth(1):3


函数深度是指嵌套的层数,最外层是0,每增加一层便加一。