2012-10-09 124 views
6

我想知道如何減少下面的代碼的循環複雜度,如果這甚至是我應該擔心的事情。如何降低下面代碼的「環複雜度」

請參閱法ValuePojo.getSomething() (請不要擔心變量命名,這已經爲清楚起見,在這個問題上重新編寫)

public class ValuePojo 
{ 
    private ValueTypeEnum type; 

    private BigDecimal value1; 

    private BigDecimal value2; 

    private BigDecimal value3; 

    public ValuePojo() 
    { 
     super(); 
    } 

    /** 
    * This method reports as "HIGH Cyclomatic Complexity" 
    * 
    * @return 
    */ 
    public BigDecimal getSomething() 
    { 
     if (this.type == null) 
     { 
      return null; 
     } 

     switch (this.type) 
     { 
      case TYPE_A: 
      case TYPE_B: 
      case TYPE_C: 
      case TYPE_D: 
       return this.value1; 

      case TYPE_E: 
      case TYPE_F: 
      case TYPE_G: 
      case TYPE_H: 
       return this.value2; 

      case TYPE_I: 
      case TYPE_J: 
       return this.value3; 
     } 

     return null; 
    } 
} 
+0

什麼是報道的圈複雜度? – Vikdor

+0

11我認爲,只要足以觸發Sonar的條件,但不會達到瘋狂的水平。 –

+2

您可以將邏輯推入枚舉中。 –

回答

5

圈複雜度確定由代碼中執行的分支數量決定。 if - else blocks,switch語句 - 所有這些都會增加代碼的循環複雜性,並且還會增加確保代碼覆蓋範圍所需的測試用例數量。

爲了降低代碼的複雜性,我建議您刪除沒有定義行爲的case語句,並在switch語句中將其替換爲default行爲。

這是Stack Overflows上的另一個question解決此問題。

+0

感謝您的回答,我確實看過那個帖子,找不到能夠充分解決我的問題的「解決方案」。我也不確定是否有問題。 –

+1

我認爲圈複雜性是一個相當主觀的測量。只要它是可讀的並且執行這項工作,您就不必擔心更改代碼。一個很高的圈複雜度可能會指向您的對象模型中的問題,但我不認爲這與您的示例有關。 – Luhar

+0

好的。謝謝你在這個答案中的努力 –

8

如果您確實需要降低圈複雜度,可以考慮使用Map。顯然,在你的實現中,它只應該被創建和初始化一次。

public BigDecimal getSomething() { 
     if (this.type == null) { 
      return null; 
     } 
     Map<Type,BigDecimal> map = new HashMap<Type,BigDecimal>(); 
     map.put(TYPE_A, value1); 
     map.put(TYPE_B, value1); 
     map.put(TYPE_C, value1); 
     map.put(TYPE_D, value1); 
     map.put(TYPE_E, value2); 
     map.put(TYPE_F, value2); 
     map.put(TYPE_G, value2); 
     map.put(TYPE_H, value2); 
     map.put(TYPE_I, value3); 
     map.put(TYPE_J, value3); 

     return map.get(type); 
    } 
+0

好奇的解決方案,感謝您的想法。不幸的是,在我的情況下,值可能會改變,所以地圖必須一直重做。 –

+0

如果您重構value1 ... 3以使用getter和setter(您應該可能會這樣做),那不是問題。 –

+15

這並不能真正降低程序的複雜性,只需將代碼分析器將邏輯從開關狀態移至地圖即可隱藏起來。 – satellite779