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
12k
10
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ドメイン駆動設計とイミュータブルなクラス設計
クラスをイミュータブルに設計するパターンの紹介
・閉じた操作
・withメソッド
・イベントリポジトリ&集約ファクトリ
増田 亨
PRO
November 24, 2021
More Decks by 増田 亨
See All by 増田 亨
今こそ聞きたいソフトウェア設計 ドメイン駆動設計再入門
masuda220
PRO
17
7.7k
データエンジニアリングとドメイン駆動設計
masuda220
PRO
15
3.1k
AI 時代のソフトウェア設計の学び方
masuda220
PRO
30
14k
SCSD:事業価値を生み出すソフトウェア開発の実践技法
masuda220
PRO
4
280
AI時代のシステム設計:ドメインモデルで変更しやすさを守る設計戦略
masuda220
PRO
9
1.5k
競争優位を生み出す戦略的内製開発の実践技法
masuda220
PRO
4
780
ソフトウェア設計の課題・原則・実践技法
masuda220
PRO
30
24k
乱雑なコードの整理から学ぶ設計の初歩
masuda220
PRO
38
18k
ドメイン駆動設計のエッセンス
masuda220
PRO
20
8.8k
Other Decks in Programming
See All in Programming
テーブルをDELETEした
yuzneri
0
150
AWS DevOps AgentのAzure接続機能を検証して見えた活用法/Use Cases Verified for the AWS DevOps Agent's Azure Connectivity Feature
masakiokuda
1
250
Building a Meta Ray-Ban display app
akkeylab
0
170
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
350
夏だ!祭りだ!祭りとはドメインモデリングでは?
ryugen04
0
340
Detecting Compromised CI with eBPF and Cilium Tetragon
lizrice
0
220
リアルな遅延を測る仕様
kota_yata
1
120
Claude Code全社展開のためにやったことn選~プラグイン302個・コミッター271人を支えるために~
kenchan
5
1.6k
AI時代に設計が 最大の生産性レバーになる 意図駆動開発とデータを消さない設計|Don't Delete Your Data or Your Intent — Design as the Deepest Lever in the AI Era
tomohisa
1
1.1k
Laravel Boostに学ぶ、AIにPHPを書かせる技術 〜OSSの実装から蒸留するエージェント制御の王道〜
kentaroutakeda
3
740
Go言語とトイモデルで学ぶTransformerの気持ち / fukuokago23-transformer
monochromegane
0
190
AI Engineeringは、AIプロダクトだけのものか? 〜AIがソフトウェアを作る時代の新しい当たり前〜 / No AI in your product. AI Engineering in your development.
rkaga
4
490
Featured
See All Featured
Fashionably flexible responsive web design (full day workshop)
malarkey
408
67k
Documentation Writing (for coders)
carmenintech
77
5.5k
What's in a price? How to price your products and services
michaelherold
247
13k
Color Theory Basics | Prateek | Gurzu
gurzu
0
430
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.8k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
210
Side Projects
sachag
455
43k
WENDY [Excerpt]
tessaabrams
11
39k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
630
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.4k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
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 //新たな配分構成
イベントリポジトリ・集約ファクトリ データベース イベントリポジトリ 記録 発生した事実 集約ファクトリ 構築 集約のインスタンス イベントストアから導出 エンティティスナップショット(キャッシュ)
スナップショット+導出 事実の記録と集約の構築を非対称にする(集約を永続化しない) 集約を変更する時は、まず事実を記録してから集約インスタンスを生成する 目的ごとに異なる集約 データ(事実)と ロジック(計算判断)を カプセル化