パラボラアンテナと星の日記

あることないこと

静的解析ツール「RubyCritic」のUIが良くなっていたので紹介したいです!

この記事は feedforce Advent Calendar 2016 - Adventar の2日目の記事です。

1日目は 源義経のシンプルな考え方が好き - Marketing book でした。良い話だ。(ちなみに大河ドラマ平清盛だった年は、我が家では後白河院の評価が高かったです。懐かしい。)


RubyCriticのご紹介

rubyエンジニアなのでrubyのことを書きます。

RubyCriticrubyコードを静的解析するツールです。rubygemで提供されています。

単純な使い方としては、$ gem install rubycritic するなりbundler使うなりしてインストールし、

$ rubycritic .

を実行します。$ rubycritic ./app ./lib のように、指定のディレクトリだけを対象にして実行することもできます。

実行すると./tmp/rubycritic/の下に解析結果がhtmlで保存され、ブラウザが起動して閲覧することができます。

version3.1.0(先月リリース)で大幅なUI改善がありました! ? 色付きになってわかりやすくなりました。以下gifアニメ。

f:id:hoppie:20161202053159g:plain

このissueこのPRで、ゴリッと入ったようです。 ?

色の使い方とかは、コード解析のSaaSであるCodeClimateに似てるな、と思いました。 CodeClimateのグラフとかはこんな感じ -> CodeClimate - Google画像検索

RubyCritic version 3.1.0の出力イメージ

とある大きめのサイズのrailsプロジェクト*1を手元にクローンして、rubycriticを走らせてみました。

トップ画面

f:id:hoppie:20161129065614p:plain

モジュールごとの解析結果一覧

f:id:hoppie:20161129065555p:plain

smellの一覧

f:id:hoppie:20161129065600p:plain

コード上の問題箇所の表示

f:id:hoppie:20161129065551p:plain

ズームインできる(gifアニメ)

https://cloud.githubusercontent.com/assets/1394049/20687781/2e02c952-b601-11e6-9677-fb567ab6bcf5.gif

(ちなみに、以前は以下のように、モノクロ〜な感じでした。)

以前のトップ画面

f:id:hoppie:20161129065548p:plain

RubyCriticの中身をちょっと覗いてみる

RubyCriticは、以下のruby解析用Gemに依存しています。

  • reek
    • reekにおいて定義された、smell(コードの"臭う"箇所)を検出します。
      • reekのドキュメントによると、smell は、「コードが読みにくい、または保守しづらい場所を示唆するもの」とのことです。
    • smellの一覧はこちらです。
  • flay
    • コードどうしの類似度が高い部分を検出します。
  • flog
    • 複雑度の高い部分を検出します。

Churn and Complexity のグラフ の見方等について

このグラフの意味は、こんな感じです。

f:id:hoppie:20161202070926p:plain

Complexity

Complexity は、ABC(Assignment/Branches/Calls)のサイズです。低いほど良い。 RuboCopにもABCサイズを測るやつがありますが、 それと似たような感じだと思います。

Churn

Churnは、ファイルのコミット回数(=ファイルの変更回数)です。 裏側ではgitを叩いてチェック(!!!)していました。

ソースを読む限り、gitの他にはmercurialとかに対応しているっぽいです。

これも低いほど良い、とのことですが、歴史の長いリポジトリほど高くなるのは仕方ないので、あくまで相対的に他のファイルと比較するものだと思います。

Rating

ファイルごとにRatingがつきます。これはA〜Fで表され、色は緑〜赤で表されます。Aに近いほど良い。

前述のComplexitysmellの量が、このRatingに影響します。

こんな感じで計算している様子でした。

reekが検出するsmellのカスタマイズについて

reekが検出するsmellはだいぶ個性的なので、もしかしたらルールによっては、使う人の肌に合わないものもあるかもしれません。

リポジトリのトップにyamlファイル(.reekファイルまたはconfig.reekファイル)を置くことで、reekが検出する特定のsmellをカスタマイズして抑制することができます。

READMEのこのあたりにやりかたが書いてあります。

まとめ・感想

reekのsmellは個性的なので、うざく感じるかもしれませんが、とりあえず走らせてみると、何か気づきがあるかもしれません。

CodeClimateと似ているかもしれませんが、コードの内容を外に漏らさずに、手元のみで完結できるというのは、選択肢が増えて良いと思いました。

メリークリスマス。

追伸

feedforce Advent Calendar 2016 - Adventar の3日目はこちらです

hanocha.hateblo.jp

参考リンク

github.com

github.com

github.com

github.com

*1:今回railsアプリであるrubygems/rubygems.orgを使いました