ゆるーいRubyネタ
ActiveRecord の belongs_to :hoge みたいな宣言的なコーディングって何かカッコイイすよね。あんな感じでクラスで何か宣言するコードが書けるとRubyコーディングがもっと楽しくなるんじゃない?
とか思ったので、ためしに produces で宣言したクラスのインスタンスを生成するファクトリクラス、というコードを書いてみた。
# ファクトリに生成されるクラス class Hoge def to_s; "Hogeのインスタンス"; end end class Fuga def to_s; "Fugaのインスタンス"; end end # ファクトリクラス class HogeFactory < Factory produces Hoge end class FugaFactory < Factory produces Fuga end # インスタンスを生成してみる p HogeFactory.new.create #=> "Hogeのインスタンス" p FugaFactory.new.create #=> "Fugaのインスタンス"
継承元の Factory クラスが何者かというと
module FactoryDefiner def produces klass @product_class = klass end def get_product_class @product_class end end class Factory extend FactoryDefiner # FactoryDefinerのメソッドをクラスメソッドとして追加する def create self.class.get_product_class.new end end
produces という謎の宣言は単なる Factory のクラスメソッドなのでした。
ActiveRecord の belongs_to とか ActionController の before_filter みたいな宣言っぽいコードは、クラスメソッドを呼んでいるだけなんですねー、たぶん。
最近では、こういう宣言的な記述を可能にするプログラミングをメタプログラミングと呼んだり、定型的で複雑な処理を、メタプログラミングを駆使して簡単な記述で可能にしたものを、DSLと呼ぶらしいですね