【さいくろまてぃっくふくざつど】

サイクロマティック複雑度 とは?

最終更新:
💡 処理の分岐の複雑さを、経路で測る

プログラムの制御の流れにある、独立した経路の数を表す指標。単純な二択の例、計算条件、テストや読みやすさとの関係を解説します。

📌 このページのポイント
サイクロマティック複雑度:二択の例開始条件を判定真偽処理A処理B終了5本の辺 − 5個の節点 + 2 = 2
ほかの分岐・ループがない例です。曲がった線も一本の辺で、独立経路は二つですが、必要なテストの総数や全経路の総数とは異なります。
ひよこ ひよこ
難しい名前だけど、何を数えるの?
ペンギン先生 ペンギン先生
プログラムの制御の流れにある、線形独立な経路の数を測るよ。まずは、分岐が増えると確認すべき流れも増える、という理解から始めよう。ソースの行数とは別の指標なんだ。
ひよこ ひよこ
図のように、二択が一つなら?
ペンギン先生 ペンギン先生
ほかに分岐やループがないこの例は、複雑度2だよ。条件が成立する経路と、成立しない経路がある。単純な二択の判定だけで構成したモデルでは、判定数に1を足して計算できるんだ。
ひよこ ひよこ
ifを数えれば、いつも正確?
ペンギン先生 ペンギン先生
いつもとは限らないよ。複数方向の分岐や、言語の短絡評価等も関わる。ツールは構文をどう数えるかに規則を持つ。ESLintでもswitchを扱うvariantで値が変わることがあるんだ。
ひよこ ひよこ
複雑度2なら、テストは二つで十分?
ペンギン先生 ペンギン先生
独立した経路を確認する目安にはなるけれど、テストの総数とは同じではないよ。同じ経路でも、入力の境界や仕様の違いを確かめるテストが必要なことがある。値だけで十分さを決めないんだ。
ひよこ ひよこ
数字が小さければ、よいコード?
ペンギン先生 ペンギン先生
読みやすさや仕様の正しさを、それだけでは判断できないよ。大きな値はレビューのきっかけにし、責務や条件の重複を確認する。しきい値は同じ計測規則のもとで決め、数字だけのために分割しないようにしよう。
もっと詳しく知りたい人へ

早期リターンで、必ず複雑度が下がる?

見た目のネストを浅くしても、分岐そのものが残れば値が下がるとは限りません。読みやすさの改善と、この指標の減少は別です。計測結果と処理の意味を確認します。

独立した経路と、すべての実行経路は同じ?

異なります。独立した経路は、制御フローの基本となる経路の組です。ループ等では実行経路の組み合わせが非常に多くなるため、複雑度を「全経路の総数」とは考えません。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「サイクロマティック複雑度」って出てきたら「処理の分岐の複雑さを、独立した経路の数で測る指標」と思えばだいたいOK!
📖 おまけ:英語の意味
「Cyclomatic Complexity」 = 制御の流れの独立経路を数える複雑度
💬 制御フローをグラフとして扱う指標です。単一のモジュールの標準的なモデルでは、辺の数Eと節点の数NからE − N + 2で計算します。

参考資料

← 用語集にもどる