我时不时看到的一个术语是“循环复杂性”。在SO上,我看到了一些有关“如何计算语言X的CC”或“如何用最小的CC来做Y”的问题,但是我不确定我是否真正理解它是什么。
在NDepend网站上,我看到一个解释,基本上是这样说的:“方法中的决策数。每个if,for,&&等都将CC的“分数”加+1)。真的吗?如果是,为什么呢?我可以看到有人可能希望将if语句的数量保持在相当低的水平,以使代码易于理解,但这真的是要解决的一切吗?
还是有一些更深层次的概念?
我时不时看到的一个术语是“循环复杂性”。在SO上,我看到了一些有关“如何计算语言X的CC”或“如何用最小的CC来做Y”的问题,但是我不确定我是否真正理解它是什么。
在NDepend网站上,我看到一个解释,基本上是这样说的:“方法中的决策数。每个if,for,&&等都将CC的“分数”加+1)。真的吗?如果是,为什么呢?我可以看到有人可能希望将if语句的数量保持在相当低的水平,以使代码易于理解,但这真的是要解决的一切吗?
还是有一些更深层次的概念?
Answers:
我不了解更深的概念。我相信通常在可维护性指数的背景下考虑它。特定方法内的分支越多,维护该方法操作的思维模型(通常)就越困难。
具有较高圈复杂度的方法在单元测试中也很难获得完整的代码覆盖率。(谢谢马克·W!)
当然,这带来了可维护性的所有其他方面。错误/回归/可能性等。但是,核心概念非常简单。
'The more branches there are within a particular method'
...您是说更多的IF-Else语句吗?
Cyclocmatic complexity = Number of decision points + 1
决策点可能是您的条件语句,例如if,if…else,switch,for循环,while循环等。
下表描述了应用程序的类型。
圈复杂度为1 – 10被认为是常规应用
圈复杂度为11 – 20 application适度应用
圈复杂度为21 – 50 application有风险的应用
循环复杂度超过50 application不稳定的应用程序
decision_points+1
我们只需要流程图和公式呢?(无论如何,感谢您使用这种非常简单的方法!)
是的,就是这样。您的代码可以采用的执行路径越多,必须测试的内容就越多,出错的可能性就越高。
圈复杂性确实只是一个可怕的流行词。实际上,这是在软件开发中用来指出更复杂的代码部分(更可能是错误的程序,因此必须非常仔细和彻底地测试)的度量。您可以使用E-N + 2P公式进行计算,但是我建议您使用插件自动计算得出。我听说有一个经验法则,您应该努力将CC保持在5以下,以保持良好的代码可读性和可维护性。
我最近在我的Java项目上试验了Eclipse Metrics插件,它有一个非常简洁明了的帮助文件,该文件当然会与您的常规Eclipse帮助集成,并且您可以阅读有关各种复杂性度量以及技巧和窍门的更多定义。改善您的代码。
使用控制流程图来计算圈复杂度。通过程序源代码进行线性独立路径的定量度量的数量称为“循环复杂性”(if / if else / for / while)
Cyclomatric复杂度是衡量一个软件单元的复杂程度的一种度量。它度量程序使用条件逻辑构造(如果,同时,for,switch和case等)可能遵循的不同路径的数量。如果您想了解有关计算的更多信息,请观看以下精彩的youtube视频,您可以观看https://www.youtube.com/watch?v=PlCGomvu-NM
这对设计测试用例很重要,因为它揭示了程序可以采用的不同路径或方案。“为了具有良好的可测试性和可维护性,McCabe建议程序模块的循环复杂度不应超过10”(Marsic,2012,第232页)。
参考:Marsic。,I.(2012年9月)。软件工程。罗格斯大学。取自www.ece.rutgers.edu/~marsic/books/SE/book-SE_marsic.pdf