メタプログラミングRuby 第7章 ActiveRecord の設計 その2

今日は ActiveRecord::Base で使われているメタプログラミングの実際について。

  • autoload で require を遅延
  • Validations の included でサブモジュールを追加 include させる
  • クラス拡張ミックスインで ActiveRecord::Base の特異クラスに Validations などを include している
    • やっぱりこの「クラス拡張ミックスイン」はクラスに extend するほうがいいような気がするんですよね。extend なら MonitorMixin の例のように Object#extended で mon_initialize を呼ぶような初期化処理もできますし、included と extended の処理を共通化することもできますしね。
    • まあでも一貫して include を使うというのが Rails の文化と言われればそれまでです
  • alias_method_chain
    • 「アラウンドエイリアス」を規約を元に自動化した「クラスマクロ」。これは「魔術を編む魔術」でとても強力ですね
  • 教訓3つ
    • Java から離れる。わたしは Java にそれほどどっぷりつかったことがないのですが、仕事で数百のメソッドや数十段の継承関係をもつクラスライブラリを見せられたことはあるので、そこがとんでもないというのだけはわかります。非力な環境だったからクラスファイルのロードだけで数分かかってたなぁ……
    • モジュールで考える - オブジェクトモデルの理解という意味かなぁと思いました
    • 自分のやりかたでやる
      • なるほど。わたしならクラス拡張ミックスインは extend を使います。そういう意味ではないかもしれませんが
      • 複数のメタプログラミングのテクニックを組み合わせて使うとより高度なことができるってことでしょうか

これで第7章は終わりです。第8章は「ActiveRecordの中身」?もうちょっと詳細を見ていくということでしょうか。楽しみです。