2

ドメイン駆動設計について少し読んでみると、集約ルートからのトラバーサルによって集約内のすべてのエンティティにアクセスすることになっているようです。

ただし、同時に、プロパティ/フィールドが保護または非公開になるように、データを実際にカプセル化する必要があります。

したがって、私の質問は次のとおりです。フィールドが保護/非公開の場合、集計をどのようにトラバースすることになっていますか?

現時点で設定した方法は次のとおりです。ドメインモデルのすべてのプロパティを内部としてマークし、「設定」のメソッドを保護としてマークします。このように、少なくともモデルの外部からプロパティにアクセスすることはできませんが、モデル内のオブジェクトは他のオブジェクトのプロパティにアクセスでき、オブジェクト自体からのプロパティの設定のみを許可します。

私がこれを行ったとしても、これは他の集約エンティティのプロパティにのみ適用されるべきであるように感じます (つまり、顧客の「名前」は非公開のままですが、顧客の「注文」は内部としてマークする必要があります。 Customer -> Orders -> などからのトラバーサル)

これに関するガイダンスはありますか?

編集:

質問のより具体的な例を挙げてみましょう。オブジェクト グラフには、Bookshelf と Book という 2 つのオブジェクトがあります。この例では、Bookshelf が集約ルートであり、Books が Bookshelf に格納されているため、集約内のエンティティであるとします (Bookshelf には書籍のコレクションがあります)。

本棚に新しい本を追加するメソッドを書きたいと思います。DDD のベスト プラクティスに従って、Bookshelf クラスに AddBook(Book book) などのメソッドを記述する必要があると思います。

ただし、同じタイトルの本を本棚に追加できないというビジネス要件がある場合はどうなるでしょうか。Bookshelf.AddBook メソッド内に、書籍のコレクションをチェックして、この書籍がまだ存在していないことを確認するロジックが必要です。

問題は、Book オブジェクトを適切にカプセル化された方法で作成し、その "Name" プロパティにパブリックにアクセスできないため、それができないことです。

これはかなり不自然な例であることは理解していますが、問題をよりよく示していることを願っています。また、これは単なる DDD の問題ではなく、実際には OO カプセル化の問題であることにも気付きました。私がやろうとしていることを解決するための非常に一般的で簡単な方法があるに違いないと確信していますが、私はそれを非常に考えすぎています。

4

2 に答える 2

2

親とその子の間の構成のような強い関係の場合、プロパティを公開することに問題はありません。子プロパティは親に公開されますが、それらの強い関係と相互依存性により、カプセル化が壊れることはありません。

言い換えると、Book の name プロパティを Bookshelf に公開することは何も悪いことではありませんが、Book の名前を他の集計に公開することは (DDD のベスト プラクティスの意味で) 間違っています。変更可能な本のコレクションを公開することも間違っています。読み取り専用コレクションの公開は慎重に行う必要があります。これは、カプセル化が破られている兆候である可能性があります。

これはあなたの質問に答えていますか?

于 2010-07-02T22:21:23.673 に答える
-1

Visitor パターンは、典型的なトラバーサル メカニズムです。

于 2010-07-02T00:24:22.653 に答える