DDD精粹速讀(一)

公众号-JavaEdge發表於2024-08-22

1 你需要知道的 - 戰略設計

DDD是一種軟體設計和構建方法,其重點在於獨立於資料持久化等技術問題,準確表達業務規則。

不幸,DDD 對新手來說極具挑戰性,部分原因是它有許多獨特的概念需要學習。本文我簡要介紹這些重要的思想,以便你能自信繼續你的 DDD 旅程。

第一部分將側重於與所有參與軟體開發的人相關的概念,而不僅僅是開發人員。第二部分專門針對編碼人員,但無論如何你都可以隨意檢視!

2 我只剩一分鐘空閒!

如果你只能從這篇文章中記住兩點,那麼 DDD 的核心主張是:

2.1 模型驅動設計

在自包含的領域模型中建模業務流程和規則是重中之重。從資料庫設計到架構的其他所有內容都是次要的考慮因素。

2.2 通用語言

開發生命週期中的每個人都應該在特定上下文中使用領域/業務語言進行溝通。理想情況下,會維護一些輕量且易於訪問的通用語言文件。

3 戰略設計和戰術設計

DDD 包含兩個相關的學科:戰略設計戰術設計

戰略設計

涉及大局觀:理解業務需要解決的問題;業務如何獲得競爭優勢;團隊之間的關係;並在考慮這些問題的情況下,決定要構建什麼軟體。

戰術設計

涉及使構建有用領域模型更簡單的模式、工具和實踐。當我們需要建模複雜的業務邏輯或未來可能引入複雜性時,我們使用戰術設計。

本質上:

  • 戰略設計是關於我們需要構建什麼
  • 戰術設計是關於我們如何構建它

4 通用語言

無論是戰略設計還是戰術設計,其核心思想都是通用語言。這是一組明確且定義良好的術語,密切反映了業務環境中的語言。在對話、需求和程式碼中一致使用通用語言,可以消除從開發者術語到業務術語之間頻繁轉換所帶來的負擔和錯誤。

5 問題空間和解決方案空間

想象一下,一家公司提供外包的倉庫運營服務(WOaaS)。它的“獨門絕技”在於如何管理倉庫庫存,但它還需要進行銷售、廣告、跟蹤工時等。

每個問題區域都可以被描述為一個子域。對於這家 WOaaS 公司,一個簡化的問題空間地圖可能如下:

圖1: 一個分為四個部分的子域/問題空間簡化圖,標籤為交付/收集、庫存、銷售和財務

在一個領域中識別問題區域稱為問題空間分析。這需要與領域專家,即最瞭解業務的人密切合作。

將問題空間對映到當前的企業架構上,就得到了解決方案空間

圖2: 一個分為四個部分的“現狀”解決方案空間圖。交付/收集部分有一個標記為第三方 SaaS 的紫色圓圈。另一個更大的紫色圓圈標記為遺留系統,覆蓋了剩下的銷售、庫存和財務部分

接下來,我們想要確定一個更理想的解決方案空間。為此,反思通用語言的一個後果是很有幫助的。

6 有界上下文

在我們的例子中,一個遺留系統試圖解決多個問題區域。儘管有才華的個人付出了最大的努力,它可能還是會因為一個簡單的原因而面臨高缺陷率和維護成本。

在每個子域中,詞語和短語都有特定的含義。一個擁有衝突術語的程式碼庫必然會迫使團隊成員建立一種新的、即興的語言,並且必須將其轉換為業務語言。不可避免地,這會導致錯誤、誤解、入職緩慢、部落知識等各種問題。

透過試圖建立滿足多個子域需求的軟體,我們的模型變得臃腫、混亂且含糊不清,導致效能問題和複雜性升級。

戰略設計建議每個子域單獨使用一個系統。我們可以將這些系統描述為有界上下文,在每個上下文內都有明確的通用語言

現在,回到 WOaaS 公司。我們如何確定一個更理想的“未來”企業架構?我們應該構建什麼才能實現最佳的業務結果?

7 核心領域

應該在業務創造競爭優勢的子域中投入最多的資源,這些子域就是核心領域。在我們的例子中,這是庫存子域。

應該為庫存子域建立一個有界上下文,並組建最好的團隊來開發它。

圖3: 一個分為四個部分的“未來”解決方案空間簡化圖。交付/收集部分有一個標記為第三方 SaaS 的紫色圓圈。在庫存部分有一個更大的紫色圓圈,標記為首要任務:庫存有界上下文。另一個較小的紫色便籤標記為遺留系統,覆蓋了銷售和財務部分

其他子域被稱為通用子域支援子域。儘管它們很重要,但無論發票系統多麼“美觀”,它都不會使企業在競爭中脫穎而出。覆蓋這些子域的系統可能是商業現成產品或外包開發的候選者。

核心領域值得最大的投資和 DDD 的戰術設計的全力支援……你可以在本系列的第二部分閱讀更多內容。

領域模型:僅描述業務環境中相關事物的行為、屬性和互動的程式碼。它完全不涉及執行時環境、持久化、託管環境等問題。

關注我,緊跟本系列專欄文章,咱們下篇再續!

作者簡介:魔都架構師,多家大廠後端一線研發經驗,在分散式系統設計、資料平臺架構和AI應用開發等領域都有豐富實踐經驗。

各大技術社群頭部專家博主。具有豐富的引領團隊經驗,深厚業務架構和解決方案的積累。

負責:

  • 中央/分銷預訂系統效能最佳化
  • 活動&券等營銷中臺建設
  • 交易平臺及資料中臺等架構和開發設計
  • 車聯網核心平臺-物聯網連線平臺、大資料平臺架構設計及最佳化
  • LLM Agent應用開發
  • 區塊鏈應用開發
  • 大資料開發挖掘經驗
  • 推薦系統專案

目前主攻市級軟體專案設計、構建服務全社會的應用系統。
本文由部落格一文多發平臺 OpenWrite 釋出!

相關文章