ゆーたんのつぶやき

株式会社ノークリサーチにてIT関連のシニアアナリストとして活動しています。

Rubyのmixinは便利



AOPが取り上げられることが多くなるにつれ「横断的関心事」への注目が再度
集まりつつあるように感じます。多重継承を許す言語の場合には複数のクラス
に共通して持たせたい性質を一つのクラスとしてまとめ、それを各クラスが継
承するというパターンを取ります。ですが、多重継承は往々にして継承ツリー
が複雑になってしまうため、最近はあまり良い手法とはされていないようです。


Javaも多重継承を許さない言語の一つで、複数のクラスに共通した性質を表現
したい場合にはインターフェースを使います。ただし、インターフェースはあ
くまで「仕様」を表現するもので、実際の処理内容である「実装」とは別のも
のです。実装も含めて、複数のクラスに共通の性質を手軽に持たせたいといっ
た場合にはインターフェースはベストの手法ともいえない感じがします。


そうした背景もあって昨今AOPが注目されているわけですが、一方でそうした
ニーズを容易に満たせる機能を既に持っている言語もあります。日本発の言語
ということでは近年では最も知名度が高いであろうRubyでは「mixin」という
仕組みを持っています。Rubyではクラスとは異なる「モジュール」というもの
を作成することができます。モジュールはインスタンス化ができない、継承は
できないといった点でクラスと異なっています。端的に言えばライブラリのよ
うなものを作成するためのものです。モジュールは単にライブラリ的に利用す
ることもできますが、モジュールの機能をあるクラスの機能として混入させて
しまうことができます。この「混入」がmixinと呼ばれる所以です。例えば、
オブジェクトのコレクションを順に取り出すイテレータである「each」メソッ
ドを持つようなクラスに対して「Enumerable」(列挙可能)というモジュール
をmixinするとソートが可能になったりします。


AOPというと身構えてしまいがちですが、モジュールのmixinというこの概念
は誰にでも受け入れやすいシンプルで実用的なものではないかと思います。
さらにモジュールは継承不可と割り切ってしまうことで、本流のクラス階層
ツリー以外の枝葉ができてしまうことを極力避けている点も良く考えられて
いる体系だと感じます。


JavaC#にもmixin的な概念が取り入れられると嬉しいですね。