DDD 領域驅動設計文章導讀
DDD 領域驅動設計文章導讀
pictrue from:https://zh.wikipedia.org/wiki/%E7%BB%9F%E4%B8%80%E5%BB%BA%E6%A8%A1%E8%AF%AD%E8%A8%80
前言
其實我接觸 DDD 的時間並不長,我進行專案工作的時間幾乎 20 個年頭的我,接觸與真的實務應用 DDD 也不過是 2019 年底左右,當時 Containers & Microservices 正盛起,連帶的讓 DDD 的開發方法論在台灣萌芽(雖然 DDD 與微服務沒什麼直接關係、許多是商業炒作)包括微軟在推的 Docker 與 運行在 Cloud/Azure 的 AKS(Azure Kubernetes)等等,都有許多官方 Docs 文件說明著如何運用 DDD 的設計導向微軟的微服務模型、或是『使用 .NET 設計與實作微服務模型』等等,不過當然,這還是沒什麼直接的關係XD 只不過,你要弄清楚的是,DDD 不是萬靈丹能夠解決你將現有系統無痛的上 Cloud 的 Microservices 環境,而是,透過 DDD 的 Bounded Context/Context Map 概念,可以幫助你切割現有單體式系統中服務的商業體系、像是如何切割 Context、各 Context 之間如何(通信 / 溝通) 等等。
以下,我將先前所有撰寫過的 DDD 相關的文章,依照學習上的順序,為讀者們做個導讀。
學習 DDD 其實有些門檻,以下我列幾種情境供各位參考:
一、寫程式 1-2 年、物件導向基礎還在學習者
二、寫程式超過 5 年、物件導向已熟悉(包括:SOLID, GoF Design Patterns)
三、[延伸第二點]也接觸過 OOA/OOD 並有過專案開發經歷過完整分析設計流程 + 抽象化能力(若有接觸過分析階段的 UML 更加分)
四、已經熟悉 OOA/OOD 與 OOP 也具備上述三點條件,並實作過 Clean Architecture
為什麼第三點我要特別提到『若有接觸過分析階段的 UML 更加分』呢?(1)分析階段的 UML 是什麼?(2)以及為什麼一定要使用 UML?我先回答第二個問題,UML 只是眾多分析階段圖形的一種,像是 BPMN, SysML 也都是業界的商業分析中,常見的圖形分析 Syntax/Notations 等表示法,但我的重點是在於說,分析階段進行的是[正向工程]的開發,可能許多朋友對這些圖形的瞭解大部分是在[程式碼 Reverse Engineering to 類別圖 或 它種分析圖形]的概念上,這種既叫做『逆向工程』不是軟體工程中的某個過程,軟體開發是一種抽象化思考 -> 並導入實作程式碼的一個過程,因為你通常只會從客戶那裏聽到『一個想法』,但你要『付諸實現』!
所以,回到第二個問題,分析階段的圖形(以 UML 為例),讓你整理腦中抽象化客戶端需求的思緒 + 具體化(設計 Design)的一個過程,更重要的是,與實作之間的串接,而已 UML 來舉例的原因就是 UML 是比較容易與 "實作" 串接的 Methodology,而這就是我所謂的『正向工程』,但這是比較需要長時間的【練習】跟【揣摩】的,這也是我認為學習 UML 中,門檻比較高的部分。
學習正向工程,可以參考我的[決戰 OOAD 系列課程(線上課程)]。
再回到我們的主題:
一、寫程式 1-2 年、物件導向基礎還在學習者
這裡,我的建議是從最基礎的 OO (Object Oriented) 開始,因為那是一切知識源頭,所有的一切基礎,如果你仍然使用物件導向相關程式語言與設計工具的話(這年頭幾乎每一個程式語言都是支援物件導向的),那這是再基礎不過了。正因為你現在所看見的,像是 Clean Architecture (使用 Java)、重構 Refactoring (使用 Java) 基本上認知,都是假定你已經最少熟悉一項物件導向的程式語言,所以物件導向概念的重要性可想而知。
而這裡,如果程式碼開發對你來說已經是家常便飯,但是你需要擴充的知識可能是更進階的實作模式等,我會建議下面 3 本書:
- Martin Fowler: Refactoring 重構 - 改善既有的程式設計
- Kent Beck: Kent Beck 的實作模式 Implementation Patterns
- Uncle Bob (Robert C. Martin): Clean Architecture 整潔的程式碼 與 Clean Code 無瑕的程式碼
因為程式設計師有 80% 的時間,其實都在讀程式碼,只有 20% 的時間是在撰寫程式碼,為什麼這麼說呢?難道程式設計師在讀別人的程式嗎?其實、程式設計師 大部分時間是在讀自己撰寫的程式碼,因為你自己寫的程式碼能不能被明天的你自己讀懂?這往往都是否定的,書中提到許多實作模式的理論基礎,以『透過程式碼與人溝通』為主要的價值觀來加以敘述一開始所了解的價值,再配合六大原則:局部化影響、最小化重複、將邏輯與茲要綑綁、對稱性、宣告示表達和變化率,幫助進入 Kent Beck 的極限編程 XP 模式,非常有趣。
二、寫程式超過 5 年、物件導向已熟悉(包括:S.O.L.I.D., GoF Design Patterns)
如果您已經具備上述條件、經歷,這裡我會建議多練習『抽象化』的能力與思考模式,這時也可以去看[Eric Evans: Domain Driven Design 領域驅動設計]一書,揣摩分析 -> 設計 -> 實作 的一個過程,若您 UML 不熟悉,則我推薦去看幾本 UML 推薦書籍。
DDD 的簡介,也可以參考我的 Slide: 深入淺出領域驅動設計:以 .NET 5 與線上房貸申請系統為例:
再來,我記得我過去曾經提過,由於 DDD 相較於 TDD 其實門檻更高,它尋求一種 Ubiquitous Language 通用語言來作為團隊內溝通 甚至 與客戶溝通時無隔閡的『語言』、通常是使用客戶的 Domain 用語,並以此建立 Domain Modeling 領域模型,且 DDD 仍走迭代開發,甚至可以適用於敏捷,以及 DDD 可能認為 UML 是基本能力,因為你的 Domain Modeling 不是虛幻的產生,必須是要能夠描述成『程式碼』的!有興趣可看投影片中關於 DDD 的戰略(Strategic)與 戰術(Tactical)的說明。
另外就是,我在先前幾篇文章中,也提過 TDD 方法論,應該說,甚至是你在 DDD 方法論下面也是可以使用 XP 極限編程,再有一個 Domain Modeling 的情況下,先寫紅燈測試,當然必須在 Unit Test 的保護下 + 持續的重構程式嗎,這可以參考下面三篇文章:
(1). 敏捷的軟體架構設計:可擴展的軟體架構
http://gelis-dotnet.blogspot.com/2019/04/blog-post_22.html
(2). 您的軟體架構夠敏捷嗎?(二)- 持續演進的軟體架構
http://gelis-dotnet.blogspot.com/2019/06/blog-post.html
(3). 您的軟體架構夠敏捷嗎?(三)- 使用 TDD 實現最後的設計
http://gelis-dotnet.blogspot.com/2020/05/blog-post.html
三、[延伸第二點]也接觸過 OOA/OOD 並有過專案開發經歷過完整分析設計流程 + 抽象化能力(若有接觸過分析階段的 UML 更加分)
假設、您已具備上述條件,對於[正向工程]也不陌生 + 也有實務經驗、甚至上過我的 OOAD 系列課程 XD,那麼,您可以直接學習以下文章的導讀順序。
(1). 軟體架構設計 與 DDD 相關問題的答客問
http://gelis-dotnet.blogspot.com/2021/01/ddd.html
(2). 在領域驅動下使用 Clean Achitecture 實現高可用軟體架構
http://gelis-dotnet.blogspot.com/2020/09/clean-achitecture-clean-architecture.html
(3). 以領域為中心的:線上房貸申請系統設計 use DDD
http://gelis-dotnet.blogspot.com/2021/04/use-ddd.html
(4). 以領域為核心重新設計的線上房貸申請系統 use DDD (2)
http://gelis-dotnet.blogspot.com/2021/05/use-ddd-2.html
(5). DDD 中為人所忽略的『軟體工程』與『工程實踐』方法
http://gelis-dotnet.blogspot.com/2020/10/blog-post.html
四、已經熟悉 OOA/OOD 與 OOP 也具備上述三點條件,並實作過 Clean Architecture
如果您已經具備這些條件,甚至專案中也實行過 DDD,那麼我們可以一起暢談在 Clean Architecture 實作篇 一書裡所探討的六角架構、以及實作過程是如何弄髒我們手的!
(1). 軟體架構設計:無題
本篇文章主要是以『六角架構 (Hexgonal Architecture)』為主體,闡述傳統的「階層式架構」的弊病、與使用六角架構會有什麼好處,並說明我們再進行軟體架構設計時,SOLID 其實給我們非常好的設計方向,並應用在各種場景裡面。
最後以我曾經設計的 API Framework 並說明這樣實作有那些好處、並解釋如何在【六角架構/整潔架構】中落實 Unit Test。
詳細文章如下連結:
http://gelis-dotnet.blogspot.com/2022/08/blog-post.html
(2). 軟體架構設計:有『題』- API 設計原則以『線上售票系統為例』
這是一篇以 DDD 的事件風暴 Event Storming 進行建模、撰寫程式碼的過程。
詳細文章如下連結:
https://gelis-dotnet.blogspot.com/2023/07/api.html
(3). 軟體架構設計:有『題』(二)- 為X宏網路售票系統加入 API First 網站
這是我先前撰寫過一篇『API 設計準則:從軟體工程切換至 API 開發的挑戰』這篇文章的進階版,以 API-First 角度,持續的(修正/完善)第一篇文章的架構與缺失。
詳細文章如下連結:
https://gelis-dotnet.blogspot.com/2023/08/x-api-first.html
目前暫時動筆到這裡,本文會持續更新 XDD
關於 Gelis:
資深 .NET 技術顧問
FB 社團 (軟體開發之路):
https://www.facebook.com/groups/361804473860062/
FB 粉絲團 (Gelis 的程式設計訓練營):
https://www.facebook.com/gelis.dev.learning/
我講授過的課程 SlideShare:
https://www.slideshare.net/GelisWu
以下是我經營的項目與內容:
(1). 企業內訓課程
(2). 專業顧問
企業內訓課程:
1. .NET Core 3.1 從入門到進階
先前實體課程連結
2. 跨平台的 Web API Framework 框架設計
先前實體課程連結
3. 決戰 OOAD 系列課程 - 使用 UML
先前實體課程連結
4. 單元測試 UnitTest 與 Moq 物件實務課程
先前實體課程連結
5. 快速開發系列 - C# Project Templates 範本設計
留言
張貼留言