循環的複雑度を使用したコードの複雑度の測定
循環的複雑度は、コードの判定構造の複雑度の測定です。この測定は、関数またはメソッドを理解またはテストする難易度を定量化するために使用されます。
循環的複雑度の値は線形独立のパスの数であるため、テストする必要があるパスの最小数となります。アルゴリズムは、任意の関数について、関数を介した可能なパスの数に基づいて、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 における各種演算の循環的複雑度値を示しています。
演算 | 循環的複雑度値 | 変更された循環的複雑度値 |
---|---|---|
ベース複雑度 | 1 | 1 |
while | 1 | 1 |
for /parfor | 1 | 1 |
if /elseif | 1 | 1 |
else | 0 | 0 |
try | 1 | 1 |
catch | 0 | 0 |
&& 演算子 | 1 | 1 |
|| 演算子 | 1 | 1 |
switch | 0 | 1 |
case | 1 | 0 |
otherwise | 0 | 0 |
& 演算子 | 1 (while 、if 、および elseif の条件でのみカウント) | 1 (while 、if 、および elseif の条件でのみカウント) |
| 演算子 | 1 (while 、if 、および elseif の条件でのみカウント) | 1 (while 、if 、および elseif の条件でのみカウント) |
return | 0 | 0 |
break | 0 | 0 |
continue | 0 | 0 |
参照
[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.