2012-10-22 3 views
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 Code Analysis флаги это как имеющие цикломатическую сложность 27. Я не понимаю, почему серия Добавить звонки с делегатами результатов в такой высокой степени сложности цикломатической.

Что я могу сделать, чтобы уменьшить цикломатическую сложность?

+0

См http://stackoverflow.com/questions/10244131/how-can-the-cyclomatic-complexity-be -27-in-a-method-with-13-event-handler-subscr – cm007

+1

Лямбда-выражения похожи на айсберг. Синтаксический сахар очень сладкий, но этот код создает 13 вложенных классов и 26 условных ветвей в коде конструктора. Единственный способ увидеть это - посмотреть на то, как работает инструмент анализа, запустить ildasm.exe на сборке. –

ответ

2

Мне нравится это определение для CC - the amount of decision logic in a source code function (см. Больше на «Code Metrics – Cyclomatic Complexity», есть также очень хороший пример того, как вычисляется СС).

Так как каждый Add() имеет два разных кодовых пути: Add() и Value функция, поэтому CC+=2. Поскольку вы положили Add() 13 раз - CC == не менее 26. И в отношении MSDN минимальный CC равен 2, и когда он увеличился, он начинает увеличиваться с 1, поэтому вы заканчиваете с 27 :) Наличие анонимного метода в значении словаря увеличивает сложность, поскольку потенциально это может вызвать исключение, поэтому должно быть покрыто тестом также.

Code Metrics Values, 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); 
}