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

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

💡 コードの複雑さを数字で測る、品質管理の物差し
📌 このページのポイント
サイクロマティック複雑度:分岐の数で複雑さを測る シンプルなコード S 処理A 処理B E 複雑度 = 1 やや複雑なコード S if Yes No E 複雑度 = 2 複雑なコード S if1 if2 if3 E 複雑度 = 4 1〜10: 良好 11〜20: 注意 21以上: 要リファクタリング
サイクロマティック複雑度のイメージ:分岐が増えるほど複雑度が上がる
ひよこ ひよこ

サイクロマティック複雑度って名前が難しそう…何を測るものなの?

ペンギン先生 ペンギン先生

名前は難しそうだけど、やっていることはシンプルだよ。コードの中にあるif文やfor文、switch文などの分岐の数を数えて、そのコードがどれくらい複雑かを数値にするんだ。分岐が多いほど数字が大きくなるよ

ひよこ ひよこ

具体的にはどうやって計算するの?

ペンギン先生 ペンギン先生

一番シンプルな計算方法は、分岐の数+1だよ。if文が3つあれば複雑度は4。何も分岐がない関数は1になる。正確にはグラフ理論で辺の数-節の数+2という公式だけど、実務ではツールが自動計算してくれるから公式を覚える必要はないよ

ひよこ ひよこ

数字がいくつだと問題なの?

ペンギン先生 ペンギン先生

一般的な目安として、1から10は良好、11から20は注意、21以上は要リファクタリングと言われているよ。複雑度が10なら最低10個のテストケースが必要ということでもあるから、テストの工数見積もりにも使えるんだ

ひよこ ひよこ

どうやって測ればいいの?手で数えるの?

ペンギン先生 ペンギン先生

ESLintのcomplexityルール、PythonならRadon、JavaならSonarQubeなど、言語ごとに静的解析ツールがあるよ。CIパイプラインに組み込んで、複雑度が閾値を超えたらマージをブロックする運用をしているチームも多いね

ひよこ ひよこ

複雑度が高くなっちゃったらどうすればいいの?

ペンギン先生 ペンギン先生

関数を分割するのが王道だね。例えば大きなif-elseの連鎖はストラテジーパターンやポリモーフィズムで解消できる。早期リターンでネストを減らすのも効果的。ただし、複雑度を下げることが目的化して読みにくくなっては本末転倒だから、チームで適切な閾値を決めることが大事だよ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「サイクロマティック複雑度」って出てきたら「コードの分岐の多さを数値化した複雑さの指標」と思えればだいたいOK!
📖 おまけ:英語の意味
「Cyclomatic Complexity」 = 循環的複雑度
💬 1976年にThomas McCabeが提唱した指標で、グラフ理論の巡回数(サイクロマティック数)に由来しているよ。半世紀近く使われている定番の品質メトリクスだよ
← 用語集にもどる