MAP | PageMixer ドキュメント > 設計ノート > 状態を持った Filter |
本節では、
Filter
を状態を持つオブジェクトとして設計した理由に関して説明します。
本ドキュメントでは、 クラスは全てクラス名のみで表記されています。 完全な名称は以下の通りです。
表記 | 完全名 |
---|---|
Filter | jp.ne.dti.lares.foozy.pagemixer.mixer.Filter |
Consumer | jp.ne.dti.lares.foozy.pagemixer.mixer.Consumer |
ConsumerContext | jp.ne.dti.lares.foozy.pagemixer.mixer.ConsumerContext |
状態を持たないことに基づいたスレッドセーフ性は、 性能的に優れている (排他制御に基づいたスレッドセーフ性はコストが高くつきます)ため、 複数のスレッドでインスタンスを共有できるように、 状態を持たないクラス設計をすることは自然なことです。
状態を持たないオブジェクトに文脈依存な挙動を行わせたい場合、 文脈情報ないしそれを格納したものを、 メソッド起動時に指定しなければなりません。
ConsumerContext
に対して、
自分自身の文脈依存情報を格納することで、
Filter
が状態を持たないようにすることは可能です。
しかし、
"Consumer#consume
" メソッドの起動に関する判断から、
メソッド起動の回数が極めて多くなる
(例えば Filter
ごとにページあたり
500 回以上)ことから、
一回あたりのコストは左程無くても、
ConsumerContext
から文脈依存情報を取り出すコストは、
ある程度の数の Filter
を生成するより高くつきます。
そのため、
PageMixser フレームワークでは、
状態を持つように Filter
を設計しました。
MAP | PageMixer ドキュメント > 設計ノート > 状態を持った Filter |