第10章 オブジェクトに代理を立てる: Proxy part2
Ruby
Published: 2019-06-27

「Rubyによるデザインパターン」の読書メモです。

Proxy で重複を取り除いたパターン

test.rb

class BankAccount
  attr_reader :balance

  def initialize(starting_balance=0)
    @balance = starting_balance
  end

  def deposit(amount)
    @balance += amount
  end

  def withdraw(amount)
    @balance -= amount
  end
end

class AccountProxy
  def initialize(real_account)
    @subject = real_account
  end

  def method_missing(name, *args)
    p "Delegating #{name} message to subject."
    @subject.send(name, *args)
  end
end

ap = AccountProxy.new(BankAccount.new(100))
ap.deposit(25)
ap.withdraw(50)
p ap.balance

出力結果

$ ruby test.rb
"Delegating deposit message to subject."
"Delegating withdraw message to subject."
"Delegating balance message to subject."
75

method_missing をオーバーライドして、委譲メソッドを別々に定義しなくても良くなりました。

Proxy パターンの注意

method_missingの使いすぎは、継承の使いすぎと同様、あなたのコードをわかりにくくしてしまう代表的な原因になるということです。

次に来る実装者には、実装により意図が伝わるようにしてください。