Почему cylomati c сложность кода с `switch` выше, чем с 'if-else' - PullRequest
4 голосов
/ 18 марта 2020

У меня есть две функции выборки TestComplexityIf и TestComplexitySwitch. VisualStudio-2017 «Рассчитать метрики кода» сообщает о цикломатике c сложности 10 для функции с оператором switch ad 7 для функции с if-else. Интересно, как вычисляется сложность для TestComplexitySwitch ().

private static void TestComplexityIf(String arg)
{
    if (arg == "a")
    { }
    else if (arg == "b")
    { }
    else if (arg == "c")
    { }
    else if (arg == "d")
    { }
    else if (arg == "d")
    { }
    else if (arg == "f")
    { }
    else if (arg == "g")
    { }
}

private static void TestComplexitySwitch(String arg)
{
    switch (arg)
    {
        case "a":
            break;
        case "b":
            break;
        case "c":
            break;
        case "d":
            break;
        case "e":
            break;
        case "f":
            break;
        case "g":
            break;
    }
}

Кроме того, если я прокомментирую последний случай, сложность внезапно изменится на 6.

private static void TestComplexitySwitch(String arg)
{
    switch (arg)
    {
        case "a":
            break;
        case "b":
            break;
        case "c":
            break;
        case "d":
            break;
        case "e":
            break;
        case "f":
            break;
        //case "g":
            //break;
    }
}

1 Ответ

2 голосов
/ 19 марта 2020

Средство Visual Studio Cyclomati c Complexity (CC) вычисляет значения из кода IL и, следовательно, зависит от деталей компилятора.

Здесь вы наткнулись на детали компилятора производительности: когда Переключатель над строкой имеет более 6 случаев , компилятор создает таблицу ha sh для быстрого поиска строки. Эта таблица ha sh не отображается в коде C#, а только в коде IL. Код IL становится более сложным для обработки этой таблицы ha sh, и вы получаете неожиданное значение CC. Эта ситуация хорошо иллюстрируется этой ссылкой от Майкла Рэндалла .

В качестве альтернативы вы можете использовать инструмент NDepend для вычисления CC из C# исходного кода , визуализировать CC значений в цветной карте дерева и запустить некоторые правила, запрещающие слишком сложные методы .

Colored Treemap Cyclomatic Complexity

(Отказ от ответственности, я работаю для NDepend)

...