【さいくろまてぃっくふくざつど】
サイクロマティック複雑度 とは?
最終更新:
💡 処理の分岐の複雑さを、経路で測る
プログラムの制御の流れにある、独立した経路の数を表す指標。単純な二択の例、計算条件、テストや読みやすさとの関係を解説します。
📌 このページのポイント
- 制御の流れにある、線形独立な経路の数を表す
- 単純な二択の判定だけなら、判定数に1を足せる
- 計測ツールやswitchの数え方等で、値が変わる場合がある
- テストの総数や、コードの品質を単独で決める値ではない
難しい名前だけど、何を数えるの?
プログラムの制御の流れにある、線形独立な経路の数を測るよ。まずは、分岐が増えると確認すべき流れも増える、という理解から始めよう。ソースの行数とは別の指標なんだ。
図のように、二択が一つなら?
ifを数えれば、いつも正確?
いつもとは限らないよ。複数方向の分岐や、言語の短絡評価等も関わる。ツールは構文をどう数えるかに規則を持つ。ESLintでもswitchを扱うvariantで値が変わることがあるんだ。
複雑度2なら、テストは二つで十分?
独立した経路を確認する目安にはなるけれど、テストの総数とは同じではないよ。同じ経路でも、入力の境界や仕様の違いを確かめるテストが必要なことがある。値だけで十分さを決めないんだ。
数字が小さければ、よいコード?
読みやすさや仕様の正しさを、それだけでは判断できないよ。大きな値はレビューのきっかけにし、責務や条件の重複を確認する。しきい値は同じ計測規則のもとで決め、数字だけのために分割しないようにしよう。
もっと詳しく知りたい人へ
早期リターンで、必ず複雑度が下がる?
見た目のネストを浅くしても、分岐そのものが残れば値が下がるとは限りません。読みやすさの改善と、この指標の減少は別です。計測結果と処理の意味を確認します。
独立した経路と、すべての実行経路は同じ?
異なります。独立した経路は、制御フローの基本となる経路の組です。ループ等では実行経路の組み合わせが非常に多くなるため、複雑度を「全経路の総数」とは考えません。
まとめ:ざっくりこれだけ覚えればOK!
「サイクロマティック複雑度」って出てきたら「処理の分岐の複雑さを、独立した経路の数で測る指標」と思えばだいたいOK!
📖 おまけ:英語の意味
「Cyclomatic Complexity」 = 制御の流れの独立経路を数える複雑度
💬 制御フローをグラフとして扱う指標です。単一のモジュールの標準的なモデルでは、辺の数Eと節点の数NからE − N + 2で計算します。