ソースコードの循環的複雑度 (CCN) を調査するLizardというツール
Page content
Cyclomatic Complexityとは
ソースコードをreviewする機会はあるものの、作法や手加減の具合がまだまだよくわかっていない私。ほとんど書いたことがない言語を見ることもあるし (爆)。そんな私に役立ちそうな、循環的複雑度 (Cyclomatic Complexity) という指標を今日は教えてもらった。
たとえば自分でプログラムを書く際に、この循環的複雑度というものを手元のコマンドで可視化できると、「コードのここんとこ流れが複雑すぎるんじゃないか?」という見直し判断の一つの指標にできて良さそうだ。探してみると、CCN (Cyclomatic Complexity Number) を簡易的にはじき出してくれる「lizard」というOSSなツールを発見したのでメモです。
Lizardのコマンド
- lizard · PyPI: 単体コマンドおよびPythonモジュールとして「
pip install lizard
」で導入可能 - lizard-analyzer — Homebrew Formulae: brewでは「
brew install lizard-analyzer
」で導入可能 - terryyin/lizard: A simple code complexity analyser without caring about the C/C++ header files or Java imports, supports most of the popular languages.: ソースコードはこちら
Lizardのオンラインサービス
- lizard.ws: ただし記事執筆時点では「
Error connecting the analysing server.
」が表示される
Lizardを軽く試す
CCNをlizardを使って調査する一例として、pythonで書かれた、とある自分のコードを生贄にします。
- 下記リポジトリの現時点のcommitをcloneする
$ git clone https://github.com/mah-jp/liblib $ cd liblib $ git checkout 88df4052f7a8aa42ae4730e25257f9b65c3ccab8 . Updated 0 paths from 05cf7d5
- lizardコマンドを導入済みの環境にて、Pythonを対象とするコマンドを次のように実行する
$ lizard --languages python ./*.py ================================================ NLOC CCN token PARAM length location ------------------------------------------------ 5 1 64 2 5 do_login@22-26@./book2json_d-library.py 15 6 105 2 15 wait_element@28-42@./book2json_d-library.py 58 14 592 0 61 main@44-104@./book2json_d-library.py 46 3 604 4 51 run@18-68@./book2json_opac.py 38 7 503 2 40 parse_html@70-109@./book2json_opac.py 2 1 20 0 2 get_datetime@111-112@./book2json_opac.py 4 1 31 1 4 cut_space@114-117@./book2json_opac.py 4 1 46 1 4 pickup_orderstatus@119-122@./book2json_opac.py 3 1 27 1 3 pickup_library@124-126@./book2json_opac.py 3 1 36 1 3 pickup_title@128-130@./book2json_opac.py 8 3 77 2 8 pickup_date@132-139@./book2json_opac.py 7 3 55 2 9 pickup_reserve@141-149@./book2json_opac.py 39 15 323 1 43 main@12-54@./json2alert.py 3 file analyzed. ============================================================== NLOC Avg.NLOC AvgCCN Avg.token function_cnt file -------------------------------------------------------------- 114 26.0 7.0 253.7 3 ./book2json_d-library.py 157 12.8 2.3 155.4 9 ./book2json_opac.py 51 39.0 15.0 323.0 1 ./json2alert.py =============================================================================================================== No thresholds exceeded (cyclomatic_complexity > 15 or length > 1000 or nloc > 1000000 or parameter_count > 100) ========================================================================================== Total nloc Avg.NLOC AvgCCN Avg.token Fun Cnt Warning cnt Fun Rt nloc Rt ------------------------------------------------------------------------------------------ 322 17.8 4.4 191.0 13 0 0.00 0.00
- 用語の意味は下表の通り。CCNだけに着目してもなんとなくわかる。なるほど……。orz
項目名 内容 NLOC lines of code without comments CCN cyclomatic complexity number roken token count of functions PARAM parameter count of functions - ちなみに、中身のウェブスクレイピング部分をseleniumからplaywrightへ切り替えている、開発中でまだ未公開の
book2json_d-library.py
だとCCNは次の通り。流れの複雑度が下がっていることが、実際のコードも感覚的にそうだし、指標にも現れているようです============================================================== NLOC Avg.NLOC AvgCCN Avg.token function_cnt file -------------------------------------------------------------- 144 12.8 2.5 150.0 8 ./book2json_d-library.py
感想
CCNという指標、そしてそれを簡易的に調査できるLizardというツールを今回知ることができ、新しい世界を垣間見た気がして、コード品質分析ツール方面への関心が高まりました。もちろんこのLizardの出力は、ソースコードの読みやすさを考える際の一種の参考として捉えるべきものと理解もしつつ。
参考リンク
Lizardの紹介・使いこなし。探せば詳しい記事が色々見つかります。
コード品質を分析する、SonarQubeという本格ツールもあるらしい。
リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)
Dustin Boswell (著), Trevor Foucher (著), 須藤 功平 (解説), 角 征典 (翻訳)