Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
DDD 値オブジェクトってなあに?
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
k.ishikawa
April 25, 2024
Programming
200
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
DDD 値オブジェクトってなあに?
2024-04-25 社内勉強会で発表した資料です
k.ishikawa
April 25, 2024
More Decks by k.ishikawa
See All by k.ishikawa
正しいテスト駆動開発についてまとめてみた
ishikawa096
0
42
DDD ユビキタス言語ってなあに?
ishikawa096
0
56
リソース効率とフロー効率についてざっくりまとめてみた
ishikawa096
0
56
ChatGPT×AWS LambdaのSlack Botを社内運用してみた
ishikawa096
1
77
Other Decks in Programming
See All in Programming
Starting & Sustaining Code-Based E2E Testing for Non-Coding QA Teams( #jasstniigata )
teyamagu
PRO
1
360
setup-vp GitLab対応の裏側
naokihaba
0
110
App Intentsのビルドプロセスを支える技術
kntkymt
0
390
AI Agent時代のリアーキテクチャ戦略と実践
hokaccha
9
4.7k
新卒PdEのリアル
ryu1013
1
500
LoopHub - ローカルで動く GitHub で、AI と共同開発
jugyo
1
560
iOSDC2026登壇資料.pdf
riofujimon
0
170
Building an Out-of-Order CPU
latte72
1
790
『寄り添うラジオ』をAIで作る 体験価値から逆算した、会話しないUXと品質設計
theoriatec2024
3
180
WebRTC映像をAirPlayに対応させる挑戦.pdf
monolithic_adam
0
280
iOSDC Japan 2026 - Swiftで作って学ぼう!データベース自作入門
kaseken
2
170
技術的負債を組織課題として解く-増えすぎたマイクロサービスとの戦い-
reimaru
1
2k
Featured
See All Featured
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
890
Technical Leadership for Architectural Decision Making
baasie
3
570
Thoughts on Productivity
jonyablonski
76
5.4k
Prompt Engineering for Job Search
mfonobong
0
450
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
500
Designing for Timeless Needs
cassininazir
1
480
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.6k
Discover your Explorer Soul
emna__ayadi
2
1.3k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Bash Introduction
62gerente
615
220k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
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
ありがとうございました!