ソースコードをreviewする機会はあるものの、作法や手加減の具合がまだまだよくわかっていない私。ほとんど書いたことがない言語を見ることもあるし (爆)。そんな私に役立ちそうな、循環的複雑度 (Cyclomatic Complexity) という指標を今日は教えてもらった。
たとえば自分でプログラムを書く際に、この循環的複雑度というものを手元のコマンドで可視化できると、「コードのここんとこ流れが複雑すぎるんじゃないか?」という見直し判断の一つの指標にできて良さそうだ。探してみると、CCN (Cyclomatic Complexity Number) を簡易的にはじき出してくれる「lizard」というOSSなツールを発見したのでメモです。
pip install lizard
」で導入可能brew install lizard-analyzer
」で導入可能Error connecting the analysing server.
」が表示されるCCNをlizardを使って調査する一例として、pythonで書かれた、とある自分のコードを生贄にします。
$ git clone https://github.com/mah-jp/liblib
$ cd liblib
$ git checkout 88df4052f7a8aa42ae4730e25257f9b65c3ccab8 .
Updated 0 paths from 05cf7d5
$ 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
項目名 | 内容 |
---|---|
NLOC | lines of code without comments |
CCN | cyclomatic complexity number |
roken | token count of functions |
PARAM | parameter count of functions |
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 (著), 須藤 功平 (解説), 角 征典 (翻訳)