Forkwell Portfolio の新しい機能を開発しながら、リファクタリングしている日々の @sinsoku です。 今日はリファクタリングの改善結果が気になったので調べてみました。
Ruby で AbcSize 20以上の数値、ファイル数の推移を出したいけど、簡単に出す方法ってあったりしないのかな。マージコミットを checkout して、AbcSize を計測して、csv にして、とかをするだけなんだけど、書くのがメンドイ。。。
— 神速@リリカルエンジニア (@sinsoku_listy) 2017年7月11日
残念ながら簡単な方法は見つからなかったので、「メンドイ」という気持ちに負けずにスクリプトを書きました。
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つです。
感想
- ときどき AbcSize の高いコードが混入している
- ただ、増え続けてはいなくて、ちゃんと減っている
- AbcSize 30 以上のメソッド数は着実に減っている
グラフで見ても、リファクタリングで複雑なコードが少しずつ減っているのが分かりました。
まとめ
コードの複雑度は目に見えないので、こうやってグラフにすると面白いですね。 皆さんも自社のプロダクトの AbcSize を計測してみると新しい発見があると思いますので、ぜひお試し下さい。
そして、個人的に各社の AbcSize がどのくらいの数値なのか気になるので、可能なら技術ブログでの公開をご検討ください。 各社の AbcSize が公開されるのを楽しみにしてます :-)