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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
増田 亨
PRO
November 24, 2021
Programming
12k
10
Share
ドメイン駆動設計とイミュータブルなクラス設計
クラスをイミュータブルに設計するパターンの紹介
・閉じた操作
・withメソッド
・イベントリポジトリ&集約ファクトリ
増田 亨
PRO
November 24, 2021
More Decks by 増田 亨
See All by 増田 亨
SCSD:事業価値を生み出すソフトウェア開発の実践技法
masuda220
PRO
2
100
AI時代のシステム設計:ドメインモデルで変更しやすさを守る設計戦略
masuda220
PRO
7
1.3k
競争優位を生み出す戦略的内製開発の実践技法
masuda220
PRO
4
650
ソフトウェア設計の課題・原則・実践技法
masuda220
PRO
29
24k
乱雑なコードの整理から学ぶ設計の初歩
masuda220
PRO
37
17k
ドメイン駆動設計のエッセンス
masuda220
PRO
20
8.6k
開発組織の戦略的な役割と 設計スキル向上の効果
masuda220
PRO
12
2.7k
ソフトウェア設計の実践的な考え方
masuda220
PRO
6
1.1k
技術書を効果的に内面化する実践技法
masuda220
PRO
33
12k
Other Decks in Programming
See All in Programming
ハーネスエンジニアリングにどう向き合うか 〜ルールファイルを超えて開発プロセスを設計する〜 / How to approach harness engineering
rkaga
26
18k
【26新卒研修資料】TDD実装演習
dip_tech
PRO
0
160
How We Practice Exploratory Testing in Iterative Development( #scrumniigata ) / 反復開発の中で、探索的テストをどう実施しているか
teyamagu
PRO
3
600
過去のレビュー知見をSkillsで資産化した話
pkshadeck
PRO
0
250
なぜあなたのコードには「コシ」がないのか?〜AI時代に問う、最後まで美味しい設計と戦略〜 #phpconkagawa / phpconkagawa2026
shogogg
0
110
Spec-Driven Development with AI Agents (Workshop, May 2026)
antonarhipov
2
270
GitHubCopilotCLIをはじめよう.pdf
htkym
0
310
Road to RubyKaigi: Play Hard(ware)
makicamel
1
530
The Less-Told Story of Socket Timeouts
coe401_
3
930
実用!Hono RPC2026
yodaka
2
290
2026_04_15_量子計算をパズルとして解く
hideakitakechi
0
130
tRPCの概要と少しだけパフォーマンス
misoton665
2
260
Featured
See All Featured
Mind Mapping
helmedeiros
PRO
1
180
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Done Done
chrislema
186
16k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
350
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
190
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.7k
Build your cross-platform service in a week with App Engine
jlugia
234
18k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
190
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.7k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
160
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.6k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
330
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 //新たな配分構成
イベントリポジトリ・集約ファクトリ データベース イベントリポジトリ 記録 発生した事実 集約ファクトリ 構築 集約のインスタンス イベントストアから導出 エンティティスナップショット(キャッシュ)
スナップショット+導出 事実の記録と集約の構築を非対称にする(集約を永続化しない) 集約を変更する時は、まず事実を記録してから集約インスタンスを生成する 目的ごとに異なる集約 データ(事実)と ロジック(計算判断)を カプセル化