Rubocop先生のお話。
この記事は田胡研アドベントカレンダー22日目の記事です。
ReactNativeの話題をお届けする予定でしたが、時間がなくなってしまったので以前、田胡研ではRailsが何故か大流行しているのでRubocop先生の話をしようと思います。
Rubocopとは。
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先生の魅力が少しでも伝われば幸いです。
明日はnamazu510さんによる1年の振り返りです。ご期待ください。