品質管理
メトリクス
lizard

lizardでMcCabeの循環的複雑度を測る

More than 1 year has passed since last update.

動機

Javaの循環的複雑度を測るにあたって、Eclipseプラグインを利用してきた方法がIntelliJが主な開発IDEとなった最近では気軽に実施しづらい。
計測のためだけに、Eclipse立ち上げるのもなあと思っていたところに lizardを見つけたのでメモ。

循環的複雑度

英語で言うと、Cyclomatic complexity。
簡単に言うとプログラムの複雑度を数値化したもの。
if分岐などが多いと数値が高くなるため、数値が低いほど複雑度が少ないとされる。

詳しくは Wikipediaをどうぞ
https://ja.wikipedia.org/wiki/%E5%BE%AA%E7%92%B0%E7%9A%84%E8%A4%87%E9%9B%91%E5%BA%A6

開発プロジェクトによっては「各クラスの複雑度を○○以下にすること」などと決まっていたりする。

lizard

https://github.com/terryyin/lizard

対象言語として以下のようなものがある(抜粋)

  • Java
  • Swift
  • C/C++
  • C#
  • Scala

色々対応しているのでうれしい。特にSwiftに対応しているのがGood
(Kotlinにも対応して欲しい)

インストール

pipがインストールされていれば下記でインストール可能。

pip install lizard

実行サンプル

オプションが色々あるが、とりあえず言語を指定する -lを利用してlizard自体のコードを解析してみた。

$ lizard -l python
================================================
  NLOC    CCN   token  PARAM  length  location  
------------------------------------------------
       3      1     25      3       3 print_xml@10-12@./lizard_ext/__init__.py
       2      1     21      3       2 print_csv@15-16@./lizard_ext/__init__.py
       7      2     82      2      20 auto_open@7-26@./lizard_ext/auto_open.py
--- 中略 --- 
      11      4     62      1      11 get_extensions.expand_extensions@939-949@./lizard.py
      10      1     29      1      22 get_extensions@936-957@./lizard.py
      19      6    124      1      24 main@963-986@./lizard.py
88 file analyzed.
==============================================================
NLOC    Avg.NLOC  AvgCCN  Avg.token  function_cnt    file
--------------------------------------------------------------
     11       2.5     1.0       23.0         2     ./lizard_ext/__init__.py
     16       6.0     2.0       60.5         2     ./lizard_ext/auto_open.py
     41      24.0     6.0      103.0         1     ./lizard_ext/csvoutput.py
--- 中略 --- 
    804       8.0     2.5       49.7        89     ./lizard.py
     13       0.0     0.0        0.0         0     ./profile.py
     42       0.0     0.0        0.0         0     ./setup.py

=============================================================================================
No thresholds exceeded (cyclomatic_complexity > 15 or length > 1000 or parameter_count > 100)
==========================================================================================
Total nloc   Avg.NLOC  AvgCCN  Avg.token   Fun Cnt  Warning cnt   Fun Rt   nloc Rt
------------------------------------------------------------------------------------------
      6967       6.2     1.5       37.0      947            0      0.00    0.00

print_xml@10-12@./lizard_ext/__init__.py のように最初はメソッドごとの集計を実施
./lizard_ext/__init__.py のような次の集計はファイルごとの集計を実施

どちらも

  • NLOC:コード行数
  • CCN:循環的複雑度

は出力されている

所感

コマンドラインでの実行は慣れれば楽。
ビルドパイプラインとも結合し易いのでCIと連携して定期的にチェックすることもできそうだ。