そういえば、 ModelであんまりViewに関わるロジックを使わないほうがきれいにコード書けていいですよ~みたいな話をしたのですが、 その時に標準ライブラリにあるSimpleDelegatorを使うといいですよねなんて話をしたのですが使い方を復習するなどしていました。
SimpleDelegatorってなんだっけ…
るびまによると…
オブジェクトの機能を再利用する手法の一つとして、Ruby では言語仕様としてクラスの継承とモジュールの Mix-in を提供しています。これらは、元になるクラスやモジュールの実装までもをそのまま取り込んでしまいますが、他の手段で機能の再利用を実現する手法として、委譲があります。委譲では、再利用したい機能を自分に取り込むのではなく、その機能を持つオブジェクトに処理を依頼します。Ruby では特に言語仕様として委譲がサポートされているわけではありませんが、委譲を実現するためのライブラリとして forwardable と delegate が用意されています。具体的には、これらのライブラリを使用することによって、あるメソッド呼び出しを他のオブジェクトのメソッドにたらい回すということを簡単に記述することができます。
という感じです。 普通だと委譲を実現するのにいちいちメソッドを定義しないと行けないのですが、 SimpleDelegatorを使うと追加したいメソッドだけを追加するだけでいいので便利。
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で作ってみた例になります。
これの使い道としては、自前で簡単にViewロジックを実装するような、いわゆるHelperやDecoratorが欲しい時、 ActiveRecordに依存しないようなDecoratorがほしいときはこれでサクッと作ってしまうのがいい。 もし、ActiveRecordに依存するDecoratorならActiveDecoratorを使うのでもいいのではないでしょうか。
まとめ
- 標準ライブラリ便利なので、他にもこういった便利ライブラリがあるのでどしどし使っていきたい。