TL;DR

プログラムの制御フローの複雑さを測る、静的解析の指標。開始から終了までの線形独立な経路の数を数える。Thomas McCabe が 1976 年に提唱した。

なぜ必要か

値が大きいほどテストが必要な経路が増えるので、保守性が下がる目安になる。一般的な目安は次のとおり。

  • 1〜10: 単純で良好
  • 11〜20: やや複雑
  • 21〜50: 複雑でリスクがある
  • 51〜: リスクが高い

仕組み

計算方法は 2 つある。1 つは制御フローグラフから求める方法で、エッジの数を 、ノードの数を 、連結成分の数を (単一の関数なら 1)として、次の式で求める。

もう 1 つは決定ポイントを数える方法で、if / else、for、case、&& / || が現れるたびに 1 を足す。

例

Go では、gocyclo で循環的複雑度を計測できる。関連するツールに gocognit があり、こちらはネストの深さを重視する別の指標である認知的複雑度を計測する。

関連

  • 認知的複雑度
  • 制御フローグラフ