2014-02-11 241 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);