Ищите разъяснения по структурированию кода для уменьшения цикломатической сложности
Недавно наша компания начала еженедельно измерять циклическую сложность (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? то есть, вложенные, если заявления сложнее понять, но отражено ли это в УК?