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
10
12k
ドメイン駆動設計とイミュータブルなクラス設計
クラスをイミュータブルに設計するパターンの紹介
・閉じた操作
・withメソッド
・イベントリポジトリ&集約ファクトリ
増田 亨
PRO
November 24, 2021
Tweet
Share
More Decks by 増田 亨
See All by 増田 亨
AI時代のシステム設計:ドメインモデルで変更しやすさを守る設計戦略
masuda220
PRO
5
1k
競争優位を生み出す戦略的内製開発の実践技法
masuda220
PRO
3
570
ソフトウェア設計の課題・原則・実践技法
masuda220
PRO
28
24k
乱雑なコードの整理から学ぶ設計の初歩
masuda220
PRO
37
17k
ドメイン駆動設計のエッセンス
masuda220
PRO
19
8.5k
開発組織の戦略的な役割と 設計スキル向上の効果
masuda220
PRO
12
2.6k
ソフトウェア設計の実践的な考え方
masuda220
PRO
6
1k
技術書を効果的に内面化する実践技法
masuda220
PRO
33
12k
開発チーム・開発組織の設計改善スキルの向上
masuda220
PRO
21
13k
Other Decks in Programming
See All in Programming
encoding/json/v2のUnmarshalはこう変わった:内部実装で見る設計改善
kurakura0916
0
410
Kubernetesでセルフホストが簡単なNewSQLを求めて / Seeking a NewSQL Database That's Simple to Self-Host on Kubernetes
nnaka2992
0
120
grapheme_strrev関数が採択されました(あと雑感)
youkidearitai
PRO
1
220
Swift ConcurrencyでよりSwiftyに
yuukiw00w
0
270
nilとは何か 〜interfaceの構造とnil!=nilから理解する〜
kuro_kurorrr
3
1.9k
メタプログラミングで実現する「コードを仕様にする」仕組み/nikkei-tech-talk43
nikkei_engineer_recruiting
0
190
Goの型安全性で実現する複数プロダクトの権限管理
ishikawa_pro
2
340
S3ストレージクラスの「見える」「ある」「使える」は全部違う ─ 体験から見た、仕様の深淵を覗く
ya_ma23
0
530
野球解説AI Agentを開発してみた - 2026/02/27 LayerX社内LT会資料
shinyorke
PRO
0
300
What Spring Developers Should Know About Jakarta EE
ivargrimstad
0
510
Go Conference mini in Sendai 2026 : Goに新機能を提案し実装されるまでのフロー徹底解説
yamatoya
0
590
コーディングルールの鮮度を保ちたい / keep-fresh-go-internal-conventions
handlename
0
200
Featured
See All Featured
The SEO Collaboration Effect
kristinabergwall1
0
390
So, you think you're a good person
axbom
PRO
2
2k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.3k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
199
73k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
140
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
290
Amusing Abliteration
ianozsvald
0
130
Java REST API Framework Comparison - PWX 2021
mraible
34
9.2k
The Cost Of JavaScript in 2023
addyosmani
55
9.8k
Leo the Paperboy
mayatellez
4
1.5k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.4k
Building Applications with DynamoDB
mza
96
7k
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 //新たな配分構成
イベントリポジトリ・集約ファクトリ データベース イベントリポジトリ 記録 発生した事実 集約ファクトリ 構築 集約のインスタンス イベントストアから導出 エンティティスナップショット(キャッシュ)
スナップショット+導出 事実の記録と集約の構築を非対称にする(集約を永続化しない) 集約を変更する時は、まず事実を記録してから集約インスタンスを生成する 目的ごとに異なる集約 データ(事実)と ロジック(計算判断)を カプセル化