DDD
ドメイン駆動設計

ちょっとずつ読むドメイン駆動設計 第ニ部 モデル駆動設計の構成要素 第五章 ソフトウェアで表現されたモデル6(エンティティ・実装)

More than 1 year has passed since last update.

エンティティの実装

前々回(エンティティとは)前回(エンティティのモデル)の続き。

ポイント

  • 識別子で同一性の比較をする場合はequals(hashCodeも)をオーバーライドする
  • 属性はバリューオブジェクトにする
  • 識別子もバリューオブジェクトにすると便利

色々省略してますが、一応例です。

Order.java
class Order{
  OrderID orderId;

  Items items;

  Order canceled(...){
    ...
  }

  boolean equals(other){
    ...
    return this.orderId.equals(other.orderId)
  }

    int hashCode(){
     ...
  }
}

OrderId.java
class OrderId{
  final Integer value;

  boolean equals(other){
    ...
    return this.value.equals(other.value)
  }

  int hashCode(){
     ...
  }
}

equalsやhashCodeなどを持ったEntityインターフェイスを用意しておいて、それを実装するとか、Entityの属性をfinalにするとかアクセス修飾子とかメソッドはDomainEventを返すとか色々あると思いますが、ひとまずポイントだけを押さえた例を書きました。

必ずequalsをオーバーライドするかとか使うときだけそうするとか、そういうのも含めチームで決めればよいと思います。

とにかく、同一性・連続性に着目し、本質的な特徴を踏まえることです。

ただ、識別子はプリミティブな属性(intとかStringとか)で持つより、きちんと値オブジェクトにするほうがいいと思います。
Entity全体でなく、識別子だけ他のモデルに参照されることがよくあり、そのときに識別子がプリミティブな値だと関連がつかなくなってしまうためです。