【问题标题】:Average Cyclomatic Complexity of multiple files多个文件的平均圈复杂度
【发布时间】:2015-05-11 18:10:23
【问题描述】:
我对几个项目进行了静态代码分析,并从生成的报告中获得了这些项目中每个文件的循环复杂度。
现在我想计算整个项目的平均圈复杂度。
我怎样才能最好地做到这一点?
将每个文件的圈复杂度值相加,然后除以文件数对我来说似乎是错误的,因为短头文件与非常长的文件具有相同的影响。另外,我想避免通过代码行来衡量文件的重要性。
还有其他方法吗?比如有中位数?
【问题讨论】:
标签:
static-analysis
metrics
code-metrics
cyclomatic-complexity
【解决方案1】:
圈复杂度实际上衡量的是源代码中的决策数量。 (它实际上比一般情况下更复杂,但在结构化代码的情况下会衰减)。它通常被计算为#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。
【解决方案2】:
根据您的问题,我想说您首先需要定义您对平均 CC 的意图。
如果您想计算项目文件的平均 CC,比如将其与另一个项目进行比较,那么将文件中的 CC 相加并除以 代码 文件的数量是正确的做。但它没有比平均更好的了:它不能代表单个文件级别的预期特征。所以当你说:
since a short header file would have the same impact as a very long file
这是错误的。短头文件和非常长的文件不具有相同的 CC,您将不使用平均 CC 来比较单个文件。
如果使用平均 CC 来比较项目之间的差异:从统计角度来看,软件指标的分布确实偏斜,因此使用中位数可能会更好,确实。但是,这在很大程度上取决于您对它的用途。