Как статический словарь имеет цикломатическую сложность?
У меня есть следующий класс:
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 с делегатами приводит к такой высокой цикломатической сложности.
Что я могу сделать, чтобы уменьшить цикломатическую сложность?
1 ответ
Мне нравится это определение для CC - the amount of decision logic in a source code function
(Подробнее о метриках кода - цикломатическая сложность см. Также очень хороший пример того, как рассчитывается 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);
}