Simple Delegation
呼び出し元に依存しない委譲を行いたい場合は、メッセージをそのまま委譲しましょう。
委譲先のオブジェクトが十分に独立していて、委譲元から付加的な情報を貰わなくても自身の仕事を行える場合は、Forwardableによりメッセージをそのまま委譲しましょう。
以下に、Collection Accessor Methodで示したコードに、コレクションを操作するためのいくつかの基本的な操作の委譲を追加した例を示します。
require 'forwardable' class Department extend Forwardable def initialize @employee = [] end def employs(employee) @employee.push(employee) end ... def_delegators :@employee, :each, :size, :to_a, :sort end general_affairs = Department.new general_affairs.employs("foo") general_affairs.employs("bar") general_affairs.size # => 2 general_affairs.each do |employee| puts employee end general_affairs.to_a # => ["foo", "bar"] general_affairs.sort # => ["bar", "foo"]
Forwardableモジュールをextendし、def_delegatorsを使うことで、@employeeへの処理の委譲を実現しています。このようにForwardableを利用することで、必要な操作のみ委譲することが出来ます。