Buscando esclarecimentos sobre a estruturação de código para reduzir a complexidade ciclomática
Recentemente, nossa empresa começou a medir a complexidade ciclomática (CC) das funções em nosso código semanalmente e a relatar quais funções melhoraram ou pioraram. Então, começamos a prestar muito mais atenção ao CC das funções.
Eu li que CC poderia ser informalmente calculado como 1 + o número de pontos de decisão em uma função (por exemplo, se declaração, loop, selecione etc), ou também o número de caminhos através de uma função ...
Eu entendo que a maneira mais fácil de reduzir CC é usar a refatoração do Método Extrair repetidamente ...
Há algo sobre o qual não tenho certeza, por exemplo o que é o CC dos seguintes fragmentos de código?
1)
for (int i = 0; i < 3; i++)
Console.WriteLine("Hello");
E
Console.WriteLine("Hello");
Console.WriteLine("Hello");
Console.WriteLine("Hello");
Ambos fazem a mesma coisa, mas a primeira versão tem um CC mais alto por causa da instrução for?
2)
if (condition1)
if (condition2)
if (condition 3)
Console.WriteLine("wibble");
E
if (condition1 && condition2 && condition3)
Console.WriteLine("wibble");
Assumindo que a linguagem faz uma avaliação de curto-circuito, como C #, esses dois fragmentos de código têm o mesmo efeito ... mas o CC do primeiro fragmento é mais alto porque possui 3 pontos de decisão / instruções if?
3)
if (condition1)
{
Console.WriteLine("one");
if (condition2)
Console.WriteLine("one and two");
}
E
if (condition3)
Console.WriteLine("fizz");
if (condition4)
Console.WriteLine("buzz");
Esses dois fragmentos de código fazem coisas diferentes, mas eles têm o mesmo CC? Ou a instrução if aninhada no primeiro fragmento tem um CC mais alto? isto é, as instruções if aninhadas são mentalmente mais complexas para entender, mas isso é refletido no CC?