循環的複雑度(CCN)の定義と測定
概要
- プログラムをグラフとして考えた時に、エッジ数とノード数と依存しているモジュール数で複雑度を定義する方法
- エッジ数
- グラフの参照を示す矢印のこと
- ノード数
- グラフの参照先のブロックのこと
- エッジ数
- \(M\); 循環的複雑度
- \(E\); エッジ数
- \(N\); ノード数
- \(P\); 連結されたコンポーネント数
具体例
- このフローの循環的複雑度は
9 - 8 + 2*1 =3
if (c1()):
f1()
else:
f2()
if (c2()):
f3()
else:
f4()
このプログラムのネットワークに変換すると以下の図になる
lizardによる循環的複雑度の測定
$ python3 -m pip install lizard
$ lizard <filename>
================================================
NLOC CCN token PARAM length location
------------------------------------------------
2 1 22 3 2 funcname0@4-5@filename
39 12 266 2 42 funcname1@7-48@filename
CCN
のカラムが循環的複雑度を示す