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を利用することで、必要な操作のみ委譲することが出来ます。