キレイで読みやすいRubyコードを書くために。RuboCopスタイルガイド レイアウト編

よこのじ(@yokonoji_work)です。

この記事は、RuboCopのThe Ruby Style Guide レイアウト編です。

キレイで読みやすいRubyコードを書きたい!ということで、Rubyのコード解析ツール RuboCop で採用されている「The Ruby Style Guide」の内容をまとめてみました。

処理内容が分かりやすくバグが少ないコードを書くために、ぜひ参考にさせてもらいましょう。

おすすめ本として必ず挙げられるリーダブルコードを読むのも良いと思います。

Ruby スタイルガイド(The Rails Style Guide)レイアウト編

インデントのスペースは2つにする

# 悪い例 - 4つのスペース
def some_method
    do_something
end

# 良い例
def some_method
  do_something
end

1行につき1つの式を書く

# 悪い例
puts 'foo'; puts 'bar' # 2つの式が1行にあります

# 良い例
puts 'foo'
puts 'bar'

puts 'foo', 'bar' # putsの場合はこれも可

本文のないクラスは1行にする

# 悪い例
class FooError < StandardError
end

# 良い例
FooError = Class.new(StandardError)

1行のメソッドは避ける

# 悪い例
def too_much; something; something_else; end

# 良い例
def some_method
  body
end

演算子の前後、コンマ、コロン、セミコロンの後ろにはスペースを入れる

sum = 1 + 2
a, b = 1, 2
class FooError < StandardError; end

ただし、指数演算子、有理数のリテラル(rational literals)、safe navigation operator(ぼっち演算子)は例外です。

# 良い例
e = M * c**2
o_scale = 1/48r
foo&.bar

かっこ ( ) [ ] の前後にはスペース不要

ただし、{ } の前後にはスペースを入れます。

# 悪い例
some( arg ).other
[ 1, 2, 3 ].each{|e| puts e}

# 良い例
some(arg).other
[1, 2, 3].each { |e| puts e }

{ } を使う場合でも、文字の埋め込みではスペース不要です。

# 良い例
"From: #{user.first_name}, #{user.last_name}"

!の後にはスペースは入れない

# 悪い例
! something

# 良い例
!something

範囲リテラルの内側にスペースは入れない

# 悪い例
1 .. 3
'a' ... 'z'

# 良い例
1..3
'a'...'z'

whenはcaseと同じ深さに揃える

# 悪い例
case
  when song.name == 'Misty'
    puts 'Not again!'
  when song.duration > 120
    puts 'Too long!'
  else
    song.play
end

# 良い例
case
when song.name == 'Misty'
  puts 'Not again!'
when song.duration > 120
  puts 'Too long!'
else
  song.play
end

条件式を変数に代入するときは、 条件分岐のインデントを揃える

# 悪い例 - かなり複雑です
kind = case year
when 1850..1889 then 'Blues'
when 1890..1909 then 'Ragtime'
else 'Jazz'
end

result = if some_cond
  calc_something
else
  calc_something_else
end

# 良い例
kind =
  case year
  when 1850..1889 then 'Blues'
  when 1890..1909 then 'Ragtime'
  else 'Jazz'
  end

result =
  if some_cond
    calc_something
  else
    calc_something_else
  end

メソッド定義式の間には空行をいれ、 メソッド同士は論理的なかたまりに分ける

def some_method
  data = initialize(options)

  data.manipulate!

  data.result
end

def some_method
  result
end

アクセス修飾子の前後には空行を入れる

# 悪い例
class Foo
  attr_reader :foo
  def foo
    # do something...
  end
end

# 良い例
class Foo
  attr_reader :foo

  def foo
    # do something...
  end
end

メソッド、クラス、モジュール、ブロックの本文の前後には、空行を入れない

# 良い例
class Foo
  def foo
    begin
      do_something do
        something
      end
    rescue
      something
    end
  end
end

メソッド呼び出しの最後の引数の後ろのコンマは不要

# 悪い例
some_method(size, count, color, )

# 良い例
some_method(size, count, color)

メソッドの引数に初期値を割り当てるとき、 =演算子の前後にはスペースを入れる

# 悪い例
def some_method(arg1=:default, arg2=nil, arg3=[])
  # do something...
end

# 良い例
def some_method(arg1 = :default, arg2 = nil, arg3 = [])
  # do something...
end

複数行のメソッドチェーンにおけるドット(.)の位置は統一する

Rubyコミュニティでは次のどちらも良いとされていますが、どちらかの方法で統一すべきです。

one.two.three.
  four

one.two.three
  .four

メソッド呼び出しが複数行に及ぶときは引数を揃える

# 悪い例 (インデントが倍)
def send_mail(source)
  Mailer.deliver(
      to: '[email protected]',
      from: '[email protected]',
      subject: 'Important message',
      body: source.text)
end

# 良い例
def send_mail(source)
  Mailer.deliver(to: '[email protected]',
                 from: '[email protected]',
                 subject: 'Important message',
                 body: source.text)
end

# 良い例
def send_mail(source)
  Mailer.deliver(
    to: '[email protected]',
    from: '[email protected]',
    subject: 'Important message',
    body: source.text
  )
end

複数行になる配列は要素を揃える

# 悪い例
menu_item = %w[Spam Spam Spam Spam Spam Spam Spam Spam
  Baked beans Spam Spam Spam Spam Spam]

# 良い例
menu_item = %w[
  Spam Spam Spam Spam Spam Spam Spam Spam
  Baked beans Spam Spam Spam Spam Spam
]

大きな数値にはアンダースコアを付ける

1_000のようにすると可動性が上がります。アンダーバーを付けても数値1000として扱われます。

# 悪い例
num = 1000000

# 良い例
num = 1_000_000

その他の注意点

  • 1行は80字までにする
  • 行末のスペースは避ける
  • ファイルの終端には改行を入れる
  • ブロックコメントは使わない
# 悪い例
=begin
comment line
another comment line
=end

# 良い例
# comment line
# another comment line

 

以上、The Ruby Style Guide レイアウト編でした。

Rubyの記述方法として一般的なものばかりなので、このルールに従えば他の人からも読みやすいコードになるはずです。