0

Sonar给出了以下代码的主要违规错误(“循环复杂性”)。以下方法用于获取特殊格式的日期,例如14-02-3(Year-month-weekid)。

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

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;
}
4

3 回答 3

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 projectMonth = String.format("%02d", month + 1);
于 2014-02-11T07:20:24.550 回答
1

一种简单的思考方式是,圈复杂度会增加代码中的“分支”越多。因此,使用您的 switch 语句,您有很多分支(如果我数对了,实际上是 13 个)。switch 语句可以替换为:

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

请注意,这仍然有分支,即 if/else 和 ternary ?。但是这些也可能被删除,另一个答案中给出了一个很好的数组替代方案。

于 2014-02-11T07:20:03.647 回答
0

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

于 2014-02-11T12:11:54.893 回答