今日の PoEAA は、Active Record。
全体感としては、Chapter 10. Data Source Architectual Patterns の中の 1 節で、いわゆるパーシステント層の 1 パターンに該当します。Acitve Record
Active Record といえば Ruby On Rails (RoR) ですが、RoR の Active Record は今よんでいる PoEAA の Active Record パターンを適用したものになります。 ぼくは RoR については門外漢(研修でさわったくらい) なので語る言葉を持ちませんが、RoR の Active Record と PoEAA の Active Record の内容にあまり差異はないように見受けられました。
Active Record の概要をまとめると以下のようになります。
- DB のテーブルあるいはビューの 1 レコードを表現するオブジェクトである
- DB アクセスとともに、オブジェクトが表現するデータに対するドメインロジックを含む
先日の http://kiririmode.hatenablog.jp/entry/20161119/1479539592:tilte と良く似ているパターンですが、Active Record はドメインロジックを含むという点が大きな違いです。
個人的感想
Active Record で言うドメインロジックの範囲をどこまで絞るかが開発上のポイントなのかと思っています。 オブジェクトが表現するデータのバリデーションだったり型変換くらいであれば「アリ」かなーと思うのですが、他のオブジェクトとのコミュニケーション/インタラクションまでを Active Record に持たせると、もはやパーシステント層とは何なのか、みたいな部分が出てきて開発が混乱しそうな気配があります。
また、テスト戦略はどうすべきなのかは悩みどころ(ただし決めの問題?)で、DB とは密結合する層のパターンであるので、DB 依存のテストを実施するのか、それともその DB 依存のテストは実施しつつも最小限に留める(バリデーションとかは DB 非依存にする) のか、それとも DB 非依存にするのかっていうところの見地などを聞いてみたいところです。