Java 如何计算项目(不是类/函数)的圈复杂度?
如何计算整个Java项目的成本?每个方法都很复杂,但如何将它们聚合到一个数字度量中呢?有什么想法或现有的方法吗 我不是在找工具,而是在找算法 简单平均法很难奏效,因为有许多复杂度不高的方法,这些方法的复杂度并不低,但对代码库的重要性很低(在大多数情况下)。我发现:Java 如何计算项目(不是类/函数)的圈复杂度?,java,cyclomatic-complexity,Java,Cyclomatic Complexity,如何计算整个Java项目的成本?每个方法都很复杂,但如何将它们聚合到一个数字度量中呢?有什么想法或现有的方法吗 我不是在找工具,而是在找算法 简单平均法很难奏效,因为有许多复杂度不高的方法,这些方法的复杂度并不低,但对代码库的重要性很低(在大多数情况下)。我发现: TCC = Sum(CC) - Count(CC) + 1 TCC: Total CC Sum(CC): Sum of CC of all functions Count(CC): Number of functions 资料来源:
TCC = Sum(CC) - Count(CC) + 1
TCC: Total CC
Sum(CC): Sum of CC of all functions
Count(CC): Number of functions
资料来源:
但也许它太有限了
另一个想法是把程序的调用图看作程序本身,计算调用图的CC。节点将根据其CC进行加权。(我不知道这是否可行,这只是一个想法)
我不知道这是否有用,但我只是想告诉大家我的想法。您可以使用全局深度计数器获取方法调用深度,并在每次方法调用时更新它。 您可以看到,这里的每个方法中都手动注入了相同的代码段,但是可能有一种解决方案可以将代码自动注入到所有方法中。我认为,通过堆栈跟踪长度的级别,可以计算聚合的复杂性public class Cyclomatic
{
public static int max = Integer.MIN_VALUE;
static void a()
{
b();
int temp = Thread.currentThread().getStackTrace().length;
if (temp > max)
max = temp;
}
static void b()
{
c();
int temp = Thread.currentThread().getStackTrace().length;
if (temp > max)
max = temp;
}
static void c()
{
int temp = Thread.currentThread().getStackTrace().length;
if (temp > max)
max = temp;
}
public static void main(String[] args)
{
a();
System.out.println(max);
}
}
输出:
5
整本书都是关于代码度量的,所以幸运的是你问了一个更具体的问题。对于Java圈复杂度,您可以找到超过圈复杂度5或6的方法的数量(您在这里选择数字)。如果这个数字超过了方法数量的某个百分比,那么整体圈复杂度就很差。百分比的一个好数字完全取决于项目的大小,因此,您可以在除法中减少方法计数的权重,而不是仅除以方法的数量,方法是使其在大数字(如平方根或对数)中缓慢增长,以尝试在项目增长时使其更稳定 也许是这样的:
public double evaluateCyclomaticComplexity(List<MethodStat> methodStats) {
int bad = 0;
for (MethodStat methodStat : methodStats)
if (methodStat.getCyclomaticComplexity() >= 6)
bad++;
double denominator = Math.sqrt(methodStats.size());
return bad * 100.0 / denominator;
}
public双重评估循环复杂度(List methodStats){
int bad=0;
for(MethodStat MethodStat:methodStats)
if(methodStat.getCyclomaticComplexity()>=6)
坏++;
双分母=Math.sqrt(methodStats.size());
返回坏*100.0/分母;
}
返回的数字越小越好。对于非常糟糕的项目,这将返回大于100的值
分母函数应该表示随着代码库的增长,复杂度的增长速度如何。通常,您希望随着代码的增长,每个函数的CC值越低,这样它就可以保持可维护性,因此,随着项目大小的增加,CC值越低越好
测试它,调整它,等等。最终,代码度量很难得到正确的结果,我在阅读了几篇关于开源软件的期刊论文后可以证明这一点,这些论文使用数字来表示“可维护性”。如果花足够的时间,我们在这里能想出的任何东西都可能有很大的改进