代码指标 - 气旋复杂性
使用代码指标时,最不理解的项之一似乎是循环复杂性。 本质上,对于圈复杂度来说,数字越高越不好,数字越低越好。 可以使用圈复杂性来了解任何给定代码在测试、维护和故障排除方面可能的难度,以及代码产生错误的可能性指示。 大体而言,我们通过计算源代码中做出的决策数来确定圈复杂度的值。 在本文中,你首先以一个简单的循环复杂性示例开始,快速了解概念,然后查看有关实际使用情况和建议的限制的一些附加信息。 最后,有一部分引文可用于深入探讨此主题。
例
气旋复杂性定义为测量“源代码函数中的决策逻辑量”NIST235。 简单地说,在代码中必须做出的决策越多,就越复杂。
让我们看看它的实际效果。 创建一个新的控制台应用程序,并立即通过转到“分析”>“计算解决方案的代码度量”来计算代码度量。
请注意,气旋复杂性为 2(可能的最低值)。 如果添加非决策代码,请注意复杂性不会更改:
如果添加决策,则气旋复杂性值将上升一个:
将 if 语句更改为具有四个决策的 switch 语句时,它将从原来的两个语句更改为六个:
让我们看看一个(假设)更大的代码库。
请注意,当深入到 Products_Related 类中时,大多数项的值为 1,但有几个项的复杂性为 5。 就本身而言,这种差异可能并不大,但考虑到大多数其他成员在同一类中都有一个,你应该仔细查看这两个项目,看看它们中的内容。 可右键单击该项,然后从上下文菜单中选择“转到源代码”,仔细查看。 仔细查看 Product.set(Product)
:
鉴于所有这些 if 语句,因此圈复杂度为 5。 此时,你可能会确定此结果是可接受的复杂性级别,也可以重构以减少复杂性。
神奇数字
与此行业的许多指标一样,没有适合所有组织的确切气旋复杂性限制。 但是,NIST235 确实表明,限制值 10 是一个很好的起点。
“然而,用作限制的精确数字仍然有些争议。 麦卡贝提出的10个初始限制有重要的支持证据,但限制高至15的情况也曾被成功应用。 对于具有多个操作优势的项目(例如经验丰富的员工、正式设计、现代编程语言、结构化编程、代码演练和综合测试计划),应保留超过 10 个的限制。 换句话说,组织可以选择大于 10 的复杂性限制,但前提是它确定它正在做什么,并且愿意投入更复杂的模块所需的额外测试工作。“NIST235
圈复杂度和行号
仅仅根据代码行数来判断代码质量充其量只能是个很粗略的预测。 有一些基本事实,即函数中的代码行越多,出错的可能性就越大。 但是,将旋式复杂性与代码行相结合时,可以更清楚地了解错误的可能性。
如美国宇航局软件保障技术中心(SATC)所述:
“SATC 发现最有效的评估是将大小和(圈)复杂度相结合。 具有较高复杂性和大大小的模块往往具有最低的可靠性。 具有小尺寸和高复杂性的模块也是可靠性风险,因为它们往往是过于简洁的代码,这使得更改或修改非常困难。SATC
代码分析
代码分析包括可维护性规则类别。 有关详细信息,请参阅 可维护性规则。 使用旧代码分析时,扩展设计准则规则集包含可维护性区域:
在可维护性领域有一个关于复杂性的规则:
当气旋复杂性达到 25 时,此规则会发出警告,因此有助于避免过度复杂。 若要了解有关规则的详细信息,请参阅 CA1502
总结
底线是,高复杂性数字意味着错误的概率更高,并且需要增加维护和故障排除的时间。 仔细了解具有较高复杂性的任何函数,并确定是否应重构它们以使它们变得不那么复杂。
引文
MCCABE5
麦卡贝,T. 和沃森,A.(1994年),软件复杂性(交叉谈话:国防软件工程杂志)。
NIST235
沃森,A.H.,& 麦卡贝,T.J.(1996年)。 结构化测试:使用气旋复杂性指标的测试方法(NIST 特别出版物 500-235)。 从 McCabe Software 网站检索于 2011 年 5 月 14 日:http://www.mccabe.com/pdf/mccabe-nist235r.pdf
SATC
Rosenberg, L., Hammer, T., Shaw, J. (1998)。 软件指标和可靠性(IEEE 国际软件可靠性工程研讨会)。 从宾夕法尼亚州立大学网站于 2011 年 5 月 14 日获取:“https://citeseerx.ist.psu.edu/pdf/31e3f5732a7af3aecd364b6cc2a85d9495b5c159
”