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
5
1.2k
ソフトウェアの実装と事業戦略を結びつける
masuda220
PRO
19
6.9k
ソフトウェア設計と生成AI
masuda220
PRO
15
3.5k
ドメイン駆動設計の実践
masuda220
PRO
28
10k
いまどきの分析設計パターン10選
masuda220
PRO
36
13k
大きな泥団子に立ち向かう
masuda220
PRO
27
12k
開発活動の参照モデルを使ったベンチマーキングと最適化
masuda220
PRO
6
790
設計の知識と技能で駆動するソフトウェア開発
masuda220
PRO
26
21k
マネジメントの知識がドメイン駆動設計を加速する.pdf
masuda220
PRO
2
750
Other Decks in Programming
See All in Programming
The future of development – Are our jobs getting harder or easier?
hollycummins
1
210
組織に自動テストを書く文化を根付かせる戦略(2024秋版) / Building Automated Test Culture 2024 Autumn Edition
twada
PRO
9
3.6k
Vaporモードを大規模サービスに最速導入して学びを共有する
kazukishimamoto
3
2.1k
2024-10-01 dev2next - Observability for Modern JVM Applications
jonatan_ivanov
1
140
【YAPC::Hakodate 2024】TypeScriptエンジニアが感じたPerlのここが面白い
kimitashoichi
1
480
空間の中でアイドルとレッスンする技術 - 1st "Vision" / Spatial Lesson technologies with my idol - 1st "Vision"
banjun
PRO
0
250
4年間変わらなかった YOUTRUSTのアーキテクチャ
daiki1003
2
680
個人開発で使ってるやつを紹介する回
yohfee
1
730
(Deep|Web) Link support with expo-router
mrtry
0
190
LangChain & LangServeでAPIを爆速作成
kijitorabuti
2
360
いかにして不足・不整合なくデータ移行したか
tjmtmmnk
1
910
Vitest Browser Mode への期待 / Vitest Browser Mode
odanado
PRO
1
1.2k
Featured
See All Featured
Designing on Purpose - Digital PM Summit 2013
jponch
114
6.9k
Embracing the Ebb and Flow
colly
84
4.4k
Music & Morning Musume
bryan
46
6.1k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
26
710
Typedesign – Prime Four
hannesfritz
39
2.4k
Side Projects
sachag
452
42k
Six Lessons from altMBA
skipperchong
26
3.4k
It's Worth the Effort
3n
183
27k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
106
48k
Being A Developer After 40
akosma
85
590k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
250
21k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
26
4.1k
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 //新たな配分構成
イベントリポジトリ・集約ファクトリ データベース イベントリポジトリ 記録 発生した事実 集約ファクトリ 構築 集約のインスタンス イベントストアから導出 エンティティスナップショット(キャッシュ)
スナップショット+導出 事実の記録と集約の構築を非対称にする(集約を永続化しない) 集約を変更する時は、まず事実を記録してから集約インスタンスを生成する 目的ごとに異なる集約 データ(事実)と ロジック(計算判断)を カプセル化