Upgrade to Pro — share decks privately, control downloads, hide ads and more …

DDD 値オブジェクトってなあに?

DDD 値オブジェクトってなあに?

2024-04-25 社内勉強会で発表した資料です

k.ishikawa

April 25, 2024
Tweet

More Decks by k.ishikawa

Other Decks in Programming

Transcript

  1. 値オブジェクト (Value Object)とは // 氏名を表現するFullNameクラス(値オブジェクト) class FullName { public FullName(string

    firstName, string lastName) … } // インスタンス作成 var fullName = new FullName("masanobu", "naruse"); // LastNameを表示 Console.WriteLine(fullname.LastName);
  2. 値オブジェクト (Value Object)とは // 氏名を表現するFullNameクラス(値オブジェクト) class FullName { public FullName(string

    firstName, string lastName) … } // インスタンス作成 var fullName = new FullName("masanobu", "naruse"); // LastNameを表示 Console.WriteLine(fullname.LastName); 👈プリミティブ型文字列ではなく、LastNa というドメインとして表現 出典: ドメイン駆動設計入門 ボトムアップでわかる ! ドメイン駆動設計の基本
  3. 何が値オブジェクト になるかは 文脈・モデリングの 目的によります! お金なら必ず値オブジェクトという わけでもない piyoさんが令和1年の10円玉1つを持っ ている状況と、 piyoさんが令和2年の10円玉1つを持っ ている状況

    どちらでもpiyoさんの所持金10円と考え たい場合、2つの10円玉を区別する必要 ないので10円玉は値オブジェクト。 しかし、もしコインコレクターで10 円玉を 区別して扱いたい場合、お金をエンティ ティとしてモデリングするべきかも。 出典: ドメイン駆動設計モデリング実装ガイド
  4. 値を変更したい時はどうするの? ・新しいインスタンスを生成 して返す! // 値を足すメソッド add(money: Balance) { return new

    Balance(this.amount + money.amount, this.currency) } // 使ってみる const newMoney = myMoney.add(yourMoney) // => newMoneyは新しいインスタンス。 // myMoneyとyourMoneyは元のまま。
  5. 値を変更したい時はどうするの? ・新しいインスタンスを生成 して返す! // 値を足すメソッド add(money: Balance) { return new

    Balance(this.amount + money.amount, this.currency) } // 使ってみる const newMoney = myMoney.add(yourMoney) // => newMoneyは新しいインスタンス。 // myMoneyとyourMoneyは元のまま。 出典: ドメイン駆動設計入門 ボトムアップでわかる ! ドメイン駆動設計の基本
  6. 値オブジェクトに する基準 ドメインモデルとして 挙げられていなかった概念を どこまで値オブジェクトに するかは結構難しい ポイント ・そこにルールが存在しているか ・それ単体で取り扱いたいか 氏名には「姓と名で構成される」というルールがあ

    ります。 また単体で取り扱っています。 👉上記の判断基準からすると値オブジェクト。 姓や名は、いまのところシステム上の制限はありま せん。 姓だけを取り扱ったり、名だけを利用するシーンも いまのところありません。 👉上記の判断基準からするとこれらはまだ値オ ブジェクトにしない。 参考: ドメイン駆動設計入門 ボトムアップでわかる! ドメイン駆動設計の基本 p30