Main Content

循環的複雑度を使用したコードの複雑度の測定

循環的複雑度は、コードの判定構造の複雑度の測定です。この測定は、関数またはメソッドを理解またはテストする難易度を定量化するために使用されます。

循環的複雑度の値は線形独立のパスの数であるため、テストする必要があるパスの最小数となります。アルゴリズムは、任意の関数について、関数を介した可能なパスの数に基づいて、1 から無限大までの整数を計算します。複雑度が 10 を超えているファイルは簡略化の候補となり、複雑度が 50 を超えているファイルはテスト不可とみなされます。

所定の任意のコード部分の循環的複雑度の値は 1 から開始します。判定点を作成する各ステートメント (if&&for など) によって値が 1 増加します。以下に例を示します。

function cyclomaticTest(a)

    switch a
        case 1
            disp("one")
        case 2
            disp("two")
        case 3
            disp("many")
        otherwise
            disp("lots")
    end
end

"-cyc" オプションを指定した checkcode を使用して関数の循環的複雑度を測定できます。

checkcode("cyclomaticTest.m","-cyc")
The McCabe cyclomatic complexity of 'cyclomaticTest' is 4.

次の関数の循環的複雑度値は 4 です。ベース値は 1 であり、case ステートメントごとに 1 が加算されます。switch および otherwise ステートメントでは値は増加しません。MATLAB 言語でコード アナライザーによってレポートされる循環的複雑度は、McCabe の循環的複雑度 [1] と等価です。

変更された循環的複雑度は循環的複雑度の 1 つのバリエーションであり、含まれている case ステートメントの数に関係なく 1 つの switch ステートメントによって値が 1 増加します。その背景には、switch ステートメントは一般的に一連の if/elseif ステートメントよりも理解しやすいという根拠があります。"-modcyc" オプションを指定した checkcode を使用して、変更された循環的複雑度を測定できます。

checkcode("cyclomaticTest.m","-modcyc")
The modified cyclomatic complexity of 'cyclomaticTest' is 2.

次の表は、MATLAB における各種演算の循環的複雑度値を示しています。

演算循環的複雑度値変更された循環的複雑度値
ベース複雑度11
while11
for/parfor11
if/elseif11
else00
try11
catch00
&& 演算子11
|| 演算子11
switch01
case10
otherwise00
& 演算子1 (whileif、および elseif の条件でのみカウント)1 (whileif、および elseif の条件でのみカウント)
| 演算子1 (whileif、および elseif の条件でのみカウント)1 (whileif、および elseif の条件でのみカウント)
return00
break00
continue00

参照

[1] Arthur H. Watson and Thomas J. McCabe, "Structured Testing: A Testing Methodology Using the Cyclomatic Complexity Metric." (National Institute of Standards and Technology, Gaithersburg, MD), NIST Special Publication (SP) 500-235 (September 1996). https://www.mccabe.com/pdf/mccabe-nist235r.pdf.

参考

|