Home of: [工房 "藤車"] > [SourceForge.net における 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

通常の設計

状態を持たないことに基づいたスレッドセーフ性は、 性能的に優れている (排他制御に基づいたスレッドセーフ性はコストが高くつきます)ため、 複数のスレッドでインスタンスを共有できるように、 状態を持たないクラス設計をすることは自然なことです。

状態を持たないオブジェクトに文脈依存な挙動を行わせたい場合、 文脈情報ないしそれを格納したものを、 メソッド起動時に指定しなければなりません。

PageMixer における判断

ConsumerContext に対して、 自分自身の文脈依存情報を格納することで、 Filter が状態を持たないようにすることは可能です。

しかし、 "Consumer#consume" メソッドの起動に関する判断から、 メソッド起動の回数が極めて多くなる (例えば Filter ごとにページあたり 500 回以上)ことから、 一回あたりのコストは左程無くても、 ConsumerContext から文脈依存情報を取り出すコストは、 ある程度の数の Filter を生成するより高くつきます。

そのため、 PageMixser フレームワークでは、 状態を持つように Filter を設計しました。