Re: 接客と委譲とオープンクラス

委譲とオープンクラスを接客で例示する, という話が【Ruby】接客と委譲(元は「接客と委譲とオープンクラス」だったかな)で書かれていてすごくいい例示だと思ったんだけど, なんかちょっと違うなーと思ったところがあったので書いてみる. 設定とかは本家を参照してほしい.

# チーフ
class Chief
  def initialize
    @info = { "トイレ" => "2F東3扉前", "喫煙所" => "1F西門外" }
  end

  def answer(target)
    puts "#{target}#{@info[target]}にございます。"
  end
end

# 日雇いバイト
class PartTimer
  def initialize(chief)
    @chief = chief
  end
end

# チーフのヤマダさん
yamada = Chief.new
# 日雇いバイトのタナカさん。担当チーフはヤマダさん
tanaka = PartTimer.new(yamada)

# お客さんにトイレの場所を質問されたヤマダさん
# 答えようとするのですが、教えられて(定義されて)ないのでパニックになります
tanaka.answer('トイレ')
# => NoMethodError: undefined method `answer' for #<PartTimer:0x007fa67d23ea58>

# ヤマダさん「タナカさん、分からなかったらお客さんにちょっと待っていただいて、私に聞いてください」
# タナカさんは、自分では解決出来ないときの対処法を教えられます
# 既存のクラスを拡張(オープンクラス)
class PartTimer
  def method_missing(name, *args)
    puts "少々お待ちください、ただいま分かる者に確認いたします…"
    @chief. __send__ name, *args
  end
end

# 今度は喫煙所の場所を聞かれたヤマダさん
# 自分では分からないのでチーフに確認し、その答えをお客さんに伝えます。
tanaka.answer('喫煙所')
# 少々お待ちください、ただいま分かる者に確認いたします…
# 喫煙所は1F西門外にございます。

# めでたしめでたし

ポイント

  • 一度定義したクラスに、オープンクラスによって新たなメソッドを定義している
  • method_missingの中でchiefに処理を委譲している