静的解析ツール「RubyCritic」のUIが良くなっていたので紹介したいです!
この記事は feedforce Advent Calendar 2016 - Adventar の2日目の記事です。
1日目は 源義経のシンプルな考え方が好き - Marketing book でした。良い話だ。(ちなみに大河ドラマが平清盛だった年は、我が家では後白河院の評価が高かったです。懐かしい。)
RubyCriticのご紹介
RubyCriticはrubyコードを静的解析するツールです。rubygemで提供されています。
単純な使い方としては、$ gem install rubycritic
するなりbundler使うなりしてインストールし、
$ rubycritic .
を実行します。$ rubycritic ./app ./lib
のように、指定のディレクトリだけを対象にして実行することもできます。
実行すると./tmp/rubycritic/
の下に解析結果がhtmlで保存され、ブラウザが起動して閲覧することができます。
version3.1.0(先月リリース)で大幅なUI改善がありました! 🎉 色付きになってわかりやすくなりました。以下gifアニメ。
色の使い方とかは、コード解析のSaaSであるCodeClimateに似てるな、と思いました。 CodeClimateのグラフとかはこんな感じ -> CodeClimate - Google画像検索
RubyCritic version 3.1.0の出力イメージ
とある大きめのサイズのrailsプロジェクト*1を手元にクローンして、rubycritic
を走らせてみました。
トップ画面
モジュールごとの解析結果一覧
smellの一覧
コード上の問題箇所の表示
ズームインできる(gifアニメ)
(ちなみに、以前は以下のように、モノクロ〜な感じでした。)
以前のトップ画面
RubyCriticの中身をちょっと覗いてみる
RubyCriticは、以下のruby解析用Gemに依存しています。
- reek
- reekにおいて定義された、
smell
(コードの"臭う"箇所)を検出します。- reekのドキュメントによると、
smell
は、「コードが読みにくい、または保守しづらい場所を示唆するもの」とのことです。
- reekのドキュメントによると、
- smellの一覧はこちらです。
- reekにおいて定義された、
- flay
- コードどうしの類似度が高い部分を検出します。
- flog
- 複雑度の高い部分を検出します。
Churn and Complexity のグラフ の見方等について
このグラフの意味は、こんな感じです。
Complexity
Complexity
は、ABC(Assignment/Branches/Calls)のサイズです。低いほど良い。
RuboCopにもABCサイズを測るやつがありますが、
それと似たような感じだと思います。
Churn
Churn
は、ファイルのコミット回数(=ファイルの変更回数)です。
裏側ではgitを叩いてチェック(!!!)していました。
ソースを読む限り、gitの他にはmercurialとかに対応しているっぽいです。
これも低いほど良い、とのことですが、歴史の長いリポジトリほど高くなるのは仕方ないので、あくまで相対的に他のファイルと比較するものだと思います。
Rating
ファイルごとにRating
がつきます。これはA〜Fで表され、色は緑〜赤で表されます。Aに近いほど良い。
前述のComplexity
とsmell
の量が、このRating
に影響します。
こんな感じで計算している様子でした。
reekが検出するsmell
のカスタマイズについて
reekが検出するsmellはだいぶ個性的なので、もしかしたらルールによっては、使う人の肌に合わないものもあるかもしれません。
リポジトリのトップにyamlファイル(.reek
ファイルまたはconfig.reek
ファイル)を置くことで、reekが検出する特定のsmellをカスタマイズして抑制することができます。
READMEのこのあたりにやりかたが書いてあります。
まとめ・感想
reekのsmellは個性的なので、うざく感じるかもしれませんが、とりあえず走らせてみると、何か気づきがあるかもしれません。
CodeClimateと似ているかもしれませんが、コードの内容を外に漏らさずに、手元のみで完結できるというのは、選択肢が増えて良いと思いました。
メリークリスマス。
追伸
feedforce Advent Calendar 2016 - Adventar の3日目はこちらです
参考リンク
*1:今回railsアプリであるrubygems/rubygems.orgを使いました