web-dev-qa-db-ja.com

一意の値オブジェクトとエンティティ

一部のエンティティを値オブジェクトに変換しようとすると、値オブジェクトが集約内で一意でなければならない場合に行き詰まります。

集約のルートを作成するMovieエンティティがあるとします。このMovieエンティティは、特定のタイムスタンプで広告を表示する役割を持つAdvertisementEventオブジェクトのセットに関連付けられています。

AdvertisementEventには、表示する必要があるいくつかのBanner、座標、およびいくつかの効果フィルターへのリンクが含まれています。

AdvertisementEventは単なる構成パラメータのコレクションなので、そのIDを気にし、それを大きな値のオブジェクトのように扱う必要があるかどうかわかりません。ただし、Movie内では、特定のタイムスタンプにAdvertisementEventが1つだけ存在する必要があることに注意してくださいaroundタイムスタンプ。

私は疑問を複数の独立した質問に分割するのが難しいので、そこに行きます:

  1. 構成パラメータのコレクションは値オブジェクトのように聞こえますか?
  2. Movie内のAdvertisementEventの一意性の概念とトランザクション整合性ルールを混合していますか?
  3. する任意(2)の選択肢の選択肢は、AdvertisementEventMovie
  4. 私のAdvertisementEventオブジェクトは、エンティティ、値オブジェクト、またはイベントオブジェクトですか? (混乱を強調するために、名前にEventサフィックスを使用しました)
  5. このような大きな値のオブジェクトはデザインのにおいですか?

happensだけではないため、DDDの意味でイベントを扱っていないようです。実際のDDDイベントは、より--AdvertisementEventReachedのようになります。

8
SystematicFrank

EntityオブジェクトとValueオブジェクトの区別は、質問に基づいている必要があります。同じ内容の2つのオブジェクトがある場合(2つのAdvertisementEvents同じパラメーターに同じBannerにリンク) 、それらを異なる方法で処理する必要がありますか、それともソフトウェアの動作に影響を与えることなく、一方を他方に置き換えることができますか?

この場合、ソフトウェアの動作に影響を与えずに、1つのAdvertisementEventを別の同じ値に置き換えることができると思います。これにより、それらはValueオブジェクトになります(含まれている値は重要であり、オブジェクト自体のアイデンティティではありません)。

Valueオブジェクトのサイズについて:単一の責任の一貫したパラメーターセットが含まれている限り、Valueオブジェクトのサイズに制限はありません。実装では、大きな値のオブジェクトに特別な注意を払って、不必要かつ過度にコピーされないようにすることをお勧めしますが、それ以外の場合は問題ありません。

Movie内にあるAdvertisementEventsの数の制約については、これはMovieとそのコレクションの関係に関する制約ですAdvertisementEvents、これらのクラスの1つではありません。そのため、制約を適用する最も論理的な場所は、コレクションがMovieで維持される時点です(したがって、AdvertisementEventを追加しようとするメソッドで)。