DDD 學習第一章

語言: CN / TW / HK

一、Domain Primitive(Domain)

讓我們重新來定義一下 Domain Primitive :Domain Primitive 是一個在特定領域裡,擁有精準定義的、可自我驗證的、擁有行為的 Value Object 。

  • DP是一個傳統意義上的Value Object,擁有Immutable的特性
  • DP是一個完整的概念整體,擁有精準定義
  • DP使用業務域中的原生語言
  • DP可以是業務域的最小組成部分、也可以構建複雜組合

注:Domain Primitive的概念和命名來自於Dan Bergh Johnsson & Daniel Deogun的書 Secure by Design。

使用 Domain Primitive 的三原則

  • 讓隱性的概念顯性化
  • 讓隱性的上下文顯性化
  • 封裝多物件行為

Domain Primitive 和 DDD 裡 Value Object 的區別

在 DDD 中, Value Object 這個概念其實已經存在:

  • 在 Evans 的 DDD 藍皮書中,Value Object 更多的是一個非 Entity 的值物件
  • 在Vernon的IDDD紅皮書中,作者更多的關注了Value Object的Immutability、Equals方法、Factory方法等

Domain Primitive 是 Value Object 的進階版,在原始 VO 的基礎上要求每個 DP 擁有概念的整體,而不僅僅是值物件。在 VO 的 Immutable 基礎上增加了 Validity 和行為。當然同樣的要求無副作用(side-effect free)。

Domain Primitive 和 Data Transfer Object (DTO) 的區別

在日常開發中經常會碰到的另一個數據結構是 DTO ,比如方法的入參和出參。DP 和 DTO 的區別如下:

什麼情況下應該用 Domain Primitive

常見的 DP 的使用場景包括:

  • 有格式限制的 String:比如Name,PhoneNumber,OrderNumber,ZipCode,Address等
  • 有限制的Integer:比如OrderId(>0),Percentage(0-100%),Quantity(>=0)等
  • 可列舉的 int :比如 Status(一般不用Enum因為反序列化問題)
  • Double 或 BigDecimal:一般用到的 Double 或 BigDecimal 都是有業務含義的,比如 Temperature、Money、Amount、ExchangeRate、Rating 等
  • 複雜的資料結構:比如 Map<String, List<Integer>> 等,儘量能把 Map 的所有操作包裝掉,僅暴露必要行為