容疑者
- 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
ありがとうございました!
- https://techracho.bpsinc.jp/hachi8833/2016_10_11/26950
- https://gist.github.com/hiroshiro/95632194ab2b408d34b7
- http://d.hatena.ne.jp/asakichy/20091211/1260492230
条件分岐のネストは要注意です。
元記事はこちら
「小ネタ道場一本勝負 〜 rubocop で俺のウンコードをリファクタするぞ(Guard clause 取締法違反) 〜」