ゆるふわ技術日誌

エンジニア見習いの悪戦苦闘日記

Rubocop先生のお話。

この記事は田胡研アドベントカレンダー22日目の記事です。

adventar.org

ReactNativeの話題をお届けする予定でしたが、時間がなくなってしまったので以前、田胡研ではRailsが何故か大流行しているのでRubocop先生の話をしようと思います。

Rubocopとは。

github.com

RubyのLintツールです。

Lintってのは、プログラム上の冗長なコードや不適切なコード(コンパイルは通るけど)みたいなのを教えてくれたり訂正してくれたりするツールです。

他の言語向けのLintツールももちろん存在するのですが、Rubocopはとても厳しいことで有名らしいです。

使い方

単純に使いたいだけなら、gem install rubocopをしてあげて、プロジェクトルートに移動してrubocopとコマンドを実行することで、自動的にカレントディレクトリ以下の.rbのファイルを検査してくれます。

ちなみに、某所で触らせてもらっているRailsのコードで走らせたら3000個以上のエラーが出ました。わろた。

すごいところ

Lintツールなので以下のような指摘をしてくれます

  • if not hogeは使わずにunless hoge使おう。
  • "'を統一しましょう
  • 無駄な空行やスペースいらなくね?
  • 書かなくてもreturnできるよ
  • 変数名、キャメルケース使おうね

などなど。また、これくらいのロジックに影響を及ぼさないエラーに関しては-aオプションを付けて実行することで自動的に修正もしてくれます。

つらいところ

Rubocop先生は大変厳しいので割と細かい指摘もしてくれます。例えば…

  • GemfileのGemの並び順がぐちゃぐちゃ
  • ヒアドキュメントの識別子にEOS使うな(もっと意味のある単語を使えということらしい)
  • get_hogeみたいなメソッド名
  • クラスが長い
  • 行が長い(80文字より多いとエラー吐く)
  • ループが多い

この辺のエラーになると、-aで自動修正してくれないエラーも多くあります。

現実的な使い方

前章で説明したとおり、ルールが厳しいのでそのまま使うのはあまり現実的ではありません。

Rubocopは設定を書くことで、ルールを無効化したり、エラーとなる閾値を変更することができます。

設定項目が多く、自分で全部見直すと日が暮れるので私は以下の手順でLint導入をしました。

  • onkcopといういい感じにカスタマイズした設定ファイルをGemにしたものが配信されているので、導入する。
    • 作者が日本人なので、すべての設定項目に日本語で説明が書いてあるのがとても良い。
  • 導入が済んだら-aオプションを付けて実行する。
  • GitのDiffと設定を照らし合わせながら、自分の書き方に合わないルールを修正
  • 自動修正できなかったエラーを見ながら修正orルール変更

これを10時間位ひたすらやって3000個のエラーを消し去ることに成功しました…!

Rubocopにメリットはあるのか

僕は声を大にして言いたい。ある

  • よく言う言葉だけどコード品質の担保
  • 誰が見ても見やすいコード(になる場合が多い)
  • 既存コードの把握
    • 途中からプロジェクトに突っ込まれたときに、これをやると既存の仕組みがわかるようになる
  • 何より勉強になる
    • Ruby的に美しいコードとは何かが学べる
    • 便利なメソッドをたくさん知ることができる

などなど。僕は10時間かけてもやるメリットがあった仕事だったなぁと思っています。

先程紹介したOnkcopの作者のかたのサイトが参考になるのでぜひ見てみてください。

rubocop のしつけ方 - onk.ninja

雑談

短くなっちゃいましたがRubocop先生の魅力が少しでも伝われば幸いです。

明日はnamazu510さんによる1年の振り返りです。ご期待ください。