C代码复杂度指标,用于整个代码库

时间:2016-08-09 21:08:28

标签: c cyclomatic-complexity

我使用Mccabe代码复杂度作为评估我的代码库的指标,但它只给出了每个函数的代码复杂度得分。 整体代码复杂性得分由我的代码库中所有函数的得分总和给出。 我试图提出一个规范化的指标(考虑到代码行),以反映我们努力降低代码库中的复杂性的趋势。 (我们知道删除/添加功能会改变复杂性得分,但复杂性不会改变)。 有标准的方法吗?我的意思是平均复杂度有点像吗?

1 个答案:

答案 0 :(得分:1)

McCabe代码复杂度指标意味着用于函数,而不是整个程序。简单来说:如果一个函数的McCabe数超过某个限制(vulga:意大利面条代码),你应该把它分解成几个更简单的函数。

实际量度是可能路径的数量。对于单个函数来说这是相对容易的,但如果它们是相关的,那么对于几个函数来说相当复杂,也就是说,如果这些函数相互调用。

因此,如果你有独立的函数(例如:一个库),你可以添加它们,但如果它们是相关的(例如:一个完整​​的程序),你必须通过整个程序计算所有可能的路径。如果一个节点是一个函数,你必须包含McCabe数字,如果没有(例如:一个简单的分支),你可以将它包含为1(一),就像在一个函数中一样。

所以:

  • 独立功能:全部添加
  • 独立职能:
    • 以线性方式(单一路径)调用:全部添加
    • 以两种方式调用(两个线性路径):在每个路径中添加函数并添加两个路径,就像函数中的分支一样
    • n 方式调用( n 线性路径):在每个路径中添加函数并添加所有路径,就像函数中的分支一样
    • 依赖函数:如上所述,但是因为你需要计算所有可能的路径,你很快就会得到很多。

当然,您可以自动完成所有操作。好的,你需要为你的语言编写一个能够计算所有可能路径的解析器,如果值得的话......我不知道。

此外:通过将大型函数拆分为几个更简单的函数,可以减少函数的MacCabe数。现在,你如何使用完整的程序?将它拆分成几个更简单的程序/库?是的,我认为这样可行,所以你的想法似乎很合理。

但它仍然需要做很多工作。

顺便说一下:这可能是我的一个宠儿,但我不认为LoC的数量与复杂性有很大关系。除了代码行数之外,LoC是一个非常糟糕的指标。