Webuilder240

SimpleDelegatorでSimpleなDecoratorを作る

2018-11-10 08:14:36 +0900

Ruby
そういえば、 ModelであんまりViewに関わるロジックを使わないほうがきれいにコード書けていいですよ~みたいな話をしたのですが、 その時に標準ライブラリにあるSimpleDelegatorを使うといいですよねなんて話をしたのですが使い方を復習するなどしていました。

SimpleDelegatorってなんだっけ…

るびまによると…
オブジェクトの機能を再利用する手法の一つとして、Ruby では言語仕様としてクラスの継承とモジュールの Mix-in を提供しています。これらは、元になるクラスやモジュールの実装までもをそのまま取り込んでしまいますが、他の手段で機能の再利用を実現する手法として、委譲があります。委譲では、再利用したい機能を自分に取り込むのではなく、その機能を持つオブジェクトに処理を依頼します。Ruby では特に言語仕様として委譲がサポートされているわけではありませんが、委譲を実現するためのライブラリとして forwardable と delegate が用意されています。具体的には、これらのライブラリを使用することによって、あるメソッド呼び出しを他のオブジェクトのメソッドにたらい回すということを簡単に記述することができます。
という感じです。 普通だと委譲を実現するのにいちいちメソッドを定義しないと行けないのですが、 SimpleDelegatorを使うと追加したいメソッドだけを追加するだけでいいので便利。
標準添付ライブラリ紹介 【第 6 回】 委譲

SimpleDelegatorで作ったSimpleなDecorator

# 委譲させたいClass
class User
  attr_reader :firstname, :lastname
  def initialize(firstname:, lastname:)
    @firstname = firstname
    @lastname = lastname
  end
end

# Decorator
class UserDecorator < SimpleDelegator
  def fullname
    "#{firstname} #{lastname}"
  end
end

user = User.new(firstname: "西尾", lastname: "拓也")
u = UserDecorator.new(user)
p u.fullname

そんな感じで委譲でよく使われる鉄板用途としてDecoratorパターンがありますが、それをSimpleDelegatorで作ってみた例になります。
12. Decorator パターン | TECHSCORE(テックスコア)
これの使い道としては、自前で簡単にViewロジックを実装するような、いわゆるHelperやDecoratorが欲しい時、 ActiveRecordに依存しないようなDecoratorがほしいときはこれでサクッと作ってしまうのがいい。 もし、ActiveRecordに依存するDecoratorならActiveDecoratorを使うのでもいいのではないでしょうか。

まとめ

  • 標準ライブラリ便利なので、他にもこういった便利ライブラリがあるのでどしどし使っていきたい。

関連しそうなブログ