Railsっぽいコードの書き方

ゆるーい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と呼ぶらしいですね