こんにちは。
最近 リファクタリング Rubyエディション を読みました。本書はリファクタリングの様々なパターンをRubyのサンプルコードを使って解説している名著です。
実務でも活かせそうなパターンが多くあったので、いいなと思ったパターンを1つずつブログにまとめています。
今回はその第7弾で「サンドイッチメソッドの抽出」についてまとめました。
オリジナルの Ruby のサンプルコードを使って説明しています。
第6弾の「コンストラクタからファクトリメソッドへ」のまとめはこちらです。
コンストラクタからファクトリメソッドへ【リファクタリング Rubyエディションまとめ6】 - 銀行員からのRailsエンジニア
サンドイッチメソッドの抽出 とは
使えるタイミング
ほとんど内容が同じメソッドが複数あり、違いがメソッドの途中(最初や最後ではない)にある場合に有効なリファクタリングです。
サンプルコード
リファクタリング前
まずはリファクタリング前のコードです。
class Person def sunny_day_activities puts 'work from home' puts 'running' # 晴れの日はランニングする puts 'play games' end def rain_day_activities puts 'work from home' puts 'taking a nap' # 雨の日は外に出たくないので昼寝する puts 'play games' end end
かなりシンプルなクラスですね。
次のように実行すると
person1 = Person.new
person1.sunny_day_activities
person1.rain_day_activities
次の結果になります。
work from home running play games work from home taking a nap play games
sunny_day_activities メソッドと、rain_day_activities メソッドは、それぞれの 2つ目の puts 以外ほとんど同じなので共通化したいですね。
リファクタリング後
「サンドイッチメソッドの抽出」を使ってリファクタリングをすると下記のようになります。
class Person def activities puts 'work from home' yield puts 'play games' end end
次のように実行すると、先ほどと実行結果は同じになります。
person2 = Person.new person2.activities { puts 'running' } person2.activities { puts 'taking a nap' }
差異のある部分をブロックで渡し、yield でブロックを実行しています。
いい感じに共通化できましたね。
おわりに
ここまでお読みいただきありがとうございます。
リファクタリング Rubyエディションでは、このブログよりもリアルのコードで解説しており分かりやすかったので、ご興味ある方は是非ご覧ください。
- 作者:ジェイ・フィールズ,シェーン・ハービー,マーティン・ファウラー
- 発売日: 2020/03/21
- メディア: 単行本
次回はまた違うパターンをまとめていきます!
(追記)
第8弾として「抽象スーパークラスからモジュールへ」についてまとめました。
是非合わせてご覧ください。
ysk-pro.hatenablog.com