多个文件的平均圈复杂度

Average Cyclomatic Complexity of multiple files

我 运行 对几个项目进行了静态代码分析,并从生成的报告中获得了这些项目中每个文件的圈复杂度。 现在我想计算整个项目的平均圈复杂度。

我怎样才能最好地做到这一点?

仅将每个文件的圈复杂度值相加然后除以文件数对我来说似乎是错误的,因为短头文件与非常长的文件具有相同的影响。另外,我想避免通过代码行来衡量文件的重要性。

还有其他方法吗?例如,中位数?

圈复杂度实际上衡量的是源代码中决策的数量。 (它实际上比一般情况下更复杂,但在结构化代码的情况下会衰减到那个)。它通常计算为#decisions+1,即使在更复杂的情况下也是如此(是的,这是一个近似值)。

因此,如果您有两个 CC 度量,x 和 y,

   CC(x)=#decisions(x)+1,

   CC(y)=#decisions(y)+1,

总数

   CC(x with y) = #decisions(x)+#decisions(y)+1=CC(x)+CC(y)-1

因此,如果您有 N 组 CC 数据,则整体 CC 的一个很好的近似值是:

   [Sum i=1..n: CC(i)]-(N-1)

如果您想要系统中每个文件的平均值,请将以上除以 N。

根据你的问题,我想说你首先需要定义关于平均 CC 的意图。

如果你想计算项目文件的平均 CC,比如将它与另一个项目进行比较,然后将文件的 CC 相加并除以 code 文件的数量是正确的做法。但它没有比 平均值 更好的了:它不能代表单个文件级别的预期特征。所以当你说:

since a short header file would have the same impact as a very long file

这是错误的。短头文件和非常长的文件 not 具有相同的 CC,并且您 not 使用平均 CC 来比较各个文件。

如果平均 CC 用于比较项目之间:从统计的角度来看,软件指标确实存在偏斜分布,因此使用中位数可能更好,确实如此。但这又一次在很大程度上取决于您对它的用途。

正如您所说,平均指标不是很有用,因为大量的简单函数可能 "hide" 一个非常复杂。所以,我更喜欢比较分布图。它提供了更多信息。

免责声明:我是执行此操作的 Metrix++ 的作者。请检查分布图的样子:http://metrixplusplus.sourceforge.net/workflow.html#workflow_view_summary_section