Mixin

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

mixin とはオブジェクト指向プログラミング言語において、サブクラスによって継承されることにより機能を提供し、単体で動作することを意図しないクラスである。

概要[編集]

mixin からの継承は、特化の一形態ではなく、むしろ機能を他のクラスから集めるための手段である。あるクラスは多重継承により複数の mixin クラスから継承を行って、大半の機能を継承によって実現することができる。

mixinシンボリックス 社のオブジェクト指向システム Flavors英語版 で初めて登場し、LISP マシン で用いられたオブジェクト指向への試みであった。この名称は、マサチューセッツ州 Somerville にあったアイスクリーム屋[1]からヒントを得て考え出されたものであった[2]。このアイスクリーム店の店長は(バニラやチョコレートなどの)基本となる味を混ぜ、追加の具材(ナッツ、クッキー、キャンディなど)と組み合わせたものを提供し、それを Mix-In と呼んで店の登録商標としていた[3]

mixinコードの再利用を促進し、多重継承にまつわる良く知られた症状を避けることができる。しかし、 mixin にはそれなりの妥協も伴う。

mixin は、「メソッド付きのインターフェース」ということもできる。クラスが mixin を含む場合、そのインターフェースを実装したクラスは、mixin の属性と操作を取り込む。継承するというのとは異なっている。 取り込んだ要素はコンパイル時にクラスの一部となる。興味深いことに、 mixin はインターフェイスを実装する必要はない。それでもあえてインターフェイスを実装する利点は、そのインターフェイスを必要とするメソッドに、引数としてインスタンスを渡せるからである。

mixin では、属性とインスタンス化のパラメータをコンパイル時に決定させつつ、メソッドのバインディングを実行時まで遅延させることができる。これは Simula に始まるプログラム言語の、全ての属性とメソッドと初期化の方法をコンパイル時に決定する広く用いられるアプローチとは異なる。

定義と実装[編集]

Simula では、クラスは属性、操作、クラスの初期化が全て行われるブロック内で定義される。クラスで呼び出し可能な全てのメソッドは同時に定義され、クラスの定義は完全である。

mixin がある場合、クラスの定義では属性とクラスに関連したパラメータのみとなる。メソッドは別のところで定義され、FlavorsCLOS のように「総称関数」と呼ばれる。総称関数とはタイプの割り当てにより複数のケースで定義される関数である。

FlavorsCLOS 以外の mixin をサポートする言語:

ECMAScript のような言語では mixin を言語レベルではサポートしないが、実行時に別のオブジェクトからメソッドをコピーし、いわば mixin のメソッドを借りてくることにより簡単に模倣することができる。これは、オブジェクトの持つシグネチャが固定の静的に型付けされた言語では不可能である。

[編集]

Python では、SocketServer モジュールは UDP および TCP ソケットサーバとして動作する UDPServerTCPServer クラスの両方を備えている。通常、すべてのコネクションは同じプロセス内で処理されるが、ForkingMixInThreadingMixIn という追加の mixin クラスが存在する。下記のように TCPServer を ThreadingMixIn により拡張すると、

class ThreadingTCPServer(ThreadingMixIn, TCPServer):
  pass

ThreadingMixInTCPServer にコネクションごとにスレッドを生成する機能を追加する。あるいは、ForkingMixIn を用いると各新規のコネクションに対してプロセスが folk される。明らかに、スレッドを生成したりプロセスを fork する機能は単独では大して役に立たない。

この使用例では、mixin はソケットサーバとしての機能に影響することなく、基盤となる機能を選択可能な形で提供している。

[編集]

JavaC# などの一般的な言語では、mixin の機能の一部は、インタフェースにより提供される。しかし、インタフェースはクラスがサポートしなければならないものを指定するのみで、実装を提供しないため、有用なのはポリモーフィズムを提供するときだけである。クラスがインターフェイスに依存して実装されていたり、共通の振る舞いを一箇所にリファクタリングする場合には有効に利用できる。

インターフェイスをアスペクト指向プログラミングと組み合わせた場合 C#Java などの言語で完全な mixin の機能を提供できる。

関連項目[編集]

参考文献[編集]

  1. ^ Steve's Ice Cream Parlor
  2. ^ Using Mix-ins with Python
  3. ^ LISTSERV 14.4

外部リンク[編集]