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
DDD TW 7th 導讀 - Ch11 Factory
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
James Wang
July 03, 2019
Programming
440
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
DDD TW 7th 導讀 - Ch11 Factory
James Wang
July 03, 2019
More Decks by James Wang
See All by James Wang
AI 輔助遺留系統現代化的經驗分享
jame2408
1
1.2k
AI 寫得更快,你真的懂嗎?
jame2408
0
240
實踐 BizDevOps 在遺留系統中的挑戰與策略
jame2408
0
540
DDD 中的橋樑:透過有效建模與設計從戰略走向戰術
jame2408
0
590
從領域知識到架構設計
jame2408
1
320
淺談領域驅動設計
jame2408
1
630
淺談自動化測試
jame2408
0
360
Domain Driven Design The First 15 Years 導讀分享
jame2408
0
450
Domain Storytelling 領域敘事 - 簡介圖示語言
jame2408
2
2.8k
Other Decks in Programming
See All in Programming
Go1.27で導入されるジェネリクスメソッドでできること
mackee
0
260
20260623_Loop Engineeringで自分の分身の問い合わせBotを作る
ryugen04
0
190
AI駆動開発を妨げる技術的負債の解消アプローチ / ai-refactoring-approach
minodriven
17
8.8k
これからAgentCoreを触る方へトレンドはGatewayです
har1101
6
480
AIを活用したE2Eテスト実装効率化のあゆみ / ebisu-mobile-14-kotetu
kotetuco
0
160
トークンをケチるな、設計しろ:GitHub Copilotを賢く使うコンテキスト戦略
ochtum
0
300
Performance Engineering for Everyone
elenatanasoiu
0
260
継続モナドとリアクティブプログラミング
yukikurage
3
450
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
180
そのテスト、説明できますか?~LWテスト戦略FW~のご紹介
nakahara
0
200
ADKを使って簡単にAIエージェントを作ってみよう
k1mu21
0
290
PHPだって関数型したい 〜できること、できないこと〜 / fp-in-php
jsoizo
0
170
Featured
See All Featured
4 Signs Your Business is Dying
shpigford
187
22k
RailsConf 2023
tenderlove
30
1.5k
Paper Plane (Part 1)
katiecoart
PRO
0
9.5k
Statistics for Hackers
jakevdp
799
230k
YesSQL, Process and Tooling at Scale
rocio
174
15k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
67
56k
Navigating Weather and Climate Data
rabernat
0
280
Building AI with AI
inesmontani
PRO
1
1.1k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.5k
From π to Pie charts
rasagy
0
230
Between Models and Reality
mayunak
4
370
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.3k
Transcript
Factory in DDD 2019/07/03 DDD TW James Wang
大家知道工廠模式嗎? (知道的話今天導讀就到這邊了)
工廠模式 1. 很多變形:Abstract Factory、Factory Method、Builder…… 2. 透過封裝內部結構,簡化 Client 端「建立」和「重建」複雜物件流程。 Client
FACTORY Product new create product
在 DDD 中,該如何運用工廠模式?
Factory in DDD 當建立一個物件或建立整個 Aggregate 時,如果建立的工作很複雜,或者暴露過多的 內部結構,則可以使用 Factory 進行封裝。 使用動機:
• 將建立複雜物件的實例和 Aggregate 的職責轉移給單獨的物件。 • 封裝建立 Aggregate 時所有職責,譬如創建物件時的檢核。舉例來說,建立「狗」 的物件,傳入屬性「狗腿」個數,則需檢核「狗腿」不能大於 4 條腿。 • 透過工廠,建立 Aggregate 時要把它作為一個整體,並確保它滿足固定規則。
Aggregate Root 中的 Factory • 最常見的運用之一。 • 主要職責是一口氣將該 Aggregate Root
底下所有 Aggregate 建立起來。 • 也負責建立 Aggregate 所需邏輯與檢核。
一般的寫法 建構式中做完初始化所有功能。 public class Order : EntityBase, IAggregateRoot { public
decimal Total { get; private set; } public Order(Guid id, IEnumerable<Product> orderItems) : base(id) { // 針對 Products 檢核(略) // 計算總金額 var total = 0m; foreach (var item in orderItems) { if (item.UnitPrice > 0) { total += item.UnitPrice; } else { throw new ArgumentOutOfRangeException(nameof(item.UnitPrice)); } } Total = total; } }
套用工廠寫法 透過工廠呼叫 Aggregate Root。 public class OrderFactory { public Order
Create(Guid id, IEnumerable<Product> orderItems) { // 針對 Products 檢核(略) // 計算總金額(略) return new Order(id, orderItems); } }
套用工廠寫法 另外一種寫法。 public class Order : EntityBase, IAggregateRoot { public
List<Product> OrderItems { get; } = new List<Product>(); private Order(Guid id) : base(id) { } public static Order NewOrder(Guid id) { return new Order(id); } public void Create(IEnumerable<Product> orderItems) { // 針對 Products 檢核(略) // 計算總金額(略) } }
各式各樣的工廠 • Domain Service Factory • Entity Factory • Value
Object Factory 簡單說,當你發現建造物件很複雜時,都能套用工廠模式。 BUT… 有時候其實是你設計不好導致太複雜。 所以套用工廠模式前,請回頭看看自己的設計是否有沒有問題。
Recap • 當覺得建立或重建物件很複雜或想要隱藏細節的地方,都能用工廠。 • 在 DDD 中,常用於 Aggregate Root,在建立 Aggregate
時要把它視為一個整體 ,並確保它滿足固定規則,保證 Aggregate 狀態的正確性。 • 使用工廠之前,先確認所謂的複雜是不是設計不良引起的。有些情況下只需要使 用建構子。 • 工廠是放置固定規則相關邏輯的合適地方。 • 透過工廠封裝,表達限界上下文的通用語言。