Rubyのクラスは多重継承ができない。そういう限界を解決できるようにしてくれるのがMix-in
という開発パタン。
モジュールを通して複数の機能を追加することができる。
インスタンスメソッドの場合
基本的にincludeするとモジュールのメソッドをインスタンスメソッドとして使用できる。
1 2 3 4 5 6 7 8 9 10 11 |
|
クラスメソッドの場合
モジュールのメソッドをクラスメソッドとして使用するためには
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
クラスでインクルードされたらself.included(base)
にコールバックされる。ここで引数に渡されるのはインクルードしたクラスになる。そこにモジュールをextendしたらクラスメソッドとしても使用できる。
concernsの使い方
concernsはActiveSupport::Concern
をextendするだけでmix-inの複雑な記述を省略できる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
concernsのメリット
複雑な依存関係を考えなくても良い。Foo
をextendするBar
をHogeクラスでextendするとしたら
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
|
こういうふうに簡単にできる。
終わり
- モジュールをインクルードすることでモジュールのメソッドをインスタンスメソッドとして使用できる
- includedメソッドを使ってextendさせたらインスタンスメソッドを使いながらクラスメソッドも使用できる
- concernsを使ったらもっと簡単に
mix-in
ができる - concernsで複雑な依存関係をさらに簡単にまとめられる
参考
Rails: includeされた時にクラスメソッドとインスタンスメソッドを同時に追加する頻出パターン
Rails 4.2からはmodule ClassMethodsではなくConcern#class_methodsを使おう
[Rails] ActiveSupport::Concern の存在理由