Cyclomatic Complexity数字 - 我是否必须将每个语句分别计为节点?

时间:2016-01-31 15:15:28

标签: cyclomatic-complexity

我遇到了计算CCN的不同方法(根据公式CCN = E-N + 2P) 一种方法是分别计算代码中的所有行,另一种方法是将几行代码计为一步;让我们举例如下:

1 public class SumAndAverage {   
2
3   public static void main (String[] args) {
4       int sum = 0;            
5       double average = 0.0;   
6       String message = "";
7          
8       int num = Integer.parseInt(args[0]); 
9       
10      if ((num < 1) || (num > 100)) {  
11          message = "Invalid number entered.";  
12      } else {
13          for (int i = 1; i <= num; i++) {  
14              sum += i;  
15          }
16          average = (double) sum / num;  
17          message = "The sum is " + sum + " and the average is " + average;
18      }
19      System.out.println(message);  
20   }
21}

计算每个陈述我们得到12 - 11 + 2x 1 = 3

我想知道我是否加入&#34;第4,5,6,8行并将它们计为一步并对第16和17行进行相同的操作,这也是正确的吗?结果将是相同的,否则边缘也将减少:8 - 7 + 2 * 1 = 3

1 个答案:

答案 0 :(得分:1)

计算复杂性的正确方法是考虑代码块。代码块是无法解析执行路径的地方。 McCabe的paper提到了以下内容:

  

工具FLOW是用APL编写的,用于从磁盘上的Fortran文件输入源代码。然后,FLOW会将Fortran作业分解为不同的子例程,并分析每个子例程的控制结构。它通过将Fortran子例程分解为由影响控制流的语句分隔的块来完成此操作:IF,GOTO,引用LABELS,DO等。

有关复杂性的其他信息,请阅读Cyclomatic complexity as a Quality measure