PoEAA ch13 Query Object
Query Object
An object that represents a database query.
- SQLを直接使うと生じる問題:
- 用途特化のfinderメソッドでカプセル化することで回避できる
- 新たな問題
- GoFのInterpreterパターン
- SQLを構築するInterpreter
How It Works
- InterpreterパターンのSQL向け応用
- Query Objectは最初から作り込まずスモールスタートにせよ
- Query Objectの役割
- バリエーション: ドメインオブジェクトを例示して問い合わせる
- 名前が
Fowler
、他のフィールドがnullのオブジェクトを渡す - 名前が
Fowler
な全オブジェクトが返ってくる - 限界: 複雑な問い合わせはできない
- 名前が
When to Use It
- たいへん複雑で高度なパターンなので、使われないケース多し
- Domain ModelとData Mapper利用時に使う
- 【補】Data Mapperに特定用途のfinderメソッドが乱立するのを防ぐ
- Metadata Mappingも一緒に使う
- Query Objectパターンのアドバンテージ
- 作らずに買うという選択肢
Further Reading
- Query Object [Alpert et al.]
- Specification pattern [Evans and Fowler], [Evans]
コード例
- 略
- コード例を一部改変して起こしたクラス図
- 【補】流れ
- ドメインオブジェクトのクラス名を渡してQueryObject構築
- QueryObjectにCriteriaを追加してクエリを構築していく
- QueryObjectのexecuteメソッドにUnitOfWorkを渡して実行
- 【所感】LaravelのDBやEloquentのBuilderは近くて遠い感じ
英語
- be geared to
- 〜向けに作られている