Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

内部変数の数がジゴクめいたものになる場合、専用のクラスを設計して振り分けた方が幸せになれるかもしれない

次のような、何やらジゴクめいた数の内部変数を持ったクラスメソッドがあったとします。

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

といった感じで影響範囲を最小限にしつつリファクタリングをする事ができます。
今回程度の複雑さでは旨味がイマイチ見えませんが、数が増えれば増えるほど効力を発揮します。
微妙に似たメソッドの共通化にも有効です。