モジュールの特異メソッドをincludeして使う(修正)
以前の記事が恐ろしく分かりにくいので、軽くまとめ直す。
module A def instance_method_of_a puts "A#instance_method_of_a was called." end module ClassMethods # A::ClassMethodsで定義されたインスタンスメソッドは、 # Aをincludeしたクラスのクラスメソッドとして利用できる def class_method_of_a puts "A::ClassMethods.class_method_of_a was called. Not A.a_class_method!" end end def self.included(mod) # ModuleのインスタンスmodがAをincludeした際に呼び出され、 # A::ClassMethodsのインスタンスメソッドをmodに特異メソッドとして追加する。 mod.extend ClassMethods end end class B include A end
使ってみると、
B.class_method_of_a # A::ClassMethods.class_method_of_a was called. Not A.class_method_of_a! b = B.new b.instance_method_of_a # A#instance_method_of_a was called.
これを上手く使って機能ごとにモジュールで名前空間を設定し、かつファイルも分割できれば開発しやすいだろうなぁと思う。Railsがまさにそんな感じ。その代わり管理が大変だけど。