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
170
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
40
DDD ユビキタス言語ってなあに?
ishikawa096
0
52
リソース効率とフロー効率についてざっくりまとめてみた
ishikawa096
0
38
ChatGPT×AWS LambdaのSlack Botを社内運用してみた
ishikawa096
1
75
Other Decks in Programming
See All in Programming
AIを活用したE2Eテスト実装効率化のあゆみ / ebisu-mobile-14-kotetu
kotetuco
0
170
【やさしく解説 設計編・中級 #1】一つの車に、運転手は一人 ~ある倉庫システムの事例から~
panda728
PRO
0
170
過去最大のMCPアップデート! 2026-07-28 RC版の謎に迫る
licux
6
460
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
100
AI時代、エンジニアはどう育つのか -未経験エンジニアの成長を間近で見て考えたこと-
thasu0123
0
110
Mujeres en SEO Summit 2026 - Greatest Disaster Hits en Web Performance
guaca
0
240
鹿野さんに聞く!『TypeScriptコードレシピ集』で磨く実践力
tonkotsuboy_com
4
1.1k
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
140
AI時代の仕事技芸論〜ソフトウェア開発で「遊ぶように働く」職人的熟達のすすめ(スクフェス仙台 2026バージョン)
kuranuki
0
620
JAWS-UG横浜 #102 AWSサ終供養LT会 成仏できない AWS サービスたち 〜本日、三体供養します〜
maroon1st
0
120
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
200
Developing with AI Agents — Codex, Claude Code & Cowork Practical Guide
x5gtrn
PRO
0
1.4k
Featured
See All Featured
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
30 Presentation Tips
portentint
PRO
1
350
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
220
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
150
Bash Introduction
62gerente
615
220k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.5k
First, design no harm
axbom
PRO
2
1.2k
Utilizing Notion as your number one productivity tool
mfonobong
4
380
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
410
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
460
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.4k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.6k
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
ありがとうございました!