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