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
10k
ドメイン駆動設計とイミュータブルなクラス設計
クラスをイミュータブルに設計するパターンの紹介
・閉じた操作
・withメソッド
・イベントリポジトリ&集約ファクトリ
増田 亨
PRO
November 24, 2021
Tweet
Share
More Decks by 増田 亨
See All by 増田 亨
開発活動の参照モデルを使ったベンチマーキングと最適化
masuda220
PRO
4
540
設計の知識と技能で駆動するソフトウェア開発
masuda220
PRO
20
18k
マネジメントの知識がドメイン駆動設計を加速する.pdf
masuda220
PRO
1
560
これだけは知っておきたいクラス設計の基礎知識
masuda220
PRO
45
28k
良い設計と悪い設計の違い
masuda220
PRO
19
20k
設計の考え方とやり方
masuda220
PRO
85
50k
設計の学び方:自分流のススメ
masuda220
PRO
15
9.8k
ドメインモデル方式のクラス設計 座談会
masuda220
PRO
5
2.5k
モデリングの費用対効果
masuda220
PRO
6
1.8k
Other Decks in Programming
See All in Programming
PHPはいつから死んでいるかの調査
chiroruxx
2
420
Domain-Driven Transformation
hschwentner
2
1.5k
はてなにおける CSS Modules、及び CSS Modules に足りないもの / CSS Modules in Hatena, and CSS Modules missing parts
mizdra
7
1k
Sheets API使ってみた
toshi0383
2
170
SIMD Parallel Programming with the Vector API
josepaumard
0
240
サイコロで理解する統計的仮説検定の考え方
tatamiya
4
1.1k
Go製Webアプリケーションのエラーとの向き合い方大全、あるいはやっぱりスタックトレース欲しいやん / Kyoto.go #50
utgwkk
6
1.9k
Next.js App Router
quramy
12
2k
Try creating your own orderedmap
kazamori
1
260
AmperとFleetを使ったAndroidアプリ
yoppie
0
280
GraphQLサーバの構成要素を整理する #ハッカー鮨 #tsukijigraphql / graphql server technology selection
izumin5210
4
920
大規模UIKitベースアプリへのTCAの段階的導入/gradual-adoption-of-tca-in-a-large-scale-uikit-based-app
takehilo
2
210
Featured
See All Featured
Code Reviewing Like a Champion
maltzj
515
39k
Large-scale JavaScript Application Architecture
addyosmani
504
110k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
660
120k
The Mythical Team-Month
searls
217
42k
Navigating Team Friction
lara
179
13k
A better future with KSS
kneath
231
16k
How STYLIGHT went responsive
nonsquared
92
4.8k
Agile that works and the tools we love
rasmusluckow
325
20k
Mobile First: as difficult as doing things right
swwweet
217
8.6k
Statistics for Hackers
jakevdp
790
220k
Documentation Writing (for coders)
carmenintech
60
4k
The Cult of Friendly URLs
andyhume
74
5.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 //新たな配分構成
イベントリポジトリ・集約ファクトリ データベース イベントリポジトリ 記録 発生した事実 集約ファクトリ 構築 集約のインスタンス イベントストアから導出 エンティティスナップショット(キャッシュ)
スナップショット+導出 事実の記録と集約の構築を非対称にする(集約を永続化しない) 集約を変更する時は、まず事実を記録してから集約インスタンスを生成する 目的ごとに異なる集約 データ(事実)と ロジック(計算判断)を カプセル化