Open3
[学習メモ]DDD
ドメインモデル EntityとValueObject
ValueObject
- 不変である
- 交換可能
- 等価性
金額、年齢、住所など属性を表すもの
プリミティブな値だけだと制御仕切れない情報を定義して利用価値を広げる
例えば年齢は数値だけでも表現できるが、マイナスや小数点の様な表現はしない、加算はするが減算しないなどのルールを定義してシステム全体での利用ルールを定義、共通化できる
ドメイン独自のルールを定義している属性も多いのでドメインモデルの複雑性を閉じることができる
値そのものと利用用途に合わせた表現の切り替えが容易になる
例えば名前、姓 + 名(外国の方ならミドルネーム)をまとめたもの
場所によっては姓だけを表示する、フルネームで表示する、姓名を分けるなどの表現もしやすい
日付の表現は言語によってはクラス設けていたりして概念としては近そう
jsだとDate
Entity
- 一意である
- 一意性の担保に識別子が必ずある
- 保持している属性は可変である
同姓同名で「山田 太郎」さんがいるとする
ex) 同じ名前で合っても現実世界では同じ人としては扱わない
遺伝子レベルでの判別はできないので便宜上、社会保険番号やマイナンバーなどの情報で別の人物として扱うことが一般的
ValueObjcetと違い、属性が変わっても同じものとして扱う
ex) 体重や年齢が変わっても別の人物になる訳ではない
アグリゲート(Aggregate)
ちょっと馴染みがなかったやつ
複数のドメインオブジェクトを取り扱う際のルートオブジェクト
ルートになるのはエンティティ
アグリゲート内のオブジェクトは互いに参照することができるが、外部のオブジェクトはルートへのみ参照ができる
RDSにおける親子のテーブル関係がイメージに近いのかも?
ファクトリ
TODO
リポジトリ
TODO