降低代码的Cyclomatic复杂性

时间:2014-02-11 07:13:40

标签: java cyclomatic-complexity

Sonar给出了以下代码的主要违规错误(“Cyclomatic Complexity”)。以下方法用于以特殊格式获取日期,例如14-02-3(年 - 月 - 周)。

我如何克服这种违规行为?

private String finalDateForProject; 
public String getFinalDateForProject() {
    return finalDateForProject;
}

public void setFinalDateForProject(Integer year,Integer month, Integer weekId) {

     String projectMonth;
        switch (month) {
            case 0:  projectMonth = "01";
                     break;
            case 1:  projectMonth = "02";
                     break;
            case 2:  projectMonth = "03";
                     break;
            case 3:  projectMonth = "04";
                     break;
            case 4:  projectMonth = "05";
                     break;
            case 5:  projectMonth = "06";
                     break;
            case 6:  projectMonth = "07";
                     break;
            case 7:  projectMonth = "08";
                     break;
            case 8:  projectMonth = "09";
                     break;
            case 9: projectMonth = "10";
                     break;
            case 10: projectMonth = "11";
                     break;
            case 11: projectMonth = "12";
                     break;
            default: projectMonth = " ";
                     break;
        }

        String yearEdited = year.toString();
        yearEdited = yearEdited.replace("20", ""); 


    String projectTrendDate = yearEdited +"-"+projectMonth+"-W"+weekId.toString();

            this.finalDateForProject =projectTrendDate;
}

3 个答案:

答案 0 :(得分:2)

我看到的一种减少圈复杂度的方法是替换switch语句。只需创建一个数组或HashMap,将月份索引映射到数字;

public void setFinalDateForProject(Integer year,Integer month, Integer weekId) {
    String[] months = new String[] {"01", "02", "03", "04", "05", ...}  
    // Replace switch statement
    String projectMonth = months[month];
    // Rest of your code
    ...
}

解决此问题的另一种方法是使用String.format将数字映射替换为将整数转换为String的字符串。使用类似的东西:

String projectMonth = String.format("%02d", month + 1);

答案 1 :(得分:1)

考虑它的一个简单方法是,圈复杂度会增加代码中的“分支”。所以使用你的switch语句你有很多分支(实际上是13,如果我正在计算的话)。 switch语句可以替换为:

if (month < 0 || month > 11) {
    projectMonth = " ";
} else {
    month++;
    projectMonth = ((month < 10) ? "0" : "") + Integer.toString(month);
}

请注意,这仍然有分支,即if / else和三元?。但是这些也可能被删除,在另一个答案中给出了一个带阵列的好选择。

答案 2 :(得分:0)

问题不应该是“如何降低圈复杂度?”,而是“编写此函数的最佳方法是什么?”。一个答案是return String.format("%02d-%02d-W%2d", year-2000, month+1, weekId);