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;
    }
}
4

2 に答える 2

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);
  }
于 2012-10-09T05:01:19.453 に答える
6

循環的複雑度は、コード内の実行の分岐数によって決まります。if - elseブロック、switchステートメント - すべてコードのサイクロマティックな複雑さを増し、適切なコード カバレッジを確保するために必要なテスト ケースの数も増やします。

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

この問題に対処するスタック オーバーフローに関する別の質問を次に示します。

于 2012-10-09T04:32:07.830 に答える