問題タブ [value-objects]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
domain-driven-design - DDD エンティティ、値オブジェクト、およびデータベースのマッピングと更新。不変の矛盾?
私は DDD で小さなプロジェクトに取り組んでいます。値オブジェクトは immutableであるため、変更できません。エンティティのみ。
誰もが使っている例を使用します。住所。Address がCustomer エンティティの VO であるとしましょう(これはルート集約でもあります)。ユーザーが自分の Address を更新した場合、これはショッピング カートのどのシナリオでも有効ですが、どうすればよいでしょうか? データベースに保存するには、VO アドレスを変更する必要があります。つまり、データベースで識別できるようにするには、この VO に ID が必要です。NHibernate がマッピングを使用して処理しない限り、そうです。LinqToSql の場合はそうではありません。または、代わりに Address がエンティティである新しい Aggregate を作成する必要があると思いますか? 次に、集計でアドレスが必要な場所にアドレスのコピーがほとんどありますか?
でも。私はまだエンティティ/VO の概念全体をラップすることはできません。DB に表現を持つものはすべて、モデルで VO として使用する場合でも、何らかの形でエンティティであるように思えます。それを永続化するには、データベースでそれを識別するために何らかのキーが必要だからです。 .
結局のところ、すべての値オブジェクトのデータは (ほとんどの場合) データベースから取得されます。そのため、そのデータが更新された場合にそれらを不変にする方法をまだ理解できません。
2 か月間熱心に読んだ後、DDD 全体が巨大な矛盾の問題であることがわかりました。これらのブログをすべて読むと、私が話していることがわかります。残念ながら、ロールモデルやガイダンスとして使用できるデモアプリケーションはゼロです. それらはすべて、開発者の好みに大きく影響されます。その後、彼らはお互いのブログを攻撃することになります。Overnight-DDD-Guru のブログは、コミュニティ全体の混乱を助長しています。
お立ち寄りいただきありがとうございます。建設的な議論を期待しています。
domain-driven-design - DB IDとエンティティを持つ値オブジェクトを使用したDDDクラス設計のジレンマ
これは長い質問なので、すぐに要点に行きます。これは、問題をよりよく説明するための疑似コードです。
DB構造
ユーザー (ユーザー ID、名前、姓)
Address(AddressID, UserID, Street, City, State, ZipCode) =>多対1のユーザー関係
電話 (PhoneID、UserID、Number、IsPrimary) => 多対 1 のユーザー関係
ドメイン クラス
ここまでで、このドメインとそのモデルの非常に基本的な表現ができました。
私の質問は次のとおりです。最初に入力されたときにスペルミスがあったため、アドレスの1つを更新するか、番号の1つの市外局番を修正したいとしましょう.
DDD に関する Evan のバイブルに従えば、値オブジェクトは不変でなければなりません。つまり、作成後にプロパティやフィールドを変更する必要はありません。その場合、電話番号の文字列の一部が間違っているという理由だけで ContactInfo クラス全体を再作成することはできないため、私のクラスはどれも ValueObject ではないと思います。それで、それは私のすべてのクラスをエンティティにすると思いますか?
このクラスはデータベースに格納されているため、各クラスに「永続性 ID」があることに注意してください。
コンストラクターで簡単に再作成できるため、Phone を値オブジェクトにすることにしたとします。
それで、それは User (agg root) AND contactinfo にメソッドを追加するようなものでしょうか? (デメテル法)
お気に入り...
しかし、私はまだ永続化IDに対処する必要があります... grrrrr。なんて頭が痛い。
それらのブログを読んでいると、オブジェクトを重視するほとんどの「ddd エキスパート」が乱用されている、または誤用されていると感じることがあります。
このシナリオの最善の解決策は何ですか? ありがとうございました
domain-driven-design - ID を持たないが、変異 (変更) する必要があるため ValueObject にできない DDD クラス
この質問には少し背景があります....
DB IDとエンティティを持つ値オブジェクトを使用したDDDクラス設計のジレンマ
誰も私の質問に説得力のある答えをくれなかったので、私の質問を言い換えて、疑問の恩恵に答えた人々に伝えます. たぶん、私は自分の質問を正しく提示していませんでした。
この時点で、あなたは私の最初の質問を読んでいると思います。
したがって、ContactInfo は User に属しているため、ドメイン ID を持つ必要はありません。ユーザーなしでは「存在できません」。それは他のクラスとコレクション (データベースから来る) をラップするクラス (nhibernate コンポーネント) に他ならないので、新しいインスタンスに置き換えたい場合、不変にするのは悪夢です。n 個のパラメーターを持つコンストラクター全体を作成し、オブジェクト グラフ全体を再作成する必要があります。これは、住所コレクション内の 1 つの通りを更新したかったからです。私の目には、ばか。
では、ContactInfo とは一体何なのでしょうか。変更可能な ValueObject? DDD の第一人者である Evan は、「mutable valueobject」に関する Google アラートと、これら 2 つの用語が出現するたびに送信するエクソシストを手元に置いていると確信しています。
私はこれについて非常に混乱しています。私は「f ... it」のようなプログラマーになりたくないので、かなり行き詰まっていて、単に ContactInfo を可変にしたくないからです(しかし、この時点では選択の余地がありません)。したがって、DDD の概念について独自の解釈 (および実装) を行う前に、いくつか意見を述べたいと思います。
PS: これは失礼かもしれませんが、Evan の本からの回答をコピー アンド ペーストしないでください。抽象的な概念でもありません。Order と Orderline については誰もが知っています。構造体と参照型、Blog、Post、Comments についても知っています。これは、この問題について知っておく必要があるすべての特定のシナリオです...そのため、このシナリオに対する具体的な回答をいただければ幸いです。
ありがとう :)
domain-driven-design - DDDのドメインモデル内で使用されるこれらのタイプのオブジェクトを何と呼びますか?
この命名の問題の解決策を見つけようとしましたが、Web上のどこにも同様の使用法を見つけることができませんでした。ドメインモデルにデザインフローがあるか、いわゆる「ValueObjects」に適切な名前を使用していない可能性があります。
以下をお読みください。
CQRSパターンのドメイン駆動設計を使用します。以下は、ドメインモデルがどのように設計されたかです。
PS関連はありませんが、参考までに、アプリケーションはASP.NET MVCを使用し、コントローラーはサービスレイヤーと通信します。DTO(データ転送オブジェクト)はMVCコントローラーに渡されますが、これは上の図にはありません。
問題は、「ValueObject」を正しく使用していないことです。Martin Fowlerの定義によると、私たちのValueObjectsはValueObjectの真の表現ではありません。 http://martinfowler.com/bliki/ValueObject.html
たとえば、ValueObjectsにはIDがあります。
これらのValueObjectは、コマンド、AggregateRoots、およびドメインエンティティ間でデータを伝送するだけです。たとえば、AggregateRootは、ドメインエンティティに基づいてValueObjectsを作成し、それらのValueObjectsをコマンドレイヤーに返します。
以下は完全な実装ではありません。相互作用を示すための簡単な例
AggregateRoot拡張メソッド:
AggregateRoot:
指示 :
これらのいわゆる「ValueObjets」の適切な名前を見つけるのに苦労しています。これらもDTOではないようです。また、サービスレイヤーで使用されるDTOと区別できるようにしたいと考えています。具体的には、これらのタイプのオブジェクト(ValueObjects)に呼び出すことができる適切な名前を知りたいと思います。どんな考えでも大歓迎です。
c# - DDD値オブジェクトの同等性、== vs .Equals()
ですから、私には価値object
があり(任意にお金と言います)、それに対して平等を実装したいと思います。==
and .Equals()
(参照とデータの同等性)の意図された/デフォルトの動作を認識しています。
ただし、この場合、2つのオブジェクトを比較できるようにしたいので、計算では同等です(たとえば、1mと3 ftは同等です)が、永続性(同等性に依存すると思わNHibernate
れる場合は、を使用)、ユーザーの表示、および選択については同等です。isDirty
通貨の、私はそれらが異なると見なされることを望みます。
この場合、私はすべきですか、
==
との動作が異なります.Equals()
(そしてどちらが何をする必要がありますか)、- 同等性を確認したい場合は、各プロパティを確認するだけです(追加のコードを意味します)
- 次のようなメソッドを実装し
.IsEquivalent()
ます(後者は実行したくない) - 私が見逃している他の何か
従うべきベストプラクティス/パターンはありますか?ありがとう
編集:為替レートの変更に関していくつかの回答がありました。わかりやすくするために更新します。通貨ではなく高さを言うことができます
- いくつかの仮定を明確にしたいと思います。
- //無視:値オブジェクトには小数、文字列/クラス通貨が含まれます
- //無視:為替レートは変更されません。
- //無視:クラス通貨は、他の通貨との間の交換レートを認識しています
- 値オブジェクトには、10進数の数量、文字列/クラス単位が含まれます
- クラスユニットは、他のユニットとの間の変換を認識しています。
- レート/コンバージョンなどを拡大するつもりはありません
通貨を実装するのではなく、慣行やパターンに関心があります。基本的に、身長が値オブジェクトである人の身長への同じアプローチ({1、m}から{3、ft}、1mは常に3ftと「等しい」/「同等」)
spring - Spring : vo クラスをスプリング コントローラーのパラメーターとしてのみ使用した場合の 404 エラー
Springフレームワークでサイトを作っています。問題は、VO をパラメーターとして配置した場合にのみ 404 エラーが発生することです。コントローラーの @ModelAttribute として VO を配置しました。
2 つのテーブル列をまとめて VO のプロパティを作成しました。1-VO が 2-Table に一致するために問題が発生したと思います。1-VO mathces 1-table で同じ方法を使用すると、エラーが発生しないためです。
誰かがそれを知っているなら、このエラーが発生する正確な理由を教えてください。
ここにソースがあります。
これは、VO プロパティに一致する最初のテーブルです。
これは、VO プロパティに一致する 2 番目のテーブルです。
これらのテーブルに関連するデータを挿入するために、これらの2テーブルでVOクラスを作成しました。
(セッター/ゲッターは省略します。)
最後に、コントローラーのソース部分です。
@modelAttribute("command") HDW hdw パラメータを削除すると、コンソールに「hdwControl の $$Test」が問題なく表示されます。
問題を解決するにはどうすればよいですか?
**追加ソースはこちら**
もちろん、@ModelAttributeをhtml入力フィールドに一致させました。
xml ファイル (iBatis sqlMap) には、HDW をデータベースに挿入するためのクエリが含まれています。
domain-driven-design - DDD プラクティスに従う場合、値オブジェクト ファクトリを持つことは理にかなっていますか?
最近、特定のドメイン モデルを設計しようとしたときに過去に抱えていたいくつかの問題について考えていました。たとえば、特定のコンテキストでは編集可能であるが、別のコンテキストでは編集できないアドレスとしましょう。私の現在の考え方では、アドレスの値オブジェクト バージョンとアドレスのエンティティの両方を、おそらく顧客アカウントのようなものに関連付けて、それを識別できるようにするというものです。
ユーザーがアドレスを入力したときなど、新しいアドレスを作成する場合、そのアドレスを引き続き編集し、おそらく既存のアドレスも編集できるようにする必要があることに気付きました。同じ境界コンテキスト内。このため、このコンテキスト内では、Address は値オブジェクトではなくエンティティとしてモデル化する必要があると想定できます。これは、既存のデータセットを変更したり、新しいデータを作成したりするときに常にエンティティを使用する必要がある場合、値オブジェクトを作成するためのファクトリを持つことは理にかなっているという私の主な質問につながりますか?
私がこの考え方に従っているときに浮かび上がってきたルールは、値オブジェクトは、アプリケーションに対して静的なもの、またはデータベースに既に永続化されているものを表すためにのみ作成されるべきであり、一時的なものではないということです。現在のドメイン コンテキスト内。したがって、あらゆるタイプの値オブジェクトを作成する必要がある唯一の場所は、永続値の集約ルートリポジトリ内またはその代わりに、または静的値の場合はサービス内で再水和/実体化される場合です。これは私にはかなり明確に見え始めていますが、誰かが同じ結論を導き出している場所を他に読んだことがないことが懸念されます. いずれにせよ、誰かが私の結論を確認するか、正してくれることを願っています。
java - Xtend @Data 値オブジェクトの追加コンストラクター
XTend (XText) の値オブジェクト (@Data で注釈付き) にセカンダリ コンストラクターを追加するにはどうすればよいですか?
次のことを試しましたが、コンパイルできません。
c# - エンティティではないオブジェクトをデータベースに保存する方法
エンティティ「学年」には、タイム プランナーに表示される、または表示されない、構成可能な可視曜日があります。
表示されている曜日を保存する 2 つの可能性があります。
N:M の関係を作成します。N 学年には M VisibleWeekDays があります。
または、カンマ区切りのフィールドに表示される週日を入れます: "0,2,5"
数値は、DayOfWeek 列挙からの列挙値です。
1 つのフィールドに 1 日のインデックスを保持するためだけに、別の 2 つのテーブル (ジャンクション + VisibleWeekDay テーブル) を作成するこのオーバーヘッドの方法を実際に使用する必要がありますか?
その目に見える平日をどのように節約しますか?
serialization - 値オブジェクトをリレーショナル データベースに格納する方法は?
単純な (関連のない) 値を表す多くのオブジェクトを含む大規模なプロジェクトで作業しています。これらの値は単一の文字列の場合もあれば、2 つの文字列の場合もあり、文字列と整数の場合もあります...
Id
現在、リレーショナル データベースに 、Category
、String1
、String2
...、Int1
、Int2
...などの列を含む「値」テーブルがありますDouble1
。便利ですが、混乱しています。
すべての値には次のプロパティがあります。
- 同じ属性を持つすべてのオブジェクト
Category
は、同じ属性を持ちます (つまり、タイプされます)。 - 関連するオブジェクトはありません (唯一のキーは
Id
主キーです)。
この混乱から抜け出すにはどうすればよいでしょうか。私が見ているように、私たちのオプションは次のとおりです。
- 必要に応じて列を追加し続け、テーブルとオブジェクト間のセマンティック マッピングは忘れてください。重ねるだけ。
- 値オブジェクトごとに新しいテーブルを作成します。これにより、多数のテーブルがデータベースに追加されますが、そのほとんどは 6 行未満です。これらすべての余分なテーブルがデータベースに追加するノイズが心配です。
- これらのオブジェクト専用のスキーマフリー データベースを展開します (展開シナリオでは実際には可能ではありません)。
Id
with 、Category
列、および BLOB列のテーブルを作成しValue
、値オブジェクトを値列にシリアル化します。これは実行可能ですか?
この投稿では、私たちの選択肢をもう一度述べます。シリアル化を使用する際の注意事項や落とし穴はありますか? 私が知らないオプションはありますか?アドバイス大歓迎です。