RuboCopを使ってコーディング規約に沿ったコードを書く

下條です。
現在参加しているRailsプロジェクトでは、RuboCopを使ってソースコードをコーディング規約に合わせるようにしています。RuboCopはRubyのソースコードを静的解析し、コーディング規約に合っていない箇所を指摘してくれるツールです。コーディング規約はあっても実際には守られないという現実は多くありますので、ツールを使ってコーディング規約を守ろうという寸法です。

RuboCopでベースとしているコーディング規約自体はこれです。
また、日本語訳をしてくれている方もいます。

インストール

インストールはこれだけです。

1
$ gem install rubocop

使用方法

カレントディレクトリ配下のRubyソースを全てチェックしてくれます。

1
$ rubocop

ファイル指定やディレクトリ指定も可能です。

1
$ rubocop hoge.rb
$ rubocop hoge

vimとの連携

RuboCopと各種エディタの連携が可能です。
vimユーザはVim RuboCopが使用可能です。

個人的には、ついついRuboCopを通し忘れるのがいやなので、自動的に通すようにしてあります。syntasticを使います。
syntasticをインストールした上で、以下を.vimrcに追加。

1
let g:syntastic_mode_map = { 'mode': 'active',
            \ 'active_filetypes': ['ruby'] }
let g:syntastic_ruby_checkers = ['rubocop']

これで、保存のたびにRuboCopが走るようになります。保存が多少重くなりますが、ソースを書いてから流すよりもベターかなと思います。テストまで通してから、RuboCop通すの忘れたことに気づいて、対応してからまたテストするのは時間がもったいないので。

コーディング規約の変更

個人的感想としては、最初にRuboCopを使ったときは、チェックがけっこう厳しいなあという印象でした。あと、たまに何を指摘されているのかわからないこともありました。
特に、これまでソースコードの1行80文字制限を気にしたことがなかったことが多いのですが、参加したプロジェクトでは1行80文字制限があり、慣れるまでちょっと苦労しました。

まあ慣れたら大したことはないのですし、次第にコーディング規約が頭に入ってくるのでRuboCopの指摘が入ることも少なくなってきます。
ただ、メソッド一つ10行とかちょっときついルールもあるので、適宜.rubocop.ymlファイルで設定を変更していくのが良いと思います。

ためしに

RuboCop自体のソースコードをRuboCopにかけてみました。全部完璧に通っています。さすが!

1
/Users/shimojomasatsugu/Development/rubocop% rubocop
Inspecting 469 files
.....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................

469 files inspected, no offenses detected

と思ったら、、、.rubocop_todo.ymlで設定を変更していました。

1
(前略)
# Offense count: 24
CyclomaticComplexity:
  Max: 10

# Offense count: 114
# Configuration parameters: CountComments.
MethodLength:
  Max: 20

あれ、本家がこれをやるのは反則では・・・

と思う気持ちは置いておいて、デフォルトではCyclomaticComplexityは6、MethodLengthは10になっていますが、個人的にもちょっと厳しいのではと思っていました。まあ納得です。

なお、最近、
SideCI
というサービスが登場しました。これも静的解析ツールですが、Railsのソースを対象に、Railsらしくないコードや、セキュリティに問題があるコードなどをチェックしてくれるということで気になっています。またレポートできればと思います。

このエントリーをはてなブックマークに追加