はじめに
『リファクタリング:Rubyエディション』という本を読んでます。
業務でよく出てくる&すぐ使えるのについ自分が忘れてしまいがちな書き方を備忘録としてまとめます。
第6章と第9章で紹介されていた内容です。
ループからコレクションクロージャメソッドへ
配列から特定の条件を満たす値を抽出する際は、each
メソッドでループを回さずselect
やreject
といったメソッドを使うことで、よりシンプルに記述できます。
いくつかのサンプルをまとめます。
配列から奇数だけを抽出する
before
irb(main):001> odd = []
=> []
irb(main):002> [1,2,3,4,5,6,7,8,9].each { |i| odd << i if i % 2 != 0 }
=> [1, 2, 3, 4, 5, 6, 7, 8, 9]
irb(main):003> odd
=> [1, 3, 5, 7, 9]
これはselect
メソッドを使えばよりシンプルに記述できます。
after
irb(main):001> odd = [1,2,3,4,5,6,7,8,9].select { |i| i % 2 != 0 }
=> [1, 3, 5, 7, 9]
irb(main):002> odd
=> [1, 3, 5, 7, 9]
配列から3の倍数ではない値だけを抽出する
before
irb(main):001> non_multiple_of_three = []
=> []
irb(main):002> [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15].each { |i| non_multiple_of_three << i if i % 3 != 0 }
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
irb(main):003> non_multiple_of_three
=> [1, 2, 4, 5, 7, 8, 10, 11, 13, 14]
これはreject
メソッドを使えばよりシンプルに記述可能です。
after
irb(main):001> non_multiple_of_three = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15].reject { |i| i % 3 == 0 }
=> [1, 2, 4, 5, 7, 8, 10, 11, 13, 14]
irb(main):002> non_multiple_of_three
=> [1, 2, 4, 5, 7, 8, 10, 11, 13, 14]
条件分岐の組み替え
OR演算子を用いることでより簡潔かつRubyらしく記述できます。
before
irb(main):001* def greeting(name)
irb(main):002* if name
irb(main):003* "Hello, #{name}!"
irb(main):004* else
irb(main):005* "Hello, guest!"
irb(main):006* end
irb(main):007> end
=> :greeting
irb(main):008> greeting("Taro")
=> "Hello, Taro!"
irb(main):009> greeting
=> "Hello, guest!"
OR演算子を用いることで条件分岐をシンプルに書けます。
after
irb(main):001* def greeting(name)
irb(main):002* name = name || "guest" # OR演算子を活用
irb(main):003* "Hello, #{name}"
irb(main):004> end
=> :greeting
irb(main):005> greeting("Taro")
=> "Hello, Taro"
irb(main):006> greeting
=> "Hello, guest"
おわりに
『リファクタリング:Rubyエディション』にはこの他にもたくさんのリファクタリング手法が出てきます。
Rubyらしい書き方についても理解が深まります。
どれも「必ずそう書くべき」というものではなく、時と場合によって柔軟な判断が求められるように思いました。
業務や学習の中で役に立ったリファクタリング手法があったら、適宜アウトプットしていきます。
参考資料