2012-10-09 5 views
6

次のコードの複雑さを軽減する方法と、これが心配すべきものであるかどうかは疑問です。次のコードの "Cyclomatic Complexity"をどのように減らすか

循環的複雑度が決定され

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ソナーの条件を引き起こすのに十分高いが、狂ったレベルにはならないと思う。 –

+2

論理を列挙型にプッシュできます。 –

答えて

5

(これは、この質問で明確にするために再書かれている、変数の命名を心配しないでください)ValuePojo.getSomething() メソッドを参照してください。コード内の実行の分岐数で表します。 if - elseブロック、switchステートメント - すべてのコードのCyclomatic複雑さが増し、適切なコードカバレッジを確保するために必要なテストケースの数も増えます。

コードの複雑さを軽減するため、定義済みの動作を持たないcaseステートメントを削除し、switchステートメントでdefaultの動作に置き換えることをお勧めします。

この問題を解決する別のquestionがスタックオーバーフローにあります。

+0

答えをありがとう、私はそのスレッドを見て、適切に私の問題に対処する "解決策"を見つけることができませんでした。私も問題があるとは確信していませんでした。 –

+1

私は循環器系の複雑さはかなり主観的な手段だと思います。コードを読み込み可能で、仕事をしている限り、コードを変更することについて心配する必要はありません。複雑な循環的複雑さは、あなたのオブジェクトモデルの問題を指摘するかもしれませんが、これはあなたの例には関係しないと思います。 – Luhar

+0

あなたがこの答えに入れた努力をありがとう –

8

循環的複雑さを本当に低下させる必要がある場合は、マップの使用を検討できます。明らかに、実装では、一度だけ作成して初期化する必要があります。

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をリファクタリングすると(これはおそらくやります)、それは問題ではありません。 –

+15

これはプログラムの複雑さを実質的に軽減するものではなく、ロジックをスイッチケースからマップに移動することによってコードアナライザから隠すだけです。 – satellite779

関連する問題