5

操作が概念的にエンティティまたは値オブジェクトに属していない場合は、動作をオブジェクトに強制するのではなく、ドメインサービスを作成する必要があります。

サービスのインターフェースは、ドメインモデルの他の要素に関して定義する必要があります。つまり、サービスのパラメータと戻り値はドメインオブジェクトである必要があります

a)ドメインサービスがドメインオブジェクトをパラメータおよび戻り値として使用する必要があるのはなぜですか?

b)ドメインオブジェクトをパラメーターおよび戻り値として使用するために、DDDがエンティティおよび値オブジェクトのメソッドも必要としないのはなぜですか?代わりに、なぜこの制約がサービスにのみ課せられるのですか?

ありがとうございました

EULERFX:

1)

これらの制約は両方とも、不変性と機能的なスタイルを促進します

a)2つの制約はどのように不変性を促進しますか?

b)機能的なスタイルとは何ですか?

c)したがって、(forceを使用できるとは限らないため)サービスがドメインオブジェクトをパラメーターおよび戻り値として使用するように強制する必要があります。ただし、そのサービス(つまり、動作)が受け入れ/戻るのはより自然な場合があります。非ドメインオブジェクト?

2)

エンティティと値オブジェクトは、より多くのプリミティブ型を構成して複雑な型を形成し、一部の動作はプリミティブパラメータに依存する場合があります。

それで、ドメインエンティティ/値オブジェクトのある種の固有の特性が原因で、ほとんどの場合、それらの動作(つまり、それらの操作)はプリミティブ型で動作します(つまり、プリミティブ型をパラメーターとして使用します)?はいの場合、ほとんどの場合、この固有の特性はドメインオブジェクトに見られますが、ドメインサービスにはめったに見られませんか?

2回目の更新:

2つの制約はどのように不変性を促進しますか?

ドメインサービスは状態を変更せず、すべての状態変更はパラメーターを介して明示的に行われるという考え方です。

a)それ自体の状態または一部のドメインオブジェクトの状態を変更しませんか?ドメインサービスはステートレスである必要があるので、DOの状態を変更してはならないということですか?言い換えると、サービスは、変更しようとしているDOが引数として渡される(つまり、操作に渡される)ことを確認することにより、不変性を促進しますか?

b)しかし、代わりにサービスによって変更されるDOが引数として渡されない場合、ドメインサービスがこのDOの状態を変更したと言いますか?

c)DOの状態を変更することが悪いことと見なされる理由は、それが明確さを促進しないためです(つまり、サービス操作のシグニチャを見るとすぐにはわかりません。DOは状態を変更します。手術 )?

d)ドメインサービスが引数として渡されたDOの状態を変更する場合、このDOの状態を変更するために使用する値も引数としてサービスに渡されることが理想的です。はいの場合、それは明快さを促進するためですか、それとも...?

2)引数と同じ型の戻り値がどのように不変性を促進するのかまだわかりませんか?

EULERFX 3

a)

ドメインサービスは、渡されたオブジェクトを変更する代わりに、オブジェクトの新しいインスタンスを返すことにより、状態の変化を回避できます。

言うまでもなく、より多くの観察ですが、なぜそのようなサービスの動作がほとんどのドメインモデルで一般的であるのか、またはドメインをモデル化するときにそのような動作が自然に発生するのか、それとも少し概念に強制する必要があるのか​​を理解するのは難しいですか?!

b)

はい。ただし、その場合は、ドメインオブジェクトがそれ自体を変更する方がよいでしょう。

そして、DOがそれ自体を変異させる必要がある主な理由は、特定のDOで変異を実行するコードが一箇所に集中しているためです。したがって、このコードを検査する必要がある場合、どこでコードを探すべきかがわかります。

4

1 に答える 1

8

a)これは厳密な制約ではありませんが、特定の利点があります。ルールの背後にある考え方は、ドメインサービスには、既存のエンティティと値オブジェクトを補完する機能が含まれているということです。もう1つの非厳密な制約は、ドメインサービスメソッドの引数と戻り値の両方が同じタイプである操作のクロージャです。これらの制約は両方とも、不変性と機能スタイルを促進し、それによって副作用を減らし、コードについての推論、コードのリファクタリングなどを容易にします。

エンティティでも値オブジェクトでもないプリミティブ型を受け入れるドメインサービスメソッドを持つことができます。ただし、プリミティブ型を広範囲に使用すると、プリミティブな強迫観念が生じる可能性があります。

b)この制約は、エンティティおよび値オブジェクトレベルである程度適用できます。エンティティと値オブジェクトは、より多くのプリミティブ型を構成して複雑な型を形成し、一部の動作はプリミティブパラメータに依存する場合があります。このプリミティブパラメータ自体を値オブジェクトに変換できます。

アップデート

DDDのミートアップから戻ったばかりで、ドメイン駆動型設計の実装の著者であるVaughnVernonとこれについて話し合う機会がありました。彼は、指定された制約が厳密ではないことに同意します。言い換えると、ドメインサービスメソッドがプリミティブ型によってパラメータ化されることが完全に受け入れられるシナリオがあります。

2つの制約はどのように不変性を促進しますか?

ドメインサービスは状態を変更せず、すべての状態変更はパラメーターを介して明示的に行われるという考え方です。これが純粋関数の本質です。ドメインサービスがエンティティを補完することを考えると、それらのメソッドはそれらの用語で表現する必要があります。

機能的なスタイルとは何ですか?

関数型プログラミングについて言及しています。関数型でのプログラミングは通常、不変性と純粋関数を伴います。機能的アプローチのもう1つの特徴は、命令型とは対照的な宣言型のスタイルです。

したがって、(forceを使用できるとは限らないため)サービスにドメインオブジェクトをパラメーターおよび戻り値として使用するように強制する必要があります。

いいえ。プリミティブ型が操作に十分である場合、それを他の何かに強制する理由はありません。エンティティと値オブジェクトの使用は単なるガイドラインであり、他のオブジェクトよりも厳密にすることを好むものもあります。たとえば、明示的な型を使用して各エンティティのIDを表すものもあります。したがって、を使用する代わりに、注文のIDを表すためにint呼び出される値オブジェクトを作成します。OrderId

それでは、ほとんどの場合、それらの動作(つまり操作)がプリミティブ型で動作する(つまり、プリミティブ型をパラメーターとして使用する)のは、ドメインエンティティ/値オブジェクトのある種の固有の特性によるものですか?

DDDに固有のものとは言えません。私は構成のより一般的な考え方に言及していました-複雑なエンティティ(非DDD)はより単純なものから構成されています。このトークンによって、複雑なエンティティに対する操作が構成要素の観点から表現されることは理にかなっています。

更新2

a)ドメインサービスは、渡されたオブジェクトを変更する代わりに、オブジェクトの新しいインスタンスを返すことで状態の変化を回避できます。このように、メソッドのシグネチャは、副作用がないため、メソッドの機能を完全に記述します。

b)ドメインサービスは、渡されたオブジェクトの状態を変更できます。その場合、戻り型はいっぱいになる可能性があります。ただし、これはあまり望ましくありません。DOが自身の状態を変更する方がよいでしょう。

c)はい、それはその一部です。不変性と純度により、代数方程式を代入して因数分解するのと同じように、コードをリファクタリングできます。もう1つの理由は、不変のデータの一部を見ると、そのスコープの残りの部分では変更されないことを確認できるため、コードについての推論が容易になることです。

d)はい。ただし、その場合は、ドメインオブジェクトがそれ自体を変更する方がよいでしょう。このミューテーションは、周囲のアプリケーションサービスによって呼び出されます。多くの場合、ドメインサービスをエンティティの動作メソッドに渡して、直接アクセスできない機能を提供します。

e)操作のクロージャの概念は、それ自体では不変性を促進しませんが、不変コードの特性です。その理由は、ドメインサービスメソッドがタイプTの値を受け入れ、タイプTの値を返す場合、カプセル化された操作の結果として新しいTの値を返すことを示すことができるためです。これは、操作によって生じる変更が新しいオブジェクトとして明示的に行われるため、不変性の特徴です。

更新3

a)これは、DDDよりも従来のOOPと関係があります。OOPは、オブジェクトの背後にある可動部分を隠そうとします-カプセル化。FPは、可動部分(不変性)を最小限に抑えようとします。一部のシナリオでは、不変性はより「自然」であると見なすことができます。たとえば、イベント中心のシナリオでは、イベントは何が起こったかの記録であるため、不変です。何が起こったかを変更することはありませんが、補償アクションを作成することはできます。

b)繰り返しになりますが、これはDDDよりもOOPと関係があり、データの動作をそのデータにできるだけ近づける必要があるという情報エキスパートのパターンに基づいています。DDDでは、これは、エンティティが自身の整合性を確保できるように、含まれるデータを可能な限りカプセル化する必要があることを意味します。

于 2013-01-14T21:54:00.630 に答える