Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
DDD 値オブジェクトってなあに?
Search
k.ishikawa
April 25, 2024
Programming
0
110
DDD 値オブジェクトってなあに?
2024-04-25 社内勉強会で発表した資料です
k.ishikawa
April 25, 2024
Tweet
Share
More Decks by k.ishikawa
See All by k.ishikawa
正しいテスト駆動開発についてまとめてみた
ishikawa096
0
30
DDD ユビキタス言語ってなあに?
ishikawa096
0
20
リソース効率とフロー効率についてざっくりまとめてみた
ishikawa096
0
18
ChatGPT×AWS LambdaのSlack Botを社内運用してみた
ishikawa096
1
63
Other Decks in Programming
See All in Programming
Cell-Based Architecture
larchanjo
0
140
Rubyで鍛える仕組み化プロヂュース力
muryoimpl
0
150
認証・認可の基本を学ぼう前編
kouyuume
0
260
Canon EOS R50 V と R5 Mark II 購入でみえてきた最近のデジイチ VR180 事情、そして VR180 静止画に活路を見出すまで
karad
0
130
AIエージェントの設計で注意するべきポイント6選
har1101
5
1.9k
從冷知識到漏洞,你不懂的 Web,駭客懂 - Huli @ WebConf Taiwan 2025
aszx87410
2
2.9k
AI 駆動開発ライフサイクル(AI-DLC):ソフトウェアエンジニアリングの再構築 / AI-DLC Introduction
kanamasa
11
3.4k
これならできる!個人開発のすゝめ
tinykitten
PRO
0
120
脳の「省エネモード」をデバッグする ~System 1(直感)と System 2(論理)の切り替え~
panda728
PRO
0
120
モデル駆動設計をやってみようワークショップ開催報告(Modeling Forum2025) / model driven design workshop report
haru860
0
280
まだ間に合う!Claude Code元年をふりかえる
nogu66
5
880
Pythonではじめるオープンデータ分析〜書籍の紹介と書籍で紹介しきれなかった事例の紹介〜
welliving
2
450
Featured
See All Featured
Navigating Weather and Climate Data
rabernat
0
47
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.1k
The SEO identity crisis: Don't let AI make you average
varn
0
32
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
33
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
170
Applied NLP in the Age of Generative AI
inesmontani
PRO
3
2k
How to train your dragon (web standard)
notwaldorf
97
6.4k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
9.8k
Building a Scalable Design System with Sketch
lauravandoore
463
34k
Typedesign – Prime Four
hannesfritz
42
2.9k
Design in an AI World
tapps
0
95
Agile that works and the tools we love
rasmusluckow
331
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
ありがとうございました!