關於DDD的概念筆記

前言

看過不少關於 DDD 的文章, 也買過一些書籍, 可是發現內容冗長, 大部分時間用來理解名詞含義, 而忽略裏面的設計精華.markdown

下面是我基於極客時間《DDD實戰課專欄》整理的一些名詞解釋, 裏面也摻雜了一些我的理解和說明, 但願能對你理解起來有所幫助.微服務

領域和子域

領域顧名思義, 表示的是特定的一種範圍測試

舉例說明:

咱們把領域比做爲總體的業務系統, 在業務系統裏面也包含不少子系統(好比用戶中心、訂單中心、商品中心), 咱們將這些子系統稱爲子域, 是依據領域的範圍繼續劃分出來的更小的業務範圍,spa

在用戶中內心面也能夠繼續劃分爲VIP和普通用戶系統等, 這也就是子域進一步劃分爲子子域, 這也是正常系統演進的過程.設計

一個複雜的系統, 經過逐步劃分子域, 造成了業務上的拆解, 最終目的是下降業務理解和系統實現的複雜度code

如何理解核心域、通用域和支撐域

核心域

可理解爲最核心的業務(主線), 基本屬於業務的核心競爭力了.orm

不一樣公司核心域是不一樣的, 好比有側重質量, 有側重物流服務, 也有客戶服務對象

通用域

被多個子域共同使用的稱之爲通用域, 好比認證、權限等事件

支撐域

一些公司個性化的業務開發

什麼是通用語言

經過團隊溝通最終達成的共識, 可以簡單、清晰、準確的描述咱們業務涵義和規則的語言就是通用語言.

簡單來講就是能夠解決交流障礙問題, 統一產品、研發、測試、運營等人員之間的業務術語交流

通用語言名詞給領域對象命名, 好比商品、訂單等, 對應實體模型. 動詞表示一個動做或事件, 好比下訂單、取消訂單、訂單已取消、訂單已付款、瀏覽商品、加入購物車等

定義好通用語言, 將通用語言中的業務需求轉換爲的代碼實現, 就會很是容易了, 最終實現了 業務語言與代碼語言的統一

限界上下文

限界就是領域的邊界,而上下文則是語義環境

咱們都知道語言的魅力, 一句 今天交做業了沒, 在不一樣的場景下就會賦予不一樣的含義, 同窗問你多是真的問你交做業了沒有, 若是你的女友問你, 可能又是另外一個含義了.

因此咱們必需要明確在一個業務場景下使用的業務語言只有一個含義, 避免理解起來出現二義性, 不然會出現認知誤差, 結果就會溝通起來很累.

只有在限界上下文的條件下, 通用語言纔可能會避免出現二義性.

爲何講 限界上下文能夠做爲微服務拆分的重要依據?

以前咱們講到劃分子域, 劃分後咱們須要達成通用語言

通用語言永遠只表示一個含義, 須要給定一個有效範圍(限界上下文, 劃分領域邊界), 最終可映射一個完成的服務實體.

實體和值對象

實體

每一個實體對象都有惟一的 ID。咱們能夠對一個實體對象進行屢次修改,修改後的數據和原來的數據可能會大不相同

更簡化的理解爲: 商品是商品上下文的一個實體,經過惟一的商品 ID 來標識,無論這個商品的數據如何變化,商品的 ID 一直保持不變,它始終是同一個商品

好比咱們在開發電商系統中, 咱們能夠給定商品實體、訂單實體等等, 而後咱們再繼續圍繞這些實體開展工做

值對象

值對象是實體的一部分, 負責延展、擴充實體對象, 屬於實體對象的一部分

實體對象映射的是真實的業務對象,具備業務屬性、業務事件、業務行爲, 而值對象是不包含業務邏輯的.

好比在實體中咱們給定了訂單實體, 訂單實體通常對應着地址, 咱們能夠講地址是對訂單的一種擴充, 因此地址爲值對象.

實體和值對象舉例

以註冊用戶和地址舉例:

在電商購物這個上下文角度觀察: 註冊用戶能夠看做一個實體, 而對應的地址能夠看做爲一個值對象

而在地區統計系統上下文角度觀察: 地址能夠算做一個實體, 而註冊用戶是能夠做爲一個值對象存在的.

實體可修改,值對象不可修改,只能夠總體替換。實體是實實在在的業務對象,值對象只是對對象的描述。值對象依附以實體,實體沒了值對象也就沒了。

聚合和聚合根

經過上面的理論, 咱們劃分出了 限界上下文, 劃分了領域的邊界.

然後咱們又分析找出了 實體和值對象,

下一步咱們將實體、值對象進行聚合, 完成限界上下文下的領域建模

聚合

實體和值對象是很基礎的領域對象。實體通常對應業務對象,它具備業務屬性和業務行爲;而值對象主要是屬性集合,對實體的狀態和特徵進行描述。但實體和值對象都只是個體化的對象,它們的行爲表現出來的是個體的能力。

咱們劃分的實體對象之間大多都是存在聯繫的, 彼此協做完成一個複雜的業務系統, 這裏就須要咱們使用聚合(或成爲組合實體對象).

聚合根

當咱們須要將一些實體對象組合起來完成限界上下文的領域建模時, 是須要將咱們的實體對象規則控制、協調的, 這就是咱們聚合根的做用了.

首先它做爲實體自己,擁有實體的屬性和業務行爲,實現自身的業務邏輯。其次它做爲聚合的管理者,在聚合內部負責協調實體和值對象按照固定的業務規則協同完成共同的業務邏輯。

以電商裏面的訂單舉例

  1. 訂單在聚合裏是聚合根,與訂單關聯的有訂單明細和收貨地址。
  2. 訂單明細包括商品ID,商品名稱,價格以及數量等信息,因爲訂單明細是多個,它是一個集合,它被設計爲實體,被訂單引用。
  3. 而訂單隻有一個收貨地址,這個收貨地址的值來源於你我的中心維護的收貨地址,收貨地址只能被總體替換,因此它被設計爲值對象。

關係圖例

  1. 一套業務領域劃分多個限界上下文子域
  2. 一個限界上下文子域對應多個聚合
  3. 一個聚合裏面劃分進多個實體和值對象, 並實現一個聚合根
  4. 一個聚合根調度多個實體、值對象

結語

本文主要爲概念性說明, 借鑑於《DDD實戰課》

更多精彩關注:

相關文章
相關標籤/搜索