0

ソナーは、次のコードに対して重大な違反エラー (「Cyclomatic Complexity」) を返します。次のメソッドは、特別な形式で日付を取得するために使用されます (例: 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

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

質問は「どうすれば循環的複雑度を減らすことができるか?」ではなく、むしろ「この関数を記述する最善の方法は?」です。1 つの答えはreturn String.format("%02d-%02d-W%2d", year-2000, month+1, weekId);です。

于 2014-02-11T12:11:54.893 に答える