RubyCriticでコードを採点

はじめに

こんにちは、トーチライト広告運用製品エンジニアの甲斐です。今回はRubyで書いたコードに点数をつけてくれる  RubyCritic導入についてお話していこうと思います。

RubyCriticとは?

  • Rubyコードを静的解析するツール
  • 同じく静的解析ツールの reekflayFlogなどの結果からコードの総合的なレポートを出してくれる

公式github

導入

  • 自身のプライベートで作っているRailsプロジェクトに導入していきます

環境情報

  • MacOS: 10.13.2
  • Ruby: 2.5.1
  • Ruby on Rails: 5.2

手順

Gemfile

  • Gemfileに gem 'rubycritic', require: falseを追加

インストール

  • 下記コマンドを実行

これで導入は完了です。さて、早速実行してみましょう。

実行

  • プロジェクト全体に実行

*ここでもし command not foundが出る場合、下記でいけるかと思います

全体実行結果

  • 実行すると下記のように出力がされ、終了後に自動的にブラウザが開く

!!

95.53点。。。意外と高かったです。まぁまだ小さいプロジェクトだからでしょう。
では1つずつ見ていきましょう

オーバービュー

スコア

  • 画面左上のドーナツチャートはどのランクが全体のどれくらいの比率を占めているかを示します
  • この場合はAランク評価が87.1%を占めています
  • 中央にある数字がこのプロジェクトのコード解析のスコアです

Churn vs Complexity

  • Churn:コミットされた回数
    • 辞書だと「激しく動く」という意味
  • Complexity:複雑度

*この項目はgitなどのバージョン管理されていないプロジェクトでは検出できないので注意です。バージョン管理されていないとこんな表示になります。

Summary

  • AからFまでのランクがいくつずつあるかを表示している
  • Eはない。(理由は不明)
  • ランクの意味
    • AとBはいいコード
    • Cはwarningレベル
    • Dから下は修正すべきコード!!

コード

  • クラスごとの
    • レーティング
    • Churn(コミットされた回数)
    • Complexity(複雑度)
    • Duplication(類似性)
    • Smells(reekのsmell数)

クラスごとの詳細

  • クラス名をクリックすると、1行ごとの詳細を見ることができる

  • UncommunicativeParameterNameはreekのsmellの1つ

  • 意味がわからないときは命題(ここだとUncommunicativeParameterName)をクリックすると詳細ページに遷移するので何をすれば良いかがわかる
  • また、コードの類似度を示す DuplicateMethodCallでは、類似している箇所のリンクがあるので比較しやすいようになっている。これは便利です。

Smells

  • 各クラスに存在するsmellの結果を表示
  • 何も考えずに作っていましたが DuplicateCodeが多いという印象(気をつけたいと思います)

使えそうなオプション

  • ファイル指定で実行

  • ブランチ比較

など

  • ブランチ比較は使えるなと思った
  • 差分に対してのスコアなので、このスコアが100に近づくほど差分のクオリティが高いことになる
  • 修正を入れた時にどうなるかはマージ後に再度rubycriticを走らせる必要がある
  • 作業ブランチに試しに a = 0という1行を加えた結果、差分のスコアは 98.21でした(元は95.53)
  • 予想通りUncommunicativeVariableNameが出ました

思ったこと

  • コード書く時って結構主観が入っていて、PRレビュー時に色々気づかされることが多いですが、人それぞれで判断も違うので今いちいいコードとはなんなのかがわかっていませんでした。
  • こういう静的解析ツールを使うことでチーム内の共通の指標ができるので、例えばスコアを上げることをチーム目標に掲げることでモチベーションアップにもなりソースコードクオリティが上がりそうな気がしました。
  • 弊社ではCircleCIを使って自動テストを行なっているのですが、そこに組み込んでブランチの差分のスコアを出して結果をSlackに飛ばすとかしたら面白いなと思った

最後にツールの説明

flay

  • コードの類似を検知する
  • スコアが低い方が良い
  • 高いスコアは似ているコードがたくさんあることを意味する
  • スコアが低いほどDRY原則を遵守していると言える

https://github.com/seattlerb/flay

flog

  • コードの複雑さを検知する
  • スコアが低い方が良い
  • スコアが高いほどそのコードは痛めつけられていることを意味する

https://github.com/seattlerb/flog

reek

  • 臭いコードを検知する
  • インスタンス変数が多すぎる、メソッドが長すぎる、変数名がおかしい、など多様な面からソースを解析してくれる

https://github.com/troessner/reek

アバター

甲斐貴彦

1件のコメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

コメントする