🕶️

初学者のためのRuboCop

2023/08/05に公開

はじめに

どうも、どすこいです。就活が終わり卒業までに何か新しいチャレンジをしようと考えプログラミングの勉強を始めました。その中で、自分が勉強していく中で気になったことなどをまとめていきます。
記念すべき初投稿は、静的解析ツールであるRuboCopについての記事になります。

対象読者

私のように勉強したての初心者を対象にしています。

静的解析とは

静的解析とは、一言でゆうと、コードを実行せずに行う検証です。静的解析を用いるメリットとして、早い段階でエラーを見つけることができるためバグ修正のコストを削減できます。

Rubocopとは

RuboCopは、Rubyのコードを解析して、コーディング規約に沿った形に自動で修正するためのツールです。
Rubyのコミュニティには多くのスタイルガイドがあり、RuboCopはそれらのスタイルガイドを自動で適用して、コードの品質を向上させることを助けます。

以下はGithubの公式レポジトリです。
https://github.com/rubocop/rubocop

以下は公式Documentです。
https://docs.rubocop.org/rubocop/1.55/index.html

具体的な機能

  • Linting: コード内の構文エラーやバグ、不適切なコーディング慣習などを検出します。
  • Formatting: コードのフォーマットを整えるために、インデント、スペース、改行などを調整します。
  • 自動修正: 一部の問題については、自動的に修正することが可能です。

導入方法

Gemfile に書き込んで bundle installを実行するとインストールできます。

Gemfile
group :development do
  ...
  gem 'rubocop', require: false # 追加
  gem 'rubocop-performance', require: false # 追加
  gem 'rubocop-rails', require: false # 追加
  gem 'rubocop-rspec' # 追加
end

Gemfile に追記したら bundle install を実行します。

terminal
$ bundle install

使用方法

terminal
$ rubocop

引数なしで実行すると、rubocop現在のディレクトリ内のすべてのRubyソースファイルがチェックされます。

公式Docummentの具体例を載せておきます。

ruby
def badName
  if something
    test
    end
end

$rubcopを実行するterminalに以下のような結果が表示されます。

terminal
Inspecting 1 file
W

Offenses:

test.rb:1:1: C: Style/FrozenStringLiteralComment: Missing magic comment # frozen_string_literal: true.
def badName
^
test.rb:1:5: C: Naming/MethodName: Use snake_case for method names.
def badName
    ^^^^^^^
test.rb:2:3: C: Style/GuardClause: Use a guard clause instead of wrapping the code inside a conditional expression.
  if something
  ^^
test.rb:2:3: C: Style/IfUnlessModifier: Favor modifier if usage when having a single-line body. Another good alternative is the usage of control flow &&/||.
  if something
  ^^
test.rb:4:5: W: Layout/EndAlignment: end at 4, 4 is not aligned with if at 2, 2.
    end
    ^^^

1 file inspected, 5 offenses detected

注目して欲しいのは、CWとアルファベットです。これらは、違反レベルで、code styleからの違反のレベルを表しています。以下に違反レベルについてまとめていきます。

違反レベル

重要なものから順に記載します。
W以上は要修正です。

F Fatal
E Error
W Warning

以下は、修正の余地ありです。

C Convention
R Refactor

自動修正

さて、違反部分を教えてもらい修正していこうと思った読者の皆さん。安心してください。違反レベルが軽微なものは自動修正してくれます。これが静的解析ツールを使う最大のメリットなのかもしれません。

使い方

以下のコマンドをterminalで実行するだけです。RuboCopが自動修正できた箇所は「Corrected」と表示されます。

$ rubocop -a

修正後は以下のようにterminalで出力されます。

# 省略
13 files inspected, 35 offenses detected, 35 offenses corrected

意味は「13のファイルで35の修正をしたよ」です。

設定ファイルについて

Rubocop では .rubocop.yml という名前のファイルに書かれた設定に従い、ソースコードの検査を行います。

チーム開発では、このファイルがあるだけで、チーム全員のコーディングスタイルを統一できるでしょう。

作成

ここでは、簡易な設定を紹介します。
Railsのルートディレクトリで、.rubocop.ymlを作ってください。

.rubocop.yml
require: rubocop-rails # 必須

AllCops:
  # 除外するディレクトリ(自動生成されるファイル)
  Exclude:
    - "vendor/**/*"
    - "db/**/*"
    - "config/**/*"
    - "bin/*"
    - "node_modules/**/*"

  # 新ルールを有効化
  NewCops: enable

# 1行あたりの文字数をチェックする
Layout/LineLength:
  Max: 130
  # 下記ファイルはチェックの対象から外す
  Exclude:
    - "Rakefile"
    - "spec/rails_helper.rb"
    - "spec/spec_helper.rb"


# ネストが深すぎないかをチェック(if文のネストもチェック)
Metrics/BlockNesting:
  Max: 5

# クラスの行数をチェック(無効)
Metrics/ClassLength:
  Enabled: false

# 空メソッドの場合に、1行のスタイルにしない NG例:def style1; end
Style/EmptyMethod:
  EnforcedStyle: expanded


# 日本語でのコメントを許可
Style/AsciiComments:
  Enabled: false

他にも設定できるので色々試してください。

まとめ

今回は、静的解析ツールであるRuboCopについて取り上げました。初心者の私には、自動修正が有難くて今回記事のテーマにしました。静的解析ツールを勉強中から使ってコードの保守性を上げていくことも大事だと思いました。
間違っているところがあればTwitterでコメント下さい。

参考にさせてもらった文献・記事

本当に参考になりました。いつか私もたくさんの人に読んでもらえるように頑張ります。

https://docs.rubocop.org/rubocop/1.55/index.html

https://qiita.com/terufumi1122/items/ad55bf8713c0df053f58#違反のレベル

https://qiita.com/terufumi1122/items/ad55bf8713c0df053f58#違反のレベル

https://kitsune.blog/rails-rubocop#RuboCopの使い方

Discussion