主頁 > 軟體設計 > 可落地的DDD(7)-戰術設計上的一些誤區

可落地的DDD(7)-戰術設計上的一些誤區

2022-07-16 09:28:10 軟體設計

背景

幾年前我總結過DDD戰術設計的一些落地經驗可落地的DDD(5)-戰術設計,和一次關于聚合根的激烈討論最近兩年有些新的落地體驗,回過頭來發現,當初對這些概念的理解還是沒有深入,這篇文章重新闡述下,

之前理解不到位的點有

  1. 戰術設計的各個模塊是的協作關系
  2. 哪些是問題空間問題,哪些是方案空間問題邊界沒有劃分清楚,
  3. 物體和聚合根的區別理解不不深刻,物體和聚合根建模的方法不對,

以上問題將會在下文解釋清楚,

戰術設計拆解

DDD的戰術設計即設計某個子域的領域模型以及代碼落地,領域事件、領域物件、聚合根、物體、值物件、領域服務、工廠、資源庫等這些概念都屬于這個范疇,

筆者將這些概念重新分層組裝了下,如下圖所示,

DDD戰術設計-個人理解版 (3).png
首先將整體分成兩部分,問題空間和方案空間,

  1. 問題空間即領域建模,是對業務問題的描述,以及我們如何對這些問題進行抽象,這些是需要在業務、產品、開發都必須達成一致的,與具體的技術方案無關,
  2. 方案空間即如何用技術手段來解決問題,與具體技術的實作有關,

問題空間即領域建模,是通過物體、值物件、領域服務、領域事件來表達,

  1. 物體和值物件是模型物件,物體是重中之重,包括核心模型資料、行為、狀態,之所以要區分物體和值物件,是為了降低復雜度,因為值物件是個常數物件,不需要花太多精力,
    注意某個物件在某個領域內是個值物件,在另外的領域可能是個物體,所以脫離領域背景關系,說某個物件是值物件,肯定是不對的,比如大家常說的地址是個值物件,這一定是對的嗎?

  2. 領域事件即物體產生的事件

  3. 領域服務包括一些邏輯的計算,和業務策略,比如商業決策邏輯、業務流程等,

方案空間即如何解決問題,實作領域模型與代碼的映射,實作設計與實作的一致性,主要通過工廠,聚合,資源庫來表達,

  1. 聚合是對物體、值物件的封裝,領域外部對領域物件所有訪問都基于聚合來,如基礎設施層操作聚合進行資料保存,其他領域參考聚合物件資料,
    聚合的設計一般是圍繞著技術來的,比如聚合物件事務性,

  2. 工廠,復雜物件的創建工廠類

  3. 資源庫,對聚合的操作,

從筆者的實踐角度來說,落地DDD程序中,問題空間比方案空間更重要,收益更大,因為通常我們吐槽的某些代碼寫的爛,貧血模型,背后并不是因為沒有用DDD,而是問題空間沒有定義好,對于業務沒有深刻理解,導致模型抽象不足,

如何建模

為什么要建模

通常在某個子域落地DDD,我們會按照業務分析-》用例分析-》領域建模(問題空間) -》技術落地(方案空間)這些步驟來操作,但其實即使我們不在代碼里落地DDD,只用前面3步維護一個子域內的領域模型也同樣能夠帶來很多收益,包括但不限于

  1. 統一業務組各個角色的認知,業務、產品、開發大家對同一概念的認知是一致的,
  2. 指導開發作業的拆分,

比如在淘寶有個血的教訓,至今這個歷史債還無法被修復,早期在淘寶開店,一個賣家只能開一個店,賣家和店鋪是兩個領域物件,關系是1:1,店鋪服務覺得是1:1的關系,對外提供的服務有根據sellerId獲取店鋪資訊,所以其他呼叫方就無意識的直接參考了賣家id,這樣也可以拿到店鋪,導致shopId被等同于了sellerID,這個誤參考發生在成千上萬個地方,最后導致后續需要支持一個賣家開多店鋪時無法支持,只能通過其他trick方式實作,

以之前介紹過的CRM領域 來講解,
省略業務分析,直接拿到用例,

用例分析

在線教育crm用例.png
按用戶角色羅列所有的用例,用來推導模型、以及模型之間的關系,領域模型建立好了,需要根據列出的用例來走查一遍,要確保所有的用例都能走通,完整的用例集才能推匯出正確的模型,所以當有變化時,首先調整用例集,再來修改領域模型

建模

領域建模就是定義模型物件,以及模型物件之間的關聯關系,分兩步建模,第一步通過名詞找模型物件,第二步通過動詞、形容詞分析物件關聯關系

名詞

通常反復出現的主語和賓語中的名詞就是模型物件,比如市場人員創建一個活動,活動就是一個模型物件,當然定語中出現的名詞也可能是模型物件,

1.名詞的定義一定要清晰,比如說crm領域有通用的名詞叫商機,但是你對口的產品經理不熟悉crm領域,新造了一個詞,那你要及早糾正他,

2.名詞的含義在限界背景關系內語意唯一,在不同的背景關系中概念就不一定一樣了,比如市場人員創建的活動,和做營銷時創建的活動就不一定,

動詞、活動

1個市場人員可以創建多個活動,所以市場人員和活動關聯關系是1對多,兩者獨立存在,普通關聯關系,

這里為了簡化描述,只列了市場活動、線索、客戶、商機這些域,用戶、角色、權限、資料分析這些域先忽略了,

在線教育crm領域模型 (1).png

產出物

在推導的程序中,我們是按照自底向上的方式推導的,最后我們呈現出來的結果是按照如下方式

  1. 領域名詞
    市場活動: 市場人員為了展示公司形象、推廣公司產品,獲取線索而舉辦的活動,一個活動中可以創建多個線索,

線索: 銷售人員基于線索發掘潛在客戶,多個線索轉換為一個客戶,線索可以由一個市場活動生成,或者其他渠道,

客戶:有意向購買公司產品的用戶,銷售人員可以通過跟進客戶,轉化銷售機會,

銷售機會:更高質量的線索,有機會簽單,可以通過客戶轉換得到,也可以通過其他渠道來獲取

  1. 領域模型
    如上圖

  2. 主要領域狀態轉換,
    因為復雜的領域物件生命周期以及一些跨領域物件互動情況在領域模型圖中表達不出來,所以需要借助額外的圖來表達,

在線教育crm領域狀態.png

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/499430.html

標籤:其他

上一篇:可落地的DDD(7)-戰術設計上的一些誤區

下一篇:基于多資料源零代碼同時生成多個資料庫CRUD增刪改查RESTful API介面——MySql,PostgreSql,Oracle,Microsoft SQL Server

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more