面白駆動人生

やっほー

【読書メモ】実践ドメイン駆動設計 ~第5章~ 「エンティティ」

前回 【読書メモ】実践ドメイン駆動設計 ~第4章~ 「アーキテクチャ」

What is 「エンティティ」

DDDにおいて「エンティティ」は一意なものを示す概念。長期に渡り、変化する可能性がある。
一意ではなく、変化しないものは「値オブジェクト」と呼ばれる。

ドメインモデル貧血症

DBのプロパティをpublicなプロパティーとして保持し、そのgetter/setterのみから構成されるモデル。 オブジェクトとしての「振る舞い」がほとんどない状態で、「単なる手続き型設計」になっている点が、アンチパターンとされる。

エンティティ設計

一意な識別子

  • ユーザが入力する。一意性はアプリケーション側が担保する。
  • アプリケーションが内部で生成。
  • データベースなどに生成を任せる。
  • 別の境界づけられたコンテキストが生成した識別子を、ユーザが入力する。

生成タイミング

  • 早期生成: エンティティを永続化する前に、生成と割り当てを行う。

  • 遅延生成: エンティティを永続化する時に、生成と割り当てを行う。

代理識別子

エンティティが保持する識別子とは別に、オブジェクトの識別子を別の方式で管理したい時に利用。例えば、ORMツールのHibernateは、データベースに依存した型で識別子を持つ必要がある。

レイヤスーパータイプを利用することで解決する。

エンティティの生成方法

  • コンストラクタ
  • ファクトリ
  • コンストラクタから「自己カプセル化」での呼び出し

自己カプセル化・・・ クラス内部からフィールドにアクセスする際もアクセサメソッドを利用する方法。

バリデーション

  • 自己カプセル化によって、セッター呼び出し時にアサーション。
  • 契約による設計の、事前条件としてアサーションを記述。
    • 事前条件: 呼び出し側が開始時に保証する条件
    • 事後条件: 呼び出される側がメソッドの終了時に保証する条件
    • 不変条件: データが常に満たすべき条件

参考

「実践ドメイン駆動設計」から学ぶDDDの実装入門 (WINGSプロジェクト 青木淳夫 著)

以上