[デザインパターン/永続化]
QUERY ITERATOR
平澤 章、志村 亮一
Ver 0.1
- 1999/3/11
Ver 0.2 - 2000/1/29
1 目的
永続記憶から特定の条件に合致する複数のオブジェクトを取り出す際に、内部構造を意識させない抽象的なインタフェースを提供する。
2 別名
3 動機
永続記憶に格納されたオブジェクトに対して、何らかの条件に合致するオブジェクトだけを取り出すケースは多い。このようなクエリー処理では、対象となるオブジェクトの件数が多い場合、非常に多くのオブジェクトが一度に生成される必要がある。これをそのまま実装してしまうと、レスポンスタイムの悪化や、メモリリソースの急激な圧迫といった問題が起きてしまう。
また検索の結果を保持するオブジェクトは、一般的にミドルウェアやDBMSを提供するベンダーから用意されるため、製品毎に異なるインタフェースを持っている。ミドルウェアやDBMSを入れ替えてもアプリケーション全体に影響が出ないようにするためには、このような特定の製品に依存しないインタフェースにしておく必要がある。
4 適用可能性
次のような場合にQUERY ITERATORパターンが適用できる。
- 条件検索などで複数のオブジェクトを呼び出す場合に、クライアントアプリケーションに対してオブジェクトが格納されている特定の製品や記憶媒体の仕様を意識させたくない。
- レスポンスタイムの悪化やメモリリソースの圧迫を回避するため、大量検索の場合に、条件に該当するオブジェクトを一斉に生成しないようにしたい。
5 構造

6 構成要素
- DomainFinder
Domainオブジェクトを条件検索するオペレーションを定義する。
- Domain
クライアントに業務処理サービスを提供するオブジェクト。クライアントからの検索要求により、永続記憶から復元される対象となる。
- Persister
永続記憶からの検索要求を実行する。
Constructableインタフェースを実装し、Domainオブジェクトの実際の復元処理を行う。
- Constructable
永続記憶からの読み込み結果(RecordSetオブジェクト)をもとにDomainオブジェクトを生成し、属性情報をセットするオペレーションを定義する。
- RecordSet
永続記憶の検索結果を保持するオブジェクト。通常は、JDBCやODBCなどのミドルウェアやORACLEのようなDBMS製品により提供され、それぞれ固有のインタフェースを持つ。
- Iterator
繰り返し制御のためのインタフェースを定義する。
- QueryIterator
Iteratorインタフェースを実装する。
クライアントからの要求に応じて、ドメインオブジェクトの復元をPersisterオブジェクトに対して指示する。
- Client
Finderに対してクエリーの実行を指示し、その結果として返されたDomainオブジェクトを利用して業務処理を実行する。
7 協調関係

8 結果
クライアントに対しては、ドメインオブジェクトがリレーショナルデータベースから復元されることは全く透過となる。
ドメインオブジェクトは、クライアントからのIteratorに対するNext()/Get()オペレーションの実行に合わせて逐次復元されるため、検索対象とするドメインオブジェクトが多数の場合でも、メモリリソースを一気に圧迫することがない。
9 実装
- JOINによる複数Domainオブジェクトの一括ロード
クエリーによる条件検索は、取引一覧の表示や、帳票出力などのために使われることが多い。このような場合、1種類のDomainオブジェクトを読み込むのでは不十分で、複数種類のDomainオブジェクトの情報をまとめて表示・印刷する必要があることがしばしばある。
(例:取引一覧に顧客名や所在地を合わせて表示するケースなど。)
しかしその場合に、個々のDomainオブジェクトごとに別々のクエリーを発行して、メモリに展開されているオブジェクト上でマージしようとすると、レスポンスタイムやメモリ負荷など、実行効率に大きな負荷がかかってしまう。
これを回避するために、Persisterオブジェクトで、複数のテーブルに対するクエリーをまとめて発行する方法が考えられる。
これにより1つのPersisterオブジェクトが1つのテーブルの永続処理に責任を持つという原則が崩れるが、それ自体は実行効率とのトレードオフであり、その場合でも、Domainオブジェクトはこのような永続処理(=この場合は、JOINを使ったSQLで復元されたこと)からは独立させておくことで、アプリケーション全体がDB構造に強く依存する状況を回避することができる。

10 サンプルコード
省略
11 使用例
某社会計システム
某社在庫&販売管理システム
12 関連するパターン
- PERSISTER
ドメインオブジェクトの登録、更新、削除、及び1件検索のためには、PERSISTERパターンが使用できる。
13 参考文献