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;
}
答案 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);
。