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?

questionAnswers(8)

yourAnswerToTheQuestion