2012-10-09 122 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