DDD精粹速讀(二)

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

前言

在上一篇文章中,我介紹了領域驅動設計(DDD)的戰略設計,以及如何處理大局。本篇文章將深入探討領域驅動設計(DDD)的核心——戰術設計。

Vaughn Vernon 在他的書《Implementing Domain Driven Design》(實現領域驅動設計)中巧妙地將戰略設計比作登山者規劃攀登路線,而戰術設計則比作他們所使用的工具。

戰術設計

戰術設計為我們提供了有用的指引和結構,幫助我們在領域模型中建立豐富且純粹的業務邏輯表達。當我們需要為一個複雜或潛在複雜的領域建模時,這些指引尤為有價值。

在DDD之外,實體通常會被建模為具有多個屬性,這些屬性可以被模型程式碼的呼叫者(客戶端)更改。這樣一來,客戶端需要自行執行業務規則(例如,價格不能為負)。其結果是,業務邏輯往往分散在我們的應用程式中,通常位於應用層/服務層或控制器中。

戰術設計建議我們的領域模型應該是封裝所有與系統服務的上下文/子領域相關的業務邏輯的地方。它位於我們應用程式的“核心”,並且不依賴於外部的架構層。

系統的行為透過領域模型的公共方法暴露出來,這些方法代表了使用者希望執行的有意義的任務(例如,SubmitOrder,ReserveItem)。模型的客戶端只能呼叫模型的這些方法。領域模型是使用統一語言構建的。

戰術設計工具箱中,有一些結構使領域建模變得更加簡單且有效。

實體

在戰術設計中,實體是具有身份的事物。其屬性可能會隨時間而改變,但實體本身依然是同一個實體。實體由其身份定義,而非其屬性的值。

例如你,一個人類(顯然)。即使你改了名字,你仍然是同一個人類。如果你有一個擁有相同屬性的雙胞胎,你們兩人也不是同一個人類。實體的內在身份獨立於其屬性。

值物件

值物件,與實體不同,它完全由其值定義,沒有身份。例如棕色這種顏色;它無法改變,否則就會變成另一種顏色。它由其值定義且不可變。

一種特別有用的值物件型別是命令,它表示系統必須響應的行動請求。

在實體的屬性中,應優先使用值物件而非原始型別,以封裝與值物件相關的驗證或業務邏輯,例如質量不能為負(在大多數領域中!)。

聚合 / 聚合根

通常,我們需要跨多個實體進行驗證以強制執行業務規則。

例如,“新使用者的電子郵件地址必須唯一”。

為了執行這一規則,我們必須將提供的地址與現有使用者的地址進行比較。我們透過在單個物件中構建聚合體,即實體和值物件的集合,以便在模型中實現此類驗證。

聚合體中的頂級物件稱為聚合根。聚合體內的物件的變更必須透過聚合根進行。聚合體可以引用其他聚合體,但只能透過聚合根的ID進行引用,以保持封裝性。

領域事件

當我們與領域專家交流時,他們經常提到已經發生的事件及對這些事件的響應。我們使用領域事件及相應的處理程式來對此進行建模。

有時還包括整合事件,以區分應該在成功的資料庫事務之前或之後處理的事件,儘管這也可以透過其他方式處理。

示例

上述四個結構是我們領域模型的核心構建模組,僅憑這些我們就可以對複雜領域進行清晰的建模。

例如一個訂單聚合根的方法:Confirm()。在這個方法中,我們可能會驗證訂單包含一個或多個訂單項,並且訂單的狀態為“待處理”,然後將訂單狀態更新為“已確認”,並觸發一個OrderConfirmed領域事件。我們可以處理此事件,以在其他聚合根中實現副作用,如交付限界上下文中的出貨聚合根。

倉儲

在DDD中,倉儲專門操作聚合根。它負責獲取聚合根,在此我們可以呼叫一個公共方法來更改其內部狀態,然後持久化更新後的聚合根。流行的ORM已經內建了出色的支援來處理這種場景。倉儲的實現不在領域模型內部,儘管其介面/合同可能存在於領域模型中。

應用層服務

應用層服務將來自外部世界的命令/請求路由到我們的模型中。它們構成了一個薄的編排層,在這裡注入基礎設施問題(如倉儲實現),並呼叫聚合根的相關公共方法。

需要注意的是,應儘量保持應用層服務的“簡潔”,我們希望所有的業務邏輯都在應用的核心中。

領域服務

當我們必須在多個聚合體之間協調功能時,會發生什麼?這是否構成“業務邏輯”?

是的!一種解決方案是領域服務。它類似於應用層服務,但位於核心領域內部。它包含構成業務邏輯的編排邏輯。通常,這一連串的事件透過領域事件及相應的處理程式表達得更好。

總結

如果你只會做基本的算術,數學是有用的。如果你會做張量計算,它也很有用,但你不會從張量計算開始。

以類似的方式,DDD是一門深奧的學科。有很多書籍從高度學術的到極其實用的都有。著名的《藍皮書》是關於該主題的原始參考文獻;它以相當學術的觀點提供了對DDD的詳細定義。相對的,《紅皮書》講述了三個開發團隊在採納DDD過程中的故事,使得DDD的概念變得自然且實用。對於聽覺型學習者,還有許多啟發性的演講,如同事 Andrew Harmel-Law 的演講。
關注我,緊跟本系列專欄文章,咱們下篇再續!

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

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

負責:

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

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

相關文章