理系学生日記

おまえはいつまで学生気分なのか

PoEAA: Row Data Gateway

Row Data Gateway は、DB 上の 1 レコードに対する Gateway として働くオブジェクトです。 1 レコードに対する DB アクセスをカプセル化して、他のレイヤに対して DB アクセスを隠蔽します。 先日の Table Data Gateway がテーブルに対する Gateway だったのとは粒度が異なる形です。

Table Data Gateway もそうですが、DB アクセスが他のレイヤから隠蔽されるため、この Gateway を差し替えることで他のレイヤのテストを DB 非依存にできる、DBMS ロックインされにくくなる、といったメリットがあります。 DB アクセスロジックを含む反面、業務ロジックは含まれません。それを含んだ Row Data Gateway は、もはや Row Data Gateway ではなく、Active Record と呼ばれるパターンになります。

Finder

Row Data Gateway は 1 レコードを表すオブジェクトなので、自分自身を DB に反映する insert/update/delete のロジックを内包するのですが、じゃぁ自分自身を返す(select) ロジックは誰が持つのか、ということを考える必要があります。 一般に、それを持つのは別オブジェクトで、Finder とか呼ばれたりします。Finder#find(id) だったり、Finder#findForCompany(company id) だったりが、Row Data Gateway のオブジェクトを返すっていう使われ方ですね。

作成方法

業務ロジックから見たときに DB 構造を抽象化するレイヤなので、Row Data Gateway のレイヤ自体を作成するときは DB を直接意識して記述する必要があります。 DB のスキーマが変化する中でその変化に人間が追随させるというのが無理であることは歴史が証明しているし実装と設計書が乖離することは残念ながら人類が関わり続ける以上は不可避であるので、スキーマ定義から自動生成させるべきだと思います。

参考