委譲とオープンクラスを接客で例示する, という話が【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に処理を委譲している