供應鏈商品域 DDD 實踐

前言

供應鏈商品域 DDD 實踐時間不長,在實踐過程也碰到了不少問題,有些找到了答案,有些還是在探索中。最近很榮幸受邀在供應鏈服務與創新團隊做了一次分享,也想在這裏把一些經驗和想法分享給大家,藉此拋磚引玉。

DDD 是一套方法論,實踐能否成功,我覺得不僅僅是個技術問題,更是執行貫徹實施的問題。

本文內容主要有兩部分,DDD 基本概念和 DDD 實施。基本概念包括通用語言、分層架構、DDD 要素、邊界上下文,DDD 實施包括領域知識提取方法、思考方式的轉變,在其中會穿插一些商品案例。

一  軟件複雜性是什麼?

在開始 DDD 前,我們應該先回答的一個問題,我們爲什麼需要 DDD?DDD 是複雜軟件應對之道,所以我們來一起看看,軟件的複雜度到底在哪裏?

在阿里兩年,我感受很深的一個點是,我們不能持續交付不斷演進的複雜軟件,所以有 1.0、2.0、3.0 很多的版本,1.0 搞不下去了,開始 2.0,2.0 也搞不下去了,開始 3.0,不斷循環。

阿里體系複雜度我看來是理解力、不可預測、協作力挑戰三個方面。

1  理解力挑戰

2  不可預測性挑戰

3  協作力挑戰

二  Why DDD?

DDD 設計合適的領域模型來映射現實中的業務,來有效地解決領域中的核心的複雜問題,是對 OOAD 的擴展和延伸,其解決之道:

三  DDD 核心

1  通用語言

通用語言是提煉領域知識的產出物,獲得統一語言就是需求分析的過程,也是團隊中各個角色就係統目標、範圍與具體功能達成一致的過程。

領域語言團隊專有,負責解釋和維護,相同名稱概念,跨出這個團隊,理解可以完全不一樣。

領域專家、產品經理、開發人員共同的語言,這種語言是將領域專家和技術人員聯繫在一起的紐帶。

在各種文檔和平時溝通中,保持概念統一,特別提一下,做一箇中文對照, 把概念和代碼連接起來,在代碼做到概念名稱統一,減少混淆。

通用語言價值:

2  分層架構

DDD 第二個核心是分層架構,分離模型。優秀的架構應該是什麼樣子?關注點是分離的,可以分而治之,可測試性好。

一個人同時要做多件事情的時候,難免手忙腳亂。代碼也一樣,一段代碼要處理各種事情的時候,也會亂成一團,所以我們要分解開來,各個擊破。

商品域領域模型,在分層架構中的位置,如下:

3  DDD 要素

1)實體:有 id,有生命週期和狀態。有屬性,有行爲。外部事件會觸發他的行爲和狀態變化。

實體和 vo 的區分,vo 屬性不能修改,使用 final 修飾。vo 爲表達模型減負,如商品有 100 多個屬性,鋪平開不能體現結構化,不能體現分層分類,將相似描述性屬性分組封裝成一個個 vo。

2)爲什麼需要 service,如批量操作多個實體、跨實體操作,如商品複製,轉賬。

商品域的工程架構:

4  邊界上下文

上下文映射:

四  DDD 實施

1  DDD 實施的挑戰

2  什麼是領域知識?

領域知識有分層分類,平臺通用商業規則,是領域模型主要輸入,商家個性化不能下沉到領域模型層。

3  領域知識提煉,需求和鏈路 5W1H 分析法

兩階段分析:用戶故事、鏈路和邊界分析。

通過這個分析,獲取用戶需求,和全鏈路分工。

4  領域知識提煉,結構化分析

5  思考方式的轉變

領域驅動,在模型階段不會關注數據設計、不會關注存儲、不會關注消息怎麼發,業務和技術視角關注點做了分離。

五  商品域實踐相關

商品域工程架構:

最後,保持模型不斷演進!!!

商品域模型更新 readme,保持模型不斷演進。否則會 APP 層會越來越大,模型層越來越小,最後頭重腳輕,領域坍塌了。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/oEotZ9Sueus-LGZWPoy_RQ