ソースコードの循環的複雑度 (CCN) を調査するLizardというツール

ソースコードの循環的複雑度 (CCN) を調査するLizardというツール
Page content

Cyclomatic Complexityとは

ソースコードをreviewする機会はあるものの、作法や手加減の具合がまだまだよくわかっていない私。ほとんど書いたことがない言語を見ることもあるし (爆)。そんな私に役立ちそうな、循環的複雑度 (Cyclomatic Complexity) という指標を今日は教えてもらった。

たとえば自分でプログラムを書く際に、この循環的複雑度というものを手元のコマンドで可視化できると、「コードのここんとこ流れが複雑すぎるんじゃないか?」という見直し判断の一つの指標にできて良さそうだ。探してみると、CCN (Cyclomatic Complexity Number) を簡易的にはじき出してくれる「lizard」というOSSなツールを発見したのでメモです。

Lizardのコマンド

Lizardのオンラインサービス

  • lizard.ws: ただし記事執筆時点では「Error connecting the analysing server.」が表示される

Lizardを軽く試す

CCNをlizardを使って調査する一例として、pythonで書かれた、とある自分のコードを生贄にします。

  1. 下記リポジトリの現時点のcommitをcloneする
    $ git clone https://github.com/mah-jp/liblib
    $ cd liblib
    $ git checkout 88df4052f7a8aa42ae4730e25257f9b65c3ccab8 .
    Updated 0 paths from 05cf7d5
    
  2. 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
    
  3. 用語の意味は下表の通り。CCNだけに着目してもなんとなくわかる。なるほど……。orz
    項目名内容
    NLOClines of code without comments
    CCNcyclomatic complexity number
    rokentoken count of functions
    PARAMparameter count of functions
  4. ちなみに、中身のウェブスクレイピング部分を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)

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

Dustin Boswell (著), Trevor Foucher (著), 須藤 功平 (解説), 角 征典 (翻訳)