C#のサイクロマティック複雑度、その真の意味と活用法

Cyclomatic Complexity in C#

C#のサイクロマティック複雑度、その真の意味と活用法

C#のサイクロマティック複雑度(CC)は、メソッドの独立実行パス数を表す指標で、1に分岐構文の数を加えて算出される。Thomas McCabeが1976年に提唱し、10以下が推奨、MicrosoftのCA1502アナライザーは25超を過剰と判定する。本記事では、具体的なC#コード例を用いて計算方法、実践的な閾値、NDependやVisual Studioによる測定・可視化手法を解説。さらに、テストカバレッジやIL解析と組み合わせて、単なる数値以上のリスク評価を行う方法を紹介する。

サイクロマティック複雑度が高いメソッドは、テストが難しく、安全に変更するのが難しい。
  1. bunderbunder

    サイクロマティック複雑度は全体として有用な指標だが、現代の言語で使う場合には1つ欠点がある。それはポリモーフィズムが本当に一般的になる前に発明されたものだということだ。

    つまり、明示的な分岐しかカウントしない。たとえばC#のようなOO言語では、仮想メソッドを呼び出しても、そのメソッド呼び出しが多くのコードパスを通る可能性があっても、サイクロマティック複雑度は増加しない。IEnumerableのような一般的なインターフェースを扱っている場合、潜在的に何千ものパスがありうる。ライブラリを開発しているなら、この種の状況での潜在的なコードパスの数は無限だ。

    余談だが、ifやswitch文すら持たないSmalltalkのような言語にどう適用できるか考えるのは面白い。

    OOだけが唯一の障害ではない。高階関数もまた、サイクロマティック複雑度が測定しない形の分岐を導入する。

    繰り返すが、だからといって無用な指標というわけではない。ただ、コードベースにおけるサイクロマティック複雑度の制限が保守性の万能薬だなどと思わないことだ。私が解読した中で最も理解しにくい関数のいくつかは、かなり低いサイクロマティック複雑度だった。

  2. throwyawayyyy

    面白い話:以前のひどい会社で、CCが注目すべきものとして発見されたのは、PMやマネージャーが(当時は)かなりひどかったAIツールを使ってコード変更をランディングするよう奨励されたのとほぼ同時期だった(1、2年前の話だ)。その結果、完全にレビュー不可能な差分の雪崩が起きた。

  3. runningmike

    セキュリティの観点から、CCは非常に関連性が高い。私はPythonコードのセキュリティ側面をしっかり評価するために使っている。私は[1]を使っているが、これは堅牢で実績がある。

    [1] https://nocomplexity.com/documents/codeaudit/complexitycheck...

この日のほかの記事

2026-09-18