折腾了好久,总于找到一篇关于环路复杂度的说明了,难道真的是记忆出错了,我明明记得这是在概率论的时候学习,但是事实这好像是软件的内容:
McCabe度量法
McCabe度量法是由Thomas McCabe提出的一种基于程序控制流的复杂性度量方法。McCabe复杂性度量又称环路度量。它认为程序的复杂性很大程度上取决于程序的复杂性。单一的顺序结构最为简单,循环和选择所构成的环路越多,程序就越复杂。这种方法以图论为工具,先画出程序图,然后用该图的环路数作为程序复杂性的度量值。程序图是退化的程序流程图。也就是说,把程序流程图的每一个处理符号都退化成一个结点,原来连接不同处理符号的流线变成连接不同结点的有向弧,这样得到的有向图就叫做程序图。
程序图仅描述程序内部的控制流程,完全不表现对数据的具体操作分支和循环的具体条件。因此,它往往把一个简单的IF语句与循环语句的复杂性看成是一样的,把嵌套的IF语句与CASE的复杂性看成是一样的。下面给出计算环路复杂性的方法,如图11-4所示。
根据图论,在一个强连通的有向图G中,环的个数V(G)由以下公式给出:
V(G)=m-n+2p
其中,V(G)是有向图G中环路数,m是图G中弧数,n是图G中结点数,p是图G中强连通分量个数。在一个程序中,从程序图的入口点总能到达图中任何一个结点,因此,程序总是连通的,但不是强连通的。为了使图成为强连通图,从图的入口点到出口点加一条用虚线表示的有向边,使图成为强连通图。这样就可以使用上式计算环路复杂性了。
以图4-11所给出的例子示范,其中,结点数n=6,弧数m=9,p=1,则有
V(G=m-n+2p=9-6+2=5
即McCabe环复杂度度量值为5。这里选择的5个线形无关环路为(abefa),(beb),(abea),(acfa),(abcfa),其他任何环路都是这5个环路的线形组合。
当分支或循环的数目增加时,程序中的环路也随之增加,因此,McCabe环复杂度度量值实际上是为软件测试的难易程度提供一个定量度量的方法,同时也间接表示了软件的可靠性。实验表明,源程序中存在的错误数以及为了诊断he 纠正这些错误所需要的时间与McCabe环复杂度度量值有明显的关系。
利用McCabe环复杂度度量值时,有几点说明。
(1) 环路复杂度取决于程序控制结构的复杂度。当程序的分支数目或循环数目时其复杂度也增加。环路复杂度与程序中覆盖的路径条数有关。
(2) 环路复杂度是可增加的。例如,模块A的复杂度为3,模块B的复杂度为4,则模块A与模块B的复杂度是7。
(3) McCabe建议,对于复杂度超过10的程序,应分成几个小程序,以减少程序中的错误。
(4) 这种度量的缺点是:
①对于不同种类的控制流的复杂度不能区分。
②简单IF语句与循环语句的复杂性同等看待。
③嵌套IF语句与简单CASE的复杂性是一样的。
④模块间接口当成一个简单分支一样处理。
⑤一个具有1000行的顺序程序与一行语句的复杂性相同。
尽管McCabe复杂度度量法有许多缺点,但它容易使用,而且在选择方案和估计排错费用等方面都是很有效的。









TAG:
评分(