Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
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
LLMで複雑な検索条件アセットから脱却する!! 生成的検索インタフェースの設計論
po3rin
4
920
Jetpack XR SDKから紐解くAndroid XR開発と技術選定のヒント / about-androidxr-and-jetpack-xr-sdk
drumath2237
1
180
0→1 フロントエンド開発 Tips🚀 #レバテックMeetup
bengo4com
0
270
AIエージェントを活かすPM術 AI駆動開発の現場から
gyuta
0
450
手が足りない!兼業データエンジニアに必要だったアーキテクチャと立ち回り
zinkosuke
0
800
tsgolintはいかにしてtypescript-goの非公開APIを呼び出しているのか
syumai
7
2.3k
DevFest Android in Korea 2025 - 개발자 커뮤니티를 통해 얻는 가치
wisemuji
0
170
Claude Codeの「Compacting Conversation」を体感50%減! CLAUDE.md + 8 Skills で挑むコンテキスト管理術
kmurahama
1
600
Kotlin Multiplatform Meetup - Compose Multiplatform 외부 의존성 아키텍처 설계부터 운영까지
wisemuji
0
110
Flutter On-device AI로 완성하는 오프라인 앱, 박제창 @DevFest INCHEON 2025
itsmedreamwalker
1
140
SwiftUIで本格音ゲー実装してみた
hypebeans
0
470
Rediscover the Console - SymfonyCon Amsterdam 2025
chalasr
2
180
Featured
See All Featured
Building Flexible Design Systems
yeseniaperezcruz
330
39k
Building an army of robots
kneath
306
46k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
0
130
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
0
1.8k
We Have a Design System, Now What?
morganepeng
54
7.9k
Bash Introduction
62gerente
615
210k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
280
Faster Mobile Websites
deanohume
310
31k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
1.8k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.6k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
61k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
320
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
ありがとうございました!