lizard で循環的複雑度を計測する
lizard で循環的複雑度(CCN)を計測する
本記事の最後に示す 参考リンク
で大概のことは説明されているので、本記事では抜粋的な紹介と活用例について記載する。
循環的複雑度(CCN)とは?
循環的複雑度(Cyclomatic Complexity Number)とは、プログラムの複雑度を測るのに使われる。プログラムのソースコードから、線形的に独立した経路の数を直接数える。
以上、Wikipedia より。
lizard とは?
CCN を計測するソフトウェア。Python で動きます。
MIT に準拠したライセンスらしく、無償で商用利用も可能です。
対応言語は、
- C/C++ (works with C++14)
- Java
- C# (C Sharp)
- JavaScript (With ES6 and JSX)
- TypeScript
- Objective-C
- Swift
- Python
- Ruby
- Rust
- Kotlin
など、まだまだあります。
まあ、充分ですよね、、。
> pip install lizard
で簡単に導入できます。
HTML 出力するときのために以下も入れておきましょう。HTML 出力使わないなら要りません。
> pip install jinja2
計測可能な指標
メソッド毎に以下のような指標を出力します。
- CCN
- nloc : コメント除くコード行数
- token 数
- パラメーター数
実行例
C# と C++ のコードを計測、OSS フォルダを除外、HTML で出力。
>lizard -l cpp -l csharp -Tcyclomatic_complexity=20 -Tnloc=500 -Tparameter_count=7 -x ./OSS/* --html > lizard_result.html
出力例
以下はデフォルトの閾値で HTML 出力した例。
デフォルトの閾値を超えた行は赤くなっています。
- CCN は 21 以上で警告するなど、閾値もカスタマイズできます。
- HTML ではなく CSV などでも出力できます。
- ホワイトリストで除外設定ができます。
- 閾値に引っかかったものだけを出力するようにもできます。
lizard の活用
CI(継続的インテグレーション)ツールとして利用する。
まずはプロジェクトで CCN や nloc の閾値を決めて、その閾値を用いてコードを計測するようにします。token 数とか決めづらいなどあれば、運用を重ねてある程度目安ができてからチェックするなどでもよいと思います。
運用案
例えば、まずは以下のように決めてみて、運用しながら微調整していくなど。
(メソッド毎)
- CCN : 21 以上は NG、15 以上はレビューする。
- nloc : 500 超は NG。300 以上はレビューする。
- token 数 : 運用後に決定。
- パラメーター数 : 7 以上は NG。
※ 閾値を超えるものでも許容するものは、ホワイトリストで除外設定する。
推奨
git や subversion などで、ソースを追加する際のフックなどに lizard をしかけておいて、CCN が指定した閾値を超えたら追加できないようにする。
代替案
推奨案が取れない場合は、(例えば Jenkins などで)定期的に lizard をしかけておいて、その出力を開発メンバが見えるようにしておく。リリースまでに閾値を超えるものが無いように修正する。
Discussion