Недавно наша компания начала еженедельно измерять циклическую сложность (CC) функций в нашем коде и сообщать, какие функции улучшились или ухудшились. Поэтому мы стали уделять гораздо больше внимания ЦК функций.
Я читал, что CC можно неофициально рассчитать как 1 + количество точек принятия решения в функции (например, оператор if, цикл, выбор и т. Д.) Или также число путей через функцию ...
Я понимаю, что самый простой способ уменьшить CC - это многократно использовать рефакторинг метода извлечения ...
Есть кое-что, в чем я не уверен, например, что такое 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? то есть, вложенные, если заявления сложнее понять с умственной точки зрения, но отражено ли это в CC?