[DDD] 領域驅動設計 Domain-Driven Design 名詞解釋 (二)

Tung
5 min readFeb 13, 2023

--

Bounded Context

現實中的例子說明 Bounded Context:

  • 中國和台灣都有土豆這個名詞,中國的土豆是指馬鈴薯,台灣則是花生,因此中國和台灣是不同的 Bounded Context。
  • 台灣和日本都有“免強”這個詞,在台灣是指強迫某人做某件事,日本則是“讀書”的意思,因此台灣和日本是不同的 Bounded Context。

有了 Bounded Context 的概念,可以避免溝通上的誤解或衝突。比如:訂單管理中的商品與商品管理中的商品就是兩種不同的東西,所以訂單管理與商品管理就是兩個不同的 Bounded Context。

來源:https://martinfowler.com/bliki/BoundedContext.html

Tactical Design 戰略設計

先從 Model-Driven Design 開始看

  • 1. Services — 無狀態的 Object 可作為 Util 或是 Helper,不屬於 Entities 和 Value Objects。
  • 2. Entities — 有自己的生命週期、唯一可識別 ID。例:人類。
  • 3. Value Objects — 無生命週期、無唯一性。例:Email、地址。
  • 4. Aggregate — 可以將它視為一組物件的 Cluster ,可能由多個 Entity 組成。整個 Aggregate 作為資料的傳遞和存取,Aggregate 內的狀態必須一致 ( Invariants )。
  • 5. Repository — 只負責存取 Aggregate,一個 Aggregate 應該有一個專屬的 Repository。
  • 6. Layered Architecture — 用來實踐 DDD 的一種架構,現今應改為 Clean Architecture。

補充 1 — Entities 與 Value Objects 在不同的 Bounded Context 下,可能會有不同的結果。比如在一般的情況下 “錢” 可能屬於 Value Object,但如果有個 Bounded Context 是負責幫央行生產鈔票,此時 “錢”就是 Entity 。

補充 2 — Aggregate Root 是每個 Aggregate 中,最上層的 Entity。比如說一張訂單 ( Order ),裡面可能有多個訂單項目 ( Order Item ),那訂單 ( Order )與訂單項目 ( Order Item )可以說是一個 Aggregate, Aggregate Root 就是最上層的 Order Entity。

Strategic Design 策略設計

Strategic Pattern 著重在與另一個 Bounded Context 的整合,根據 Problem Domain 決定適合套用在哪一種 Pattern。

  • 0. Context Map — 用於與其他 Bounded Context 的互動或溝通,其中包含多種的 Pattern。
  • 1. Shared Kernel — 與另一個 Bounded Context 共用核心,像是兩個不同的 Domain Model 共用同一個元件,也因此產生耦合的關係。
  • 2. Customer / Supplier — 這是種 Upstream Downstream Relationship ( 以下簡稱 UD ), Supplier 是上游 Upstream, Customer 是下游 Downstream。通常 Supplier 會根據 Customer 的需求開發。比如一個公司的 ERP 系統就需要後端提供特定的 API 來滿足需求。
  • 3. Conformist — 屬於 UD 關係,簡單來說就是完全遵守上游的規則,雖然完全依賴於上游,但可以達到最簡單的整合。
  • 4. Open Host Service / Published Language — 本身的 Bounded Context 作為上游 Upstream,提供 API 或文件給下游 Downstream。
  • 5. Separate Ways — 與 Shared Kernel 相反,與另一個 Bounded Context 各自維護自己的核心,雖然這樣做可以達到解耦,但可能需要額外增加狀態同步的機制。
  • 6. Anticorruption Layer — 屬於 UD 關係,與 Conformist 不同之處在於與上游 Upstream 間多了一個防腐層,不直接依賴於上游,而是依賴自身 Bounded Context 內的防腐層。
  • 補充 7. ( 不是 Context Map Pattern ) Continuos Integration—確保 Bounded Context 的 Model 或 Ubiquitous Languages 能夠持續保持一致,避免 Bounded Context 內部或外部的溝通產生誤解。

--

--

No responses yet