2014-02-11 186 views
0

Sonar给出以下代码的主要违规错误(“循环复杂度”)。以下方法用于以特殊格式获得日期,例如, 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

要求是将日期以特殊格式存入前端(如果是2014年1月25日 - >(年 - 月 - 周) - > 14-01-4。整数参数**月**是0的基数 - (1月-0,2月1日...) –

回答

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); 
+0

Thanx答复,快速 –

+1

'String.format()'是错误的 - 月份是零 - 基于,而不是一个基于。 –

+0

@RossPatterson修复它。谢谢你的观察。 –

1

考虑一个简单的方法是,复杂复杂性会增加代码中的“分支”。所以用你的switch语句,你有很多分支(事实上,如果我正确计算的话,有13个分支)。 switch语句可以用这个来代替:

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

注意,这还是有分支,即如果/ else和三元?。但是,这些可能也会被删除,另一个答案中给出了一个数组的好替代方案。

+0

感谢您的答案 –

0

的问题不应该是“我怎样才能减少圈复杂度?”,而是“什么是写这个功能的最佳方式?”。一个答案是return String.format("%02d-%02d-W%2d", year-2000, month+1, weekId);