我对几个项目进行了静态代码分析,并根据生成的报告为这些项目中的每个文件获得了Cyclomatic Complexity。 现在我想计算整个项目的平均Cyclomatic Complexity。
我如何才能最好地实现这一目标?
只是将每个文件的Cyclomatic Complexity值相加然后除以文件数似乎是错误的,因为短头文件与非常长的文件具有相同的影响。另外,我想避免通过代码行加权文件的重要性。
还有其他办法吗?例如,中位数?
答案 0 :(得分:4)
实际上的循环复杂性衡量源代码中的决策数量。 (它实际上比一般情况下更复杂,但在结构化代码的情况下却衰弱了)。它通常被计算为#decision + 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。
答案 1 :(得分:0)
从你的问题来看,我会说你首先要确定你对平均CC的意图。
如果你想计算项目文件的平均CC,比如将它与另一个项目进行比较,那么从文件中添加CC并除以代码文件的数量是正确的做。但它没有比平均值更好的东西:它不代表单个文件级别的预期特征。所以当你说:
since a short header file would have the same impact as a very long file
这是错的。短头文件和非常长的文件不具有相同的CC,并且不使用平均CC来比较单个文件。
如果使用平均CC来比较项目之间的比较:从统计角度来看,软件指标确实偏离了分布,因此确实使用中位数可能更好。但它又一次在很大程度上取决于你对它的用法。
答案 2 :(得分:0)
正如你所说的那样,平均指标不是很有用,因为大量的简单函数可能会隐藏"一个非常复杂。所以,我更喜欢比较分布图。它提供了更多信息。
免责声明:我是Metrix ++的作者。请检查分发图的外观:http://metrixplusplus.sourceforge.net/workflow.html#workflow_view_summary_section