McCabe的复杂性度量和独立路径

sYl*_*l3r 1 metrics cyclomatic-complexity code-metrics path-finding unstructured-loop

int maxValue = m[0][0];         
for (int i = 0; i < N; i++) 
{               
    for (int j = 0; j < N; j++) 
    {                    
        if ( m[i][j] >maxValue )        
        {                 
            maxValue = m[i][j];     
        }                     
    }                    
}                   
cout<<maxValue<<endl;           

int sum = 0;                
for (int i = 0; i < N; i++)     
{                   
    for (int j = 0; j < N; j++)     
    {                    
        sum = sum + m[i][j];            
    }                    
} 
cout<< sum <<endl;
Run Code Online (Sandbox Code Playgroud)

对于上面的代码,如果我们绘制这样的流程图 流程图基本独立路径将遵循六
路径1:1 2 3 10 11 12 13 19
路径2:1 2 3 10 11 12 13 14 15 18 13 19
路径3:1 2 3 10 11 12 13 14 15 16 17 15 18 13 19
路径4:1 2 3 4 5 9 3 10 11 12 13 19
路径5:1 2 3 4 5 6 8 5 9 3 10 11 12 13 14 15 16 17 15 18 13 19
路径6:1 2 3 4 5 6 7 8 5 9 3 10 11 12 13 14 15 16 17 15 18 13 19

所以这里的问题是根据给定的代码路径2,3,4无法测试(注意循环中的"N").那么可以不在基本集中给出实际执行路径吗?...或者根据macabe复杂度指标,我们必须更改上面给出的代码.因为我的导师说我们必须更改代码,他说有非结构化的循环所以我们必须更改代码.(我也没有看到非结构化的循环)但我的感觉是,如果我们改变代码,实际输出可能与预期输出不同.所以请有人解释一下

Ale*_*nik 6

1)McCabe的复杂度可以计算为决策点的数量+ 1.在您的情况下,有5个决策点(节点3,5,6,13和15),这意味着代码片段的McCabe复杂度为5 + 1 = 6.就McCabe复杂性而言,6并不是太高:当然,考虑到实现必须提供的功能,人们仍然认为它太高.

2)McCabe的复杂性与方法/过程的可测试性有关,但与特定路径的可测试性无关.路径是可行的(=存在强制执行通过此路径的变量的值),但McCabe的复杂性很快就意识不到这些并发症.如果你真的想研究路径的可行性,请记住一般来说问题是不可判定的,但是有许多实用的数据流分析算法可用.

3)如果我们改变代码实际输出可能与预期输出不同当然,你不能引入任意改变并希望结果会相同.然而,这可能是您的导师所期望的,有一种方法可以重构您的代码,使得产生的输出保持不变,并且McCabe的复杂性下降.例如,考虑一下你是否真的需要分开计算最大值和总和的任务.

  • McCabe的复杂性并未被定义为决策点数加一,至少不是McCabe.有一个定理证明他的定义相当于决策点加1,这更容易计算: - } (3认同)