4

私は次のクラスを持っています:

public static class MyClass
{
    private static readonly Dictionary<Type, Func<string, object>> valueTypes;

    static MyClass()
    {
        var dictionary = new Dictionary<Type, Func<string, object>>();
        dictionary.Add(typeof(bool), x => bool.Parse(x));
        dictionary.Add(typeof(byte), x => byte.Parse(x));
        dictionary.Add(typeof(char), x => char.Parse(x));
        dictionary.Add(typeof(decimal), x => decimal.Parse(x));
        dictionary.Add(typeof(double), x => double.Parse(x));
        dictionary.Add(typeof(float), x => float.Parse(x));
        dictionary.Add(typeof(int), x => int.Parse(x));
        dictionary.Add(typeof(long), x => long.Parse(x));
        dictionary.Add(typeof(sbyte), x => sbyte.Parse(x));
        dictionary.Add(typeof(short), x => short.Parse(x));
        dictionary.Add(typeof(uint), x => uint.Parse(x));
        dictionary.Add(typeof(ulong), x => ulong.Parse(x));
        dictionary.Add(typeof(ushort), x => ushort.Parse(x));
        MyClass.valueTypes = dictionary;
    }
}

ただし、Microsoft コード分析では、循環的複雑度が 27 であるとフラグが付けられています。デリゲートを使用した一連の Add 呼び出しによって循環的複雑度が非常に高くなる理由がわかりません。

循環的複雑度を減らすにはどうすればよいですか?

4

1 に答える 1

2

CC のこの定義が気に入っています(「コード メトリクス – 循環的複雑度the amount of decision logic in a source code function」の詳細を参照してください。CCの計算方法の非常に良い例もあります)。

したがって、それぞれAdd()に 2 つの異なるコード パス (Add()それ自体とValue関数) があるため、CC+=2. あなたはAdd()13回入れたので -CC ==少なくとも26。そして、MSDNの最小CCに関しては2、それが増加すると1から増加し始めるため、最終的には27になります:)辞書値に匿名メソッドがあると、例外が発生する可能性があるため、複雑さが増します。良い。

コード メトリクス値、MSDN :

循環的複雑度 – コードの構造的複雑度を測定します。これは、プログラムの流れにおける異なるコード パスの数を計算することによって作成されます。複雑な制御フローを持つプログラムは、適切なコード カバレッジを実現するために、より多くのテストが必要になり、保守性が低下します。


興味深いことに、これらの例の CC とは何かを確認してください。

private static readonly Dictionary<Type, Func<string, object>> valueTypes
static MyClass()     
{         
    var dictionary = new Dictionary<Type, Func<string, object>>();         
    dictionary.Add(typeof(bool), x => bool.Parse(x)); 
}


static MyClass()     
{         
    var dictionary = new Dictionary<Type, Func<string, object>>();         
    Func<string, object> func = (x) => bool.Parse(x)
    dictionary.Add(typeof(bool), func); 
}

static MyClass()     
{         
    var dictionary = new Dictionary<Type, Func<string, object>>();         
    dictionary.Add(typeof(bool), null); 
}
于 2012-10-22T14:51:40.463 に答える