循环复杂度
编辑循环复杂度(也称为圈复杂度 - 圈复杂度)是一种软件度量,可用于衡量软件模块(功能、过程或通常是一段源代码)的复杂性。
McCabe 的软件指标基于这样的想法,即在一定程度的复杂性之上,模块不再为人类所理解。 圈复杂度定义为模块控制流图上线性独立路径的数量。 这个数字是实现控制流图的完全分支覆盖所需的最小测试用例数的上限。
计算
编辑有两种方法可以计算 McCabe 的圈复杂度 - 即控制流中的线性独立路径 - 取决于二进制分支的数量或取决于控制流图中节点和边缘的数量。
按二进制分支数计算
根据 McCabe M 的复杂性度量等于二进制分支的数量 b 加 1。当考虑多个控制流图(即 p > 1 {\displaystyle p>1} )时, M = b + p 适用 {\displaystyle M=b+p} 其中
b:二进制分支的数量,即恰好有两个分支的条件指令,例如 B. IF 语句 andp:单个控制流图的数量(每个函数/过程一个图)。
具有两个以上分支的分支可以分解为二元分支。 这里 b = z − 1 也适用
z:分支数。
按节点数和边数计算
或者,可以使用控制流图中的节点和边的数量来计算复杂度度量。 在这种情况下,麦凯布数定义为 M = e − n + 2 p 其中
e:图中的边数,n:图中的节点数,p:图中的连通分量数。
指标解释
编辑根据 McCabe 的说法,一个自包含子程序的圈数不应高于 10,否则程序将过于复杂且难以测试。 然而,这条规则是有争议的,因为圈数只有在插入分支指令(如 IF)时才会增加,而在插入其他指令(例如屏幕输出)时不会增加。 因此,只能对测试工作做出声明(要测试的独立程序路径的数量)。
批评
编辑复杂性度量有时对人们来说并不直观,尤其是 switch 语句通常被认为不如其复杂性数字所暗示的那么复杂。 在下面的示例中,人们不会有混淆的问题,但是复杂度为 8 时,它获得了非常高的值。
在实践中,switch 结构通常用于这种类型的查找。 “工作日名称”函数包括8个控制流路和8个出口点,对应的复杂度数为8,仍然很容易被人考察。 然而,该结构存在危险,即可能将副作用纳入个别案例陈述中。
同一示例的以下实现明显没有那么复杂,因为不能为这八种情况编写副作用,每种情况都有自己的返回语句,并且彼此之间也没有分开。然而,重组后的代码包含更多容易出错的地方(使用运算符sizeof、数组标签的范围检查和索引的显式计算)。
内容由匿名用户提供,本内容不代表vibaike.com立场,内容投诉举报请联系vibaike.com客服。如若转载,请注明出处:https://vibaike.com/363641/