循環的複雑度計算機 - McCabe 指標ツール

McCabe のグラフ公式 M = E − N + 2P または決定数の簡易式 M = D + 1 で循環的複雑度を計算し、ソフトウェア品質を評価します。

計算方法を選び、グラフ指標または決定数を入力すると、McCabe 複雑度スコアとリスク分類が表示されます。

循環的複雑度計算機 - McCabe 指標ツール
McCabe のグラフ公式 M = E − N + 2P または決定数の簡易式 M = D + 1 で循環的複雑度を計算し、ソフトウェア品質を評価します。

制御フローグラフがある場合はこちらを使います。有向辺の数(E)、ノード数(N)、連結成分数(P、単一関数では通常 1)を数えます。

循環的複雑度計算機について

循環的複雑度は、Thomas J. McCabe が 1976 年に提唱したソフトウェア品質メトリクスです。ソースコード内の線形独立な経路の数を数えることで、プログラムの構造的複雑さを定量化します。複雑度が高いほど、すべての分岐を網羅するために必要なテストケースが増え、コードの理解・修正・保守が難しくなります。 この指標はグラフ理論に基づいています。プログラムは制御フローグラフ(CFG)としてモデル化され、各ノードは基本ブロック——単一の入口と単一の出口を持つ直線的な命令列——を表し、各有向辺はあるブロックから別のブロックへの制御移動を表します。条件分岐、ループ、例外ハンドラは分岐を生み、辺の数と独立経路の数を増やします。 McCabe の式は M = E − N + 2P で、E は CFG の辺の数、N はノード数、P は連結成分数(単一関数や手続きでは通常 1)です。分岐のない完全な直線プログラムでは M は 1 です。二分岐の決定点が 1 つ増えるごとに、複雑度はちょうど 1 増えます。k 個の case を持つ switch 文は、k 個の新しい経路を導入するため、複雑度を k 増やします。 実務上は、より簡単な数え方でも構造化コードでは同じ結果になります。M = D + 1 で、D は決定点の合計数です。決定点とは、実行を 2 つ以上の経路に分ける構文のことです。if / else-if、switch の case、for / while / do-while のループヘッダ、三項演算子、短絡評価で分岐を生む論理 AND / OR、そして catch ブロックが含まれます。 業界では、1–4 を低リスク、5–7 を中リスク、8–10 を高リスク(リファクタリングを検討)、10 を超えるものを非常に高いリスク(分割を強く推奨)とみなすのが一般的です。複雑度は、完全な分岐カバレッジに必要な最小テストケース数も示します。たとえば循環的複雑度が 8 の関数には、すべての独立経路を通すために少なくとも 8 個のテストケースが必要です。 循環的複雑度が何を測り、何を測らないかを理解することが重要です。行数、性能、アルゴリズムの正しさを直接測るものではありません。非常に長いが完全に直線的な関数の複雑度は 1 ですが、深くネストした条件分岐を持つ短い関数は 20 になることがあります。この指標は、テスト工数の主因であり潜在的な欠陥の最も一般的な原因でもある、意思決定経路の構造を捉えます。コードレビューや他の品質指標と併用すれば、循環的複雑度は、リファクタリングとテストで優先対応すべき関数を特定する実用的な指標になります。

循環的複雑度の例

現実的なコード構造に対して、両方の計算方法を示す 3 つの例です。

入力M説明
E = 9, N = 8, P = 1M = 3グラフ方式:9 − 8 + 2×1 = 3。2 つの if 文と 1 つのループを持つシンプルな関数。
D = 4 decisionsM = 5決定方式:4 + 1 = 5。2 つの if-else チェーンを持つ関数。中リスクで、5 個のテストケースで管理可能です。
E = 14, N = 10, P = 1M = 6グラフ方式:14 − 10 + 2 = 6。5 個の case を持つ switch。中程度の複雑さで、各分岐を文書化する価値があります。

循環的複雑度計算機の使い方

  1. 計算方法を選びます。コードの制御フローグラフを描画している、または確認できるならグラフベースを使います。決定キーワードを数えて素早く見積もるなら決定ベースを使います。
  2. グラフベースでは、辺の数(E)、ノード数(N)、連結成分数(P)を入力します。単一関数なら P は 1 です。複数の非連結部分をまとめて分析する場合のみ、実際の数を入力してください。
  3. 決定ベースでは、if、else-if、case、for、while、do-while、三項演算子(?:)、catch、そして新しい分岐を生む短絡論理演算子(&&、||)をすべて数え、その合計を D として入力します。
  4. Calculate をクリックします。結果には McCabe 複雑度 M と、低(1–4)、中(5–7)、高(8–10)、非常に高い(>10)のリスク分類が表示されます。
  5. 複雑度値は完全な分岐カバレッジに必要な最小テストケース数として扱い、M > 10 の関数はリファクタリングを検討してください。

循環的複雑度 FAQ

循環的複雑度は何を測りますか?
関数の制御フローグラフにおける線形独立な経路の数、つまりどれだけ異なる実行経路があるかを測ります。決定点(if、ループ、case)が 1 つ増えるごとに経路も 1 つ増えます。この値は、完全な分岐カバレッジを達成するために必要な最小テストケース数に等しくなります。
良い循環的複雑度の値は?
McCabe の元の推奨では、関数の M は 10 以下であるべきです。1–4 は低リスクでテストしやすく、5–7 は中程度、8–10 は高リスク、10 を超えるものは非常に高リスクで、より小さく焦点を絞った関数へ分割することが強く推奨されます。
グラフ方式と決定数方式は同じですか?
GOTO 文のない構造化プログラムでは、同じ結果になります。決定数の簡易式 M = D + 1 は、分岐キーワードを数えて 1 を足します。グラフ方式 M = E − N + 2P は、グラフの辺とノードを数えます。どちらも同じ構造情報を捉えています。
switch 文の各 case は個別に数えるべきですか?
はい。各 case ラベルは独立した分岐なので、5 個の case を持つ switch は決定数に 5 を加えます(または CFG に 5 本の辺を追加します)。静的解析ツールによっては、個々の case ではなく case グループ数だけを数えるものもあります。測定を一貫させるため、必ずツールのドキュメントを確認してください。
循環的複雑度はテストとどう関係しますか?
複雑度 M は、すべての分岐を少なくとも 1 回通るために必要な独立テストケースの最小数に等しくなります。M = 8 の関数には、完全な分岐カバレッジのために少なくとも 8 個の丁寧に設計されたテストケースが必要です。複雑度が高いほど、テスト工数が増え、欠陥の可能性が高まり、保守負担も大きくなります。個々の関数を M = 10 未満に保つ強い理由です。
循環的複雑度はすべてのプログラミング言語に適用できますか?
はい。条件分岐と反復制御構造を持つあらゆる言語に適用できます。決定点の表現は言語ごとに少し異なります。Python は elif、Ruby は case/when、SQL は CASE/WHEN を使いますが、数え方の原則は同じです。Java、Python、JavaScript、C#、そしてほとんどの主要言語向けの自動化ツールは、McCabe 複雑度を標準の品質指標として実装しています。