Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
ドメイン駆動設計とイミュータブルなクラス設計
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
増田 亨
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
12
5.9k
今こそ聞きたいソフトウェア設計 ドメイン駆動設計再入門
masuda220
PRO
18
8.5k
データエンジニアリングとドメイン駆動設計
masuda220
PRO
17
3.3k
AI 時代のソフトウェア設計の学び方
masuda220
PRO
31
15k
SCSD:事業価値を生み出すソフトウェア開発の実践技法
masuda220
PRO
4
380
AI時代のシステム設計:ドメインモデルで変更しやすさを守る設計戦略
masuda220
PRO
10
1.6k
競争優位を生み出す戦略的内製開発の実践技法
masuda220
PRO
5
870
ソフトウェア設計の課題・原則・実践技法
masuda220
PRO
30
25k
乱雑なコードの整理から学ぶ設計の初歩
masuda220
PRO
38
18k
Other Decks in Programming
See All in Programming
20260914 AIエージェント時代のPlatform Engineering LLM基盤とプロダクトの責務境界線
kanfab1
7
2.4k
ハーネス設計入門 〜 基礎知識の整理から実務へのステップアップ 〜
kinopeee
20
21k
iOS 27でニュースアプリはどう変わる!? 〜日経電子版の新機能対応と、開発事例から〜
lynnswap
7
13k
カツオ、ご期待ください
suneo3476
0
150
The Rails Doctrine Decade
koic
2
510
Ghostty + Neovimで作る 透明でカッコ良い開発環境
j341nono
0
150
AI時代のコードレビューは人に向けるな、仕組みに向けろ
texmeijin
5
3.5k
Domain-Driven Transformation
hschwentner
2
2.3k
Are APIs Still Relevant in the AI Era?
soyuka
0
430
R8 の設定見直しでアプリサイズ削減
andpad
0
180
re:Inventに行く前に知っておきたい現地参加のノウハウ
nokomoro3
0
370
Agents on Rails - Rails at Scale 2026
irinanazarova
0
340
Featured
See All Featured
Measuring & Analyzing Core Web Vitals
bluesmoon
9
1k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Faster Mobile Websites
deanohume
310
32k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.2k
Chasing Engaging Ingredients in Design
codingconduct
0
340
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.5k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
790
Mobile First: as difficult as doing things right
swwweet
225
10k
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 //新たな配分構成
イベントリポジトリ・集約ファクトリ データベース イベントリポジトリ 記録 発生した事実 集約ファクトリ 構築 集約のインスタンス イベントストアから導出 エンティティスナップショット(キャッシュ)
スナップショット+導出 事実の記録と集約の構築を非対称にする(集約を永続化しない) 集約を変更する時は、まず事実を記録してから集約インスタンスを生成する 目的ごとに異なる集約 データ(事実)と ロジック(計算判断)を カプセル化