Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何计算项目(不是类/函数)的圈复杂度?_Java_Cyclomatic Complexity - Fatal编程技术网

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 资料来源:

如何计算整个Java项目的成本?每个方法都很复杂,但如何将它们聚合到一个数字度量中呢?有什么想法或现有的方法吗

我不是在找工具,而是在找算法

简单平均法很难奏效,因为有许多复杂度不高的方法,这些方法的复杂度并不低,但对代码库的重要性很低(在大多数情况下)。

我发现:

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值越低越好

测试它,调整它,等等。最终,代码度量很难得到正确的结果,我在阅读了几篇关于开源软件的期刊论文后可以证明这一点,这些论文使用数字来表示“可维护性”。如果花足够的时间,我们在这里能想出的任何东西都可能有很大的改进