我有以下课程:
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 Code Analysis将其标记为具有27的圈复杂度。我不明白为什么一系列带有委托的Add调用会导致如此高的圈复杂度。
我可以做些什么来降低圈复杂度?
答案 0 :(得分:2)
我喜欢CC的这个定义 - the amount of decision logic in a source code function
(有关“Code Metrics – Cyclomatic Complexity”的更多信息,CC计算的方法也非常好)。
因为每个Add()
都有两个不同的代码路径 - Add()
本身和Value
函数,所以CC+=2
。由于您将Add()
13次 - CC ==
至少26
。关于MSDN最小CC是2
,当它增加时它从1开始增加,所以你最终得到27 :)在字典值中使用匿名方法会增加复杂性,因为它可能会引发异常,所以应该是也被测试所覆盖。
Cyclomatic Complexity - 测量结构的复杂性 码。它是通过计算不同代码路径的数量来创建的 在程序的流程中。具有复杂控制流程的程序 将需要更多的测试来实现良好的代码覆盖率并且会更少 可维护性。
只是有兴趣检查这些例子的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);
}