Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
DDD 値オブジェクトってなあに?
Search
k.ishikawa
April 25, 2024
Programming
0
27
DDD 値オブジェクトってなあに?
2024-04-25 社内勉強会で発表した資料です
k.ishikawa
April 25, 2024
Tweet
Share
More Decks by k.ishikawa
See All by k.ishikawa
正しいテスト駆動開発についてまとめてみた
ishikawa096
0
26
DDD ユビキタス言語ってなあに?
ishikawa096
0
15
リソース効率とフロー効率についてざっくりまとめてみた
ishikawa096
0
13
ChatGPT×AWS LambdaのSlack Botを社内運用してみた
ishikawa096
1
55
Other Decks in Programming
See All in Programming
個人アプリを2年ぶりにアプデしたから褒めて / I just updated my personal app, praise me!
lovee
0
340
GitHub Actions × RAGでコードレビューの検証の結果
sho_000
0
250
2,500万ユーザーを支えるSREチームの6年間のスクラムのカイゼン
honmarkhunt
6
5.2k
動作確認やテストで漏れがちな観点3選
starfish719
6
1k
密集、ドキュメントのコロケーション with AWS Lambda
satoshi256kbyte
0
190
DevinとCursorから学ぶAIエージェントメモリーの設計とMoatの考え方
itarutomy
1
670
ISUCON14公式反省会LT: 社内ISUCONの話
astj
PRO
0
190
TokyoR116_BeginnersSession1_環境構築
kotatyamtema
0
110
Domain-Driven Transformation
hschwentner
2
1.9k
GoとPHPのインターフェイスの違い
shimabox
2
170
パスキーのすべて ── 導入・UX設計・実装の紹介 / 20250213 パスキー開発者の集い
kuralab
3
730
なぜイベント駆動が必要なのか - CQRS/ESで解く複雑系システムの課題 -
j5ik2o
9
3.4k
Featured
See All Featured
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
Building Applications with DynamoDB
mza
93
6.2k
Rails Girls Zürich Keynote
gr2m
94
13k
Optimizing for Happiness
mojombo
376
70k
BBQ
matthewcrist
86
9.5k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
160
15k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
Building Your Own Lightsaber
phodgson
104
6.2k
A Modern Web Designer's Workflow
chriscoyier
693
190k
Building Flexible Design Systems
yeseniaperezcruz
328
38k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
Transcript
DDDの値オブジェクト 2024-04-25
値オブジェクト って?
値オブジェクト (Value Object)とは ・ドメイン駆動開発(DDD)で出てくる概念の一つ DDD以外の値オブジェクトもあるが、 DDDの要素として使われることが一般的に多い 👉今回はDDDにおける値オブジェクトを取り上げる ・値をクラスにしたもの ・ドメイン内の何かを計測したり定量化したり説明したりする 👉プリミティブ型ではシステム固有の値
として説明不足の場合、 値オブジェクトの出番
値オブジェクト (Value Object)とは // 氏名を表現するFullNameクラス(値オブジェクト) class FullName { public FullName(string
firstName, string lastName) … } // インスタンス作成 var fullName = new FullName("masanobu", "naruse"); // LastNameを表示 Console.WriteLine(fullname.LastName);
値オブジェクト (Value Object)とは // 氏名を表現するFullNameクラス(値オブジェクト) class FullName { public FullName(string
firstName, string lastName) … } // インスタンス作成 var fullName = new FullName("masanobu", "naruse"); // LastNameを表示 Console.WriteLine(fullname.LastName); 👈プリミティブ型文字列ではなく、LastNa というドメインとして表現 出典: ドメイン駆動設計入門 ボトムアップでわかる ! ドメイン駆動設計の基本
値オブジェクト の特徴 1. 値が等しいかどうかで 比較される 2. 不変(イミュータブル)
特徴1.値が等しいかどうかで 比較される
特徴1.値が等しいかどうかで 比較される エンティティ との違いを理解するとわかりやすい!
値オブジェクト とエンティティの違い ・エンティティ も値オブジェクトくらい重要なDDDの概念の一つ。 ・値が同じなら同じオブジェクト 👉値オブジェクト ・値が同じでもidが違うなら違うオブジェクト 👉エンティティ id = 同一性。id以外の値が変化しても同一性を保つ。 値オブジェクトは
idを持たない。 値が同じなら同じ。
値オブジェクト とエンティティを見分けてみよう ①ニックネーム”hoge”のユーザー2人 ②fugaさんの口座の1000円札と、piyoさんの口座の1000円札
値オブジェクト とエンティティを見分けてみよう ①ニックネーム”hoge”のユーザー2人👦👦 2人のユーザーは違うユーザーなのでエンティティ ②fugaさんの口座の1000円札💵と、piyoさんの口座の1000円札💵 2つの1000円札は入れ替えても残高に影響ないので値オブジェクト 値が同じならインスタンスが違っても区別しない。交換可能
何が値オブジェクト になるかは 文脈・モデリングの 目的によります! お金なら必ず値オブジェクトという わけでもない piyoさんが令和1年の10円玉1つを持っ ている状況と、 piyoさんが令和2年の10円玉1つを持っ ている状況
どちらでもpiyoさんの所持金10円と考え たい場合、2つの10円玉を区別する必要 ないので10円玉は値オブジェクト。 しかし、もしコインコレクターで10 円玉を 区別して扱いたい場合、お金をエンティ ティとしてモデリングするべきかも。 出典: ドメイン駆動設計モデリング実装ガイド
値オブジェクト同士で比較する ・値オブジェクトにequalsなど比較メソッドを実装することで、コードに落とし込める // 比較メソッド equals(money: Balance) { return this.amount ===
money.amount && this.currency === money.currency } // 使ってみる myMoney.equals(yourMoney) // => true
特徴2.不変(イミュータブル)
不変のメリット ・値オブジェクトは不変(イミュータブル) にする。 一度セットした値は変更されない(setterをつけない)ようにすべし メリット ・振る舞いに副作用がない =「何かメソッドを使ったら状態が書き変わってしまった」的なことがない ・不完全な状態のインスタンスが存在しない
不変のメリット ・値オブジェクトは不変(イミュータブル) にする。 一度セットした値は変更されない(setterをつけない)ようにすべし メリット ・振る舞いに副作用がない =「何かメソッドを使ったら状態が書き変わってしまった」的なことがない ・不完全(未初期化)状態のインスタンスが存在しない 👉プログラムがシンプルになり、バグが減る 🥳
値を変更したい時はどうするの? ・新しいインスタンスを生成 して返す! // 値を足すメソッド add(money: Balance) { return new
Balance(this.amount + money.amount, this.currency) } // 使ってみる const newMoney = myMoney.add(yourMoney) // => newMoneyは新しいインスタンス。 // myMoneyとyourMoneyは元のまま。
値を変更したい時はどうするの? ・新しいインスタンスを生成 して返す! // 値を足すメソッド add(money: Balance) { return new
Balance(this.amount + money.amount, this.currency) } // 使ってみる const newMoney = myMoney.add(yourMoney) // => newMoneyは新しいインスタンス。 // myMoneyとyourMoneyは元のまま。 出典: ドメイン駆動設計入門 ボトムアップでわかる ! ドメイン駆動設計の基本
値オブジェクト の特徴 1. ✅値が等しいかどうかで 比較される 2. ✅不変(イミュータブル)
値オブジェクトに する基準 ドメインモデルとして 挙げられていなかった概念を どこまで値オブジェクトに するかは結構難しい ポイント ・そこにルールが存在しているか ・それ単体で取り扱いたいか 氏名には「姓と名で構成される」というルールがあ
ります。 また単体で取り扱っています。 👉上記の判断基準からすると値オブジェクト。 姓や名は、いまのところシステム上の制限はありま せん。 姓だけを取り扱ったり、名だけを利用するシーンも いまのところありません。 👉上記の判断基準からするとこれらはまだ値オ ブジェクトにしない。 参考: ドメイン駆動設計入門 ボトムアップでわかる! ドメイン駆動設計の基本 p30
値オブジェクトを導入すると、 ・可読性の向上 ・値の取り違えによるバグの減少 (単位間の計算ミス ) ・修正漏れが減る ・不正な値が存在しなくなる ・初期化していない値によるバグがなくなる 👉上記の結果、生産性が向上する という効果が見込まれる。
まとめ
参考図書 ドメイン駆動設計入門 ボトムアップでわかる! ドメイン駆動設計 の基本 ドメイン駆動設計 モデリング/実装ガイド
関連記事 ・DDD に入門するなら、まずは ValueObject だけでもいいんじゃない? https://qiita.com/t2-kob/items/9d9dd038fe7497756dbf ・ワイと学ぶ、値オブジェクト https://qiita.com/wako-p/items/2fd8a5e038c33936308d ・値オブジェクト(Value Object)は3種類ある
https://panda-program.com/posts/three-types-of-value-object
ありがとうございました!