Ищите разъяснения по структурированию кода для уменьшения цикломатической сложности

Недавно наша компания начала еженедельно измерять циклическую сложность (CC) функций в нашем коде и сообщать, какие функции улучшились или ухудшились. Поэтому мы начали уделять гораздо больше внимания ЦК функций.

Я читал, что CC можно неофициально рассчитать как 1 + количество точек принятия решения в функции (например, оператор if, цикл, выбор и т. Д.), А также количество путей через функцию ...

Я понимаю, что самый простой способ уменьшить CC - это неоднократно использовать метод рефакторинга Extract Method ...

Есть кое-что, в чем я не уверен, например, что такое CC следующих фрагментов кода?

1)

for (int i = 0; i < 3; i++)
    Console.WriteLine("Hello");

А также

Console.WriteLine("Hello");
Console.WriteLine("Hello");
Console.WriteLine("Hello");

Они оба делают одно и то же, но имеет ли первая версия более высокий CC из-за оператора for?

2)

if (condition1)
    if (condition2)
        if (condition 3)
            Console.WriteLine("wibble");

А также

if (condition1 && condition2 && condition3)
    Console.WriteLine("wibble");

Если предположить, что язык выполняет оценку короткого замыкания, например C #, то эти два фрагмента кода имеют одинаковый эффект ... но выше ли CC первого фрагмента, потому что он имеет 3 точки решения / утверждения if?

3)

if (condition1)
{
    Console.WriteLine("one");

    if (condition2)
        Console.WriteLine("one and two");
}

А также

if (condition3)
    Console.WriteLine("fizz");

if (condition4)
    Console.WriteLine("buzz");

Эти два фрагмента кода делают разные вещи, но имеют ли они одинаковый CC? Или вложенный оператор if в первом фрагменте имеет более высокий CC? то есть, вложенные, если заявления сложнее понять, но отражено ли это в УК?

Ответы на вопрос(8)

Ваш ответ на вопрос