実践ドメイン駆動設計 (Object Oriented Selection)
- 作者: ヴァーン・ヴァーノン,高木正弘
- 出版社/メーカー: 翔泳社
- 発売日: 2015/03/17
- メディア: 大型本
- この商品を含むブログ (2件) を見る
- 作者: ヴァーン・ヴァーノン
- 出版社/メーカー: 翔泳社
- 発売日: 2015/03/19
- メディア: Kindle版
- この商品を含むブログを見る
エリック・エヴァンスのドメイン駆動設計 (IT Architects’Archive ソフトウェア開発の実践)
- 作者: エリック・エヴァンス,今関剛,和智右桂,牧野祐子
- 出版社/メーカー: 翔泳社
- 発売日: 2011/04/09
- メディア: 大型本
- 購入: 19人 クリック: 1,360回
- この商品を含むブログ (130件) を見る
6.5 実装
- BusinessPriorityのサンプルは値が持つ全ての特徴を示すだけでなく、ストラテジとして使う方法も示している
- 例ではSerializeableインタフェースを実装
- リモートシステムとやりとりするときにや永続化にも役立つはず
- BusinessPriorityにはratingsの値のプロパティを持たせる
- 値オブジェクトに2つのコンストラクタ
6.6 値オブジェクトの永続化
- 方法はいろいろある
- 値単体のインスタンスを永続化するのは関心がないので、集約の状態も含めて永続化する方法に注目
- 値だから、インスタンスの違いは気にしなくていいという判断
- これ以降は親のエンティティが、永続化させる値のインスタンスへの参照を全て保持していることを前提
- リポジトリ経由で操作を行っているとする
- ORMによる永続化
- すべての属性をカラムにマッピングすると複雑になる
- NoSQLが人気だけど、ここではORMベースの永続化を取り上げる
- ドメインモデリング対データモデリングがはじまる……
データモデルが漏れることに寄る影響を排除する
- 値オブジェクトをデータストアに永続化する場合、殆どの場合非正規化状態で保存
- 通常はこれでいい(モデルとデータが一致しているということ?)
- 値オブジェクトを永続化ストアにエンティティとして格納しなければいけない場合
- データモデルでドメインモデルを曲げてはいけない
- インデックスの都合や主キーなど
ORMでの単一の値オブジェクトの扱い
- 単一の値オブジェクトを非正規化して、親のエンティティの行に組み込むのが基本
ORMでの、複数の値をシリアライズした単一カラムの扱い
- ListやSetで保持している値オブジェクトをシリアライズして、一つのカラムに持たせる
- データモデル的にはアンチパターンの様相
- カラムのサイズや問い合わせの条件の考慮が必要
- 問い合わせはできないよねこれ
- Hibernateだとカスタムユーザー型が必須
- 作者: Bill Karwin,和田卓人,和田省二,児島修
- 出版社/メーカー: オライリージャパン
- 発売日: 2013/01/26
- メディア: 大型本
- 購入: 9人 クリック: 698回
- この商品を含むブログ (41件) を見る
ORMでの、複数の値をデータベースのエンティティに格納する場合の扱い
- データモデルのエンティティとして値型を扱う
- 1対多の関係
- ドメインモデルとしてはエンティティではない、あくまで実装の都合
- データモデルからはエンティティとして扱うが、ドメインモデルでは違う
- 代理キーを隠蔽 => レイヤースーパータイプ
ORMでの、複数の値をテーブルの結合に格納する場合の扱い
- Hibernateには、コレクションを連結テーブルに格納する機能がある
- 値型そのものにはデータモデルのエンティティの特性を持たせる必要がない
- コレクション専用のテーブルに永続化
- 親エンティティの識別子を外部キーとして定義
- この方法なら代理識別子は不要
- Hibernateの<composite-element>タグ
- 弱点
- 代理キーが不要でも結合は必要
- 値がnullになってはいけない
- Setの場合を例に、削除できない場合が存在する
- マッピング対象の値型の中に、コレクションが含めることができない
- 筆者は制約がありすぎると判断
ORMでの、enumをステートオブジェクトとして利用する場合の扱い
- enum型でモデリングした場合も、永続化する手段を考える必要がある
- Hibernateではenumを永続化するにはカスタムユーザ型が必要
- Javaのenumをシンプルに永続化 => 文字列で持つ
- いろいろ実装があるので http://community.jboss.org/wiki/Java5EnumUserType 参照
6.7 まとめ
- まとめなのでとばし
この辺りになると、Javaでの実装話が多くなってくるがこれを各プラットフォームでどう実現するか、などを考えると訓練になるかな。コレクションまわりの扱い方はORMにエンティティとして持たせるのが一番現実的だなぁという感覚。あとはドメインモデル中心に考えるとやっぱり非正規化して永続化するのがいいのかしらね。リポジトリの章でそのへんの話でてくるかな。