最近、私たちの会社は、コード内の関数の循環的複雑度 (CC) を毎週測定し、どの関数が改善または悪化したかを報告し始めました。そのため、関数の CC にもっと注意を払うようになりました。
CC は、1 + 関数内の決定点の数 (if ステートメント、for ループ、select など)、または関数を通るパスの数として非公式に計算できることを読みました...
CC を減らす最も簡単な方法は、Extract Method リファクタリングを繰り返し使用することだと理解しています...
不明な点があります。たとえば、次のコード フラグメントの CC は何ですか?
1)
for (int i = 0; i < 3; i++)
Console.WriteLine("Hello");
と
Console.WriteLine("Hello");
Console.WriteLine("Hello");
Console.WriteLine("Hello");
どちらも同じことを行いますが、for ステートメントのために最初のバージョンの方が CC が高くなりますか?
2)
if (condition1)
if (condition2)
if (condition 3)
Console.WriteLine("wibble");
と
if (condition1 && condition2 && condition3)
Console.WriteLine("wibble");
言語が C# などの短絡評価を行うと仮定すると、これら 2 つのコード フラグメントは同じ効果を持ちますが、3 つの決定点/if ステートメントがあるため、最初のフラグメントの CC は高くなりますか?
3)
if (condition1)
{
Console.WriteLine("one");
if (condition2)
Console.WriteLine("one and two");
}
と
if (condition3)
Console.WriteLine("fizz");
if (condition4)
Console.WriteLine("buzz");
これら 2 つのコード フラグメントは異なることを行いますが、CC は同じですか? または、最初のフラグメントのネストされた if ステートメントの CC が高いですか? つまり、ネストされた if ステートメントは理解するのが精神的により複雑ですが、それは CC に反映されていますか?