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


8

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

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

AdvertisementEventはいくつかへのリンクが含まバナーが表示されている必要があり、座標といくつかの効果フィルタを。

以来AdvertisementEventだけで設定パラメータのコレクションを、私はそのアイデンティティを気にしてばかり大きな値オブジェクトのように扱う必要がある場合、私はわかりません。ただし、映画内では、特定のタイムスタンプで、おそらくタイムスタンプの前後でも、AdvertisementEventが1つだけであることを気にします。

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

  1. ない設定パラメータのコレクションは、値オブジェクトのように聞こえますか?
  2. 映画内のAdvertisementEventの一意性の概念とトランザクション整合性ルールを混在させていますか?
  3. ない任意の時点での選択肢(2)のがあることを意味AdvertisementEventがで作られた集合体のメンバーでなければなりません作品
  4. 私のあるAdvertisementEventのオブジェクトは、エンティティ、値オブジェクトやイベントオブジェクト?(私の混乱を強調するために、名前にイベントサフィックスを使用しました)
  5. このような大きな値のオブジェクトはデザインのにおいですか?

私はそれだけで何かではないので、私はDDDの意味でのイベントはお取り扱い致しておりませんことを推測起こります。実際のDDDイベントは、AdvertisementEventReachedのようなものでなければなりません。

回答:


9

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

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

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

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


本当にありがとう!エンティティを値オブジェクトと区別するためにその質問をすることについて何度も読んだにもかかわらず、今回はようやく「クリック」されました。そのレッスンを学ぶには、実生活で問題が必要だったと思います。イベントオブジェクト(ドメインイベントではない)と一意性(不変)のように見えるものが公開されているので、問題が大好きです。私の質問では、「トランザクションの整合性ルール」の代わりに「不変」と言うべきだったと思います。
SystematicFrank 2013年

興味深い...この違いをよりよく理解することの副作用として、プログラムの安定性を向上させるために、ステートレス/不変の値オブジェクトの重要性をはっきりと見ることができます。GUI実装の詳細について考えすぎていたと思います...アプリケーションレイヤーでの簡単な変更は素晴らしいですが、ドメインレイヤーではAdvertisementEventを不変にしたいと思います!
SystematicFrank 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.