容疑者

  • Use a guard clause instead of wrapping the code inside a conditional expression.

たのもう

以下のようなサンプルコードがあるとする。

def foobar(foo = nil)
  if foo.nil?
    return 'foo'
  else
    return 'bar'
  end
end

puts foobar(ARGV[0])

一応、以下のように動く。

$ bundle exec ruby test.rb
foo
$ bundle exec ruby test.rb a
bar

Rubocop の手に掛かると…

$ bundle exec rubocop test.rb
Inspecting 1 file
C

Offenses:

test.rb:2:3: C: Use a guard clause instead of wrapping the code inside a conditional expression.
  if foo.nil?
  ^^
test.rb:3:5: C: Redundant return detected.
    return 'foo'
    ^^^^^^
test.rb:5:5: C: Redundant return detected.
    return 'bar'
    ^^^^^^

1 file inspected, 3 offenses detected

無期懲役。

一本

何が問題か

Use a guard clause instead of wrapping the code inside a conditional expression.

条件分岐のネストが深くなるのはいかんざき。guard clause を利用しましょうとのこと。後は return が冗長とのこと。

リファクタリング

冒頭のウンコードは以下のようにリファクタリング出来る。

def foobar(foo = nil)
  return 'foo' if foo.nil?
  'bar'
end

puts foobar(ARGV[0])

Rubocop も以下のように無事釈放。

$ bundle exec rubocop test.rb
Inspecting 1 file
.

1 file inspected, no offenses detected

ありがとうございました!

条件分岐のネストは要注意です。

元記事はこちら

小ネタ道場一本勝負 〜 rubocop で俺のウンコードをリファクタするぞ(Guard clause 取締法違反) 〜