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
ドメイン駆動設計とイミュータブルなクラス設計
Search
増田 亨
PRO
November 24, 2021
Programming
9
11k
ドメイン駆動設計とイミュータブルなクラス設計
クラスをイミュータブルに設計するパターンの紹介
・閉じた操作
・withメソッド
・イベントリポジトリ&集約ファクトリ
増田 亨
PRO
November 24, 2021
Tweet
Share
More Decks by 増田 亨
See All by 増田 亨
ビジネスモデリング道場 目的と背景
masuda220
PRO
10
1.5k
ソフトウェアエンジニアの成長
masuda220
PRO
13
2.2k
分散型アーキテクチャとドメイン駆動設計
masuda220
PRO
9
3.3k
ソフトウェア開発の複雑さに立ち向かう
masuda220
PRO
13
15k
『ドメイン駆動設計をはじめよう』のモデリングアプローチ
masuda220
PRO
9
930
現場で役立つモデリング 超入門
masuda220
PRO
15
4k
『ドメイン駆動設計をはじめよう』中核の業務領域
masuda220
PRO
8
2.1k
ソフトウェアの実装と事業戦略を結びつける
masuda220
PRO
19
7.6k
ソフトウェア設計と生成AI
masuda220
PRO
15
3.8k
Other Decks in Programming
See All in Programming
AI Agentを利用したAndroid開発について
yuchan2215
0
180
コードジェネレーターで 効率的な開発をする / Efficient development with code generators
linyows
0
170
Your Architecture as a Crime Scene:Forensic Analysis @bastacon 2025 in Frankfurt
manfredsteyer
PRO
0
170
OUPC2024 Day 1 解説
kowerkoint
0
360
ローコードサービスの進化のためのモノレポ移行
taro28
1
230
AIレビュー導入によるCIツールとの共存と最適化
kamo26sima
1
1.4k
CSC486 Lecture 14
javiergs
PRO
0
140
令和トラベルにおけるコンテンツ生成AIアプリケーション開発の実践
ippo012
1
210
DenoでOpenTelemetryに入門する
yotahada3
1
240
保守性を高める AWS CDK のセオリー・ベストプラクティス
yamanashi_ren01
5
690
PHPによる"非"構造化プログラミング入門 -本当に熱いスパゲティコードを求めて- by きんじょうひでき
o0h
PRO
0
180
JavaOne 2025: Advancing Java Profiling
jbachorik
1
240
Featured
See All Featured
The Language of Interfaces
destraynor
156
24k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.5k
Fireside Chat
paigeccino
37
3.3k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
The Pragmatic Product Professional
lauravandoore
32
6.5k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
115
51k
Designing Experiences People Love
moore
140
23k
Speed Design
sergeychernyshev
28
840
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
134
33k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5.3k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
233
17k
Transcript
ドメイン駆動設計と イミュターブルな設計 2021年11月24日 有限会社システム設計 増田
『ドメイン駆動設計』のエッセンス 第3章 モデル駆動設計(モデルと実装を一致させる) 第10章 しなやかな設計(変更を楽で安全にする設計パターン) 第15章 蒸留(コアドメインに集中する)
クラス設計の方針の違い できれば イミュータブルにする できるだけ イミュータブルにする かならず イミュータブルにする
クラス設計の方針の違い できれば イミュータブルにする できるだけ イミュータブルにする かならず イミュータブルにする 値オブジェクト 副作用のない関数 閉じた操作
宣言的な設計スタイル ドメイン・プリミティブ 部分的不変エンティティ エンティティスナップショット エンティティリレー 値オブジェクト コレクションオブジェクト 区分オブジェクト 口座・履歴パターン
イミュータブルなクラスの設計パターン 閉じた操作 withメソッド (setterの代替) イベントリポジトリ・集約ファクトリ
閉じた操作 操作(メソッド)の引数の型と返す値の型が、そのクラスの型に閉じる String#concat(String other) : String BigDecimal#add(BigDecimal other) : BigDecimal
Money#add(Money other) : Money Quantity#add(Quantity other) : Quantity Set#union(Set other) : Set Map#merge(Map other) : Map イミュータブルな値オブジェクトの基本パターン
withメソッドパターン イミュターブルなクラスを設計する時のsetterの代替パターン 不変なオブジェクトを元に別インスタンスを作成する LocaDate#withMoth(int month) : LocalDate LocalDate#withYear(int year) :
LocalDate SalesOrder#add(ItemLine itemLine) : SalesOrder //別インスタンス イミュータブルな集約への応用例(『ドメイン駆動設計』10章) SharePie#比例配分with(long 配分する総額) : SharePie //新たな配分構成
イベントリポジトリ・集約ファクトリ データベース イベントリポジトリ 記録 発生した事実 集約ファクトリ 構築 集約のインスタンス イベントストアから導出 エンティティスナップショット(キャッシュ)
スナップショット+導出 事実の記録と集約の構築を非対称にする(集約を永続化しない) 集約を変更する時は、まず事実を記録してから集約インスタンスを生成する 目的ごとに異なる集約 データ(事実)と ロジック(計算判断)を カプセル化