8

ゲッターとセッターの使い方と、ドメインモデルオブジェクトのカプセル化の目的を無効にする方法についての記事や記事を読んだことがあります。私は、セッターを使用しないという背後にあるロジックを理解しています。オブジェクトコードとインバリアントのコンテキスト外で、クライアントコードがそのオブジェクトの属性を操作できるようにしています。DDDとゲッターとセッターの使用

今、このプリンシパルは私を混乱させます。たとえば、オブジェクトのメンバ変数の値を変更する必要がある場合はどうなりますか?たとえば、人の名前が変更された場合、これをモデルに反映させるにはどうすればよいですか?最初は私は、なぜChangeNameという名前の関数を持っていないのでしょうか?私は新しい名前を渡して、内部の '名前'変数を変更することができます。まあ....それはちょうどセッターではありません!

私が明確にする必要があるのは、もし私がセッターを完全になくしたいのであれば、上記のような状況では、私はコンストラクタのパラメータだけに頼っていますか?以前の属性値の代わりに新しい属性値をコンストラクタ経由で渡す必要があります。その後、オブジェクトを永続インフラストラクチャに渡して変更を保持できますか?

これら二つの記事は、この説明に役立ちます。

  1. http://kellabyte.com/tag/ddd/
  2. http://typicalprogrammer.com/?p=23

答えて

6

まあ、これは古典的な議論です。これについてはStack Overflowにいくつかのスレッドがあります。

しかし、 Get/Set(自動プロパティ?)がすべて悪くないわけではありません。しかし、彼らはあなたのエンティティを、メソッドではなく小道具しか持たない「死んだ」データコンテナとして構築する傾向があります。これの兆候はしばしば貧血ドメインと呼ばれ、行動はほとんどありません。私の推薦は:

  1. 可能な限り小さなものを使用してください。
  2. 一緒に属しているデータのグループを見つけようとしてください。012のように一緒に であるべきです。ファーストネームミドルネームとラストネーム。別の例の は、Zipcode、City、Streetです。これらのデータは メソッドで設定する方が適しています。エンティティが無効になる可能性を最小限に抑えます。
  3. 多くの場合、一緒に属しているデータは、値 オブジェクトとしてグループ化できます。
  4. 多くのバリューオブジェクトは、通常は "名詞" エンティティの代わりに、 "Verbs"であるエンティティからより多くの記述方法 を引き出す傾向があります。
  5. また、 の動作を追加して、おそらく "ファット"サービスを減らすための値オブジェクトのメソッドが開きます( にはリークされたビジネスロジックが多すぎるサービスがあるかもしれません...)。

ここでもっと言いたいことはありますが、短い答えです。 コンストラクタでのデータの設定について:このエンティティがそのデータなしで「生きて」/存在しない場合にのみ、これを行います。エンティティPersonについては、名前はおそらくそのような重要なものではないと言います。しかし社会保障番号はコンストラクタのデータの候補になるかもしれません。またはエンティティ従業員は、会社に所属していなければならないため、コンストラクターに会社を持たなければなりません。

関連する問題