Forkwell のソースコードの複雑度(AbcSize)を計測してみた

Forkwell Portfolio の新しい機能を開発しながら、リファクタリングしている日々の @sinsoku です。 今日はリファクタリングの改善結果が気になったので調べてみました。

残念ながら簡単な方法は見つからなかったので、「メンドイ」という気持ちに負けずにスクリプトを書きました。

AbcSize とは

  • Assignment: 変数の代入
  • Branch: 関数の呼び出し
  • Condition: 条件分岐

から計測する複雑度です。Ruby だと RuboCop で簡単にチェックできます。

計測スクリプト

RuboCop 単体では AbcSize の数値を出力できないため、簡単なスクリプトを書きました。

ファイル 概要
calc_abcsize.rb AbcSize を計測し、tmp/abcsize.csv を出力する
trace_abcsize.rb 2014/1 から月初のコミットを checkout して AbcSize を計測する

雑な実装のスクリプトですが、 gist で公開してるので参考にどうぞ。

https://gist.github.com/sinsoku/2c37b2efed514c7ac212203dc867e045

実行方法

下記のコマンドで 2014〜2017年の AbcSize の集計が出来ます。

$ curl -L -O https://gist.github.com/sinsoku/2c37b2efed514c7ac212203dc867e045/raw/ef0afa616b23fe6c976f37a6a154a92e86f215ac/calc_abcsize.rb
$ curl -L -O https://gist.github.com/sinsoku/2c37b2efed514c7ac212203dc867e045/raw/ef0afa616b23fe6c976f37a6a154a92e86f215ac/trace_abcsize.rb
$ ruby trace_abcsize.rb
$ echo 'date,20..29,30..39,40..49,50..59,60..69,70..79,80..89,90..99,100..' >> result.csv
$ for f in $(ls 20*.csv); do echo ${f%.csv},$(tail -1 ${f}) >> result.csv; done

グラフ

生成された result.csv を Google スプレッドシートでグラフ化したのが下記の2つです。

f:id:sinsoku:20170713165255p:plain

f:id:sinsoku:20170713165305p:plain

感想

  • ときどき AbcSize の高いコードが混入している
  • ただ、増え続けてはいなくて、ちゃんと減っている
  • AbcSize 30 以上のメソッド数は着実に減っている

グラフで見ても、リファクタリングで複雑なコードが少しずつ減っているのが分かりました。

まとめ

コードの複雑度は目に見えないので、こうやってグラフにすると面白いですね。 皆さんも自社のプロダクトの AbcSize を計測してみると新しい発見があると思いますので、ぜひお試し下さい。

そして、個人的に各社の AbcSize がどのくらいの数値なのか気になるので、可能なら技術ブログでの公開をご検討ください。 各社の AbcSize が公開されるのを楽しみにしてます :-)