次のような、何やらジゴクめいた数の内部変数を持ったクラスメソッドがあったとします。
class Hoge def set_unit_price(val, power, speed, mp) special_param = power * speed * val magic_param = mp * speed * 13 if val > 10 unit_price = special_param * magic_param else unit_price = 10 return unit_price * 17 end end
こういう時は、メソッドの内部をクラスとして独立させると変更やら何やらが楽になるケースがあります。
class Hoge def set_unit_price(val, power, speed, mp) UnitPrice.new(val, power, speed, mp).set end class UnitPrice def initialize(val, power, speed, mp) @val = val @power = power @speed = speed @mp = mp end def set special_param = @power * @speed * @val magic_param = @mp * @speed * 13 if @val > 10 unit_price = special_param * magic_param else unit_price = 10 end return unit_price * 17 end end end puts Hoge.new.set_unit_price(1,2,3,4)
と、長くはなりましたが責任範囲を切り離す事ができました。
後はリファクタリング自在なので
class UnitPrice def initialize(val, power, speed, mp) @val = val @power = power @speed = speed @mp = mp end def set special_param = @power * @speed * @val magic_param = @mp * @speed * 13 return base_unit_price(special_param,magic_param) * 17 end end private def base_unit_price(sp_p, mp_p) (@val > 10) ? (sp_p * mp_p) : 10 end
といった感じで影響範囲を最小限にしつつリファクタリングをする事ができます。
今回程度の複雑さでは旨味がイマイチ見えませんが、数が増えれば増えるほど効力を発揮します。
微妙に似たメソッドの共通化にも有効です。