精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何在DDD中建立領域模型

開發
前面我們討論了DDD的戰略設計和戰術設計。在本文中我們將繼續探討領域模型。

作者 | TWInsights

在前文《??當我們談論DDD時我們在談論什么??》中我們討論了DDD的戰略設計和戰術設計。在本文中我們將繼續探討領域模型。

用領域模型表達領域概念

在實際項目中,模型設計者往往過早陷入具體構造塊類型的識別,比如實體、聚合、領域服務,而忽略了領域模型表達領域概念的目的。我們應該基于領域概念設計領域模型,然后再采用合適的模式降低領域模型的復雜度,進一步增加領域模型的表達能力。

領域模型的作用,一方面是關聯代碼實現,一方面是關聯通用語言。我們對于模型和實現的關聯輕車熟路,但是對于語言和模型關聯往往有待提升。在溝通中刻意使用通用語言可以幫助我們驗證模型的合理性。

我們以一個題目為例,方便后續討論。

活動平臺提供用戶參與活動得到獎品的功能,吸引用戶及潛在用戶參與,以達到拉新、促活、引流的目的。

運營人員可以創建和修改活動,活動的配置內容包括活動名稱、活動介紹、活動開放的開始時間和結束時間、參與資格、權益。

用戶可以看到活動列表,在活動開放的時間段內進入活動頁面看到活動介紹。用戶在活動頁面領取權益,經判斷符合資格的用戶就會獲得一份獎品。權益可能是信用卡積分,也可能是優惠券。

參與資格可能是:一天內注冊的用戶、VIP用戶、當月生日的用戶等。客戶希望系統可以方便擴展支持靈活的資格類型,以支持多樣的活動形式。

對于一個活動,一個用戶只能參加一次。

建立模型

第一步是根據需求分析模型。

我們可以找到以下概念:活動、參與資格、權益。其中參與資格是擴展點。

對于需求「一個用戶只能參加一次活動的」,需要記錄用戶是否參與過活動,所以需要「活動參與記錄」的概念。

參與活動的結果可能有2種:符合參與資格則返回權益,不符合則返回「不符合」。所以我們用了Optional<權益>類型。

我們到這里只識別了各種名詞,需要走查用例,尋找缺失的概念:

  • 用例1,運營人員可以創建并修改活動
  • 用例2,用戶可以參與活動并獲得權益

對于用例1,創建和修改活動,目前模型已經滿足了需求。

對于用例2,這里有一個模型之外的規則:「一個用戶只能參加一次活動」。這是所有活動都需要遵守的規則,我們將其稱為「活動通用規則」。

雖然只是一個很簡單的邏輯,但是提取「活動通用規則」這個概念非常有用。如果沒有這個概念,那么每次去描述這個概念,只能用「一個用戶只能參加一次活動的規則」去表示,非常繁瑣;也讓概念沒有安身之地,容易被隨便放到萬能的Service中。

我們將其加入領域模型。

PS:這里故意省略了參與資格的實現。

我們沒有把「活動通用規則」放到活動概念里,一部分原因是這個判斷邏輯不需要具體活動的信息。

使用通用語言驗證模型

有了領域模型,就有了通用語言。使用通用語言重新描述需求,并盡量在溝通中使用通用語言。

運營人員可以創建和修改活動,活動的配置內容包括活動名稱、活動介紹、活動開放的開始時間和結束時間時間段、參與資格、權益。

用戶可以看到活動列表,在活動開放的時間段內進入活動頁面看到活動介紹。用戶在活動頁面領取權益,經判斷符合資格參與資格的用戶就會獲得一份獎品權益。權益可能是信用卡積分,也可能是優惠券。

參與資格可能是:一天內注冊的用戶、VIP用戶、當月生日的用戶等。客戶希望系統可以方便擴展支持靈活的資格類型,以支持多樣的活動形式。

同時有「活動通用規則」:對于一個活動,一個用戶只能參加一次。

這里去掉了「開始時間」、「資格」、「獎品」等模糊不清晰的描述。使用基于領域模型的語言,讓需求描述清晰沒有歧義。

到目前為止,主要的領域模型都已經分析出來。所有的模型都對應明確的領域概念,不多也不少。

識別構造塊類型

在分析了領域模型后,我們再來分析構造塊類型。

我們通過是否有狀態來做區分。

首先識別有狀態的對象:活動、各種參與資格、權益、活動參與記錄、用戶。一般有狀態的對象都是事物,對應的構造塊類型也就是實體或者值對象。

其次判斷其狀態是否會改變:

  • 活動會被修改,所以狀態會被改變;
  • 參與資格會被修改,但是參與資格從屬于活動,修改后可以直接使用新的對象替換舊的,所以可以設計成狀態不變;
  • 權益和參與資格一樣,也可以設計成狀態不變;
  • 活動參與記錄,狀態可能發生變化;
  • 用戶在這個模型中只是臨時存在,狀態不會變化。

狀態會改變的是實體,包括活動和活動參與記錄;狀態不變的就是值對象,包括參與資格、權益和用戶。

最后剩下的就是無狀態的對象:活動通用規則。對應的構造塊類型是領域服務。

這里的無狀態對象大都可以轉化成有狀態的對象,例如活動通用規則,可以將方法參數的Optional<活動參與記錄>變成成員變量。只是這里我們選擇了無狀態的設計方法。

由于領域服務沒有狀態,所以可以在應用啟動時就創建出來,也可以在使用時才創建。

經過分析,我們的領域模型都有了類型。

設計聚合

首先識別生命周期長的領域對象:在一個操作中被創建出來,操作結束后仍會被其他操作使用的對象。活動、參與資格、權益和活動參與記錄都是生命周期長的對象。

其他有狀態的對象都是臨時對象:在一個操作中被創建出來,操作結束后就不會再被使用。模型中的用戶,在一次操作中從其他服務獲取,使用后即被丟棄。

這里我們總結下各構造塊類型的特點:

實體

值對象

領域服務

是否有狀態

有且狀態可變

有且狀態不可變


生命周期


長或者短

長短均可

在生命周期的長的對象中,我們要設計聚合。聚合作為操作單元,主要解決以下幾個問題:

  • 整個模型往往龐大復雜,為了降低知識負載,需要將其分解成多個小且簡單的模型,劃分清晰的邊界
  • 部分模型對象之間存在一致性規則,例如需要被一起刪除,所以需要放在一個操作中
  • 多個用戶可能會并發操作模型,為了避免相互干擾,需要讓操作單元盡可能小
  • 對于操作單元,需要將其頻繁加載到內存中,如果單元過大,往往不能滿足性能要求

根據對業務的了解,活動及參與資格、權益都是一起被創建和修改,可以放在一個聚合里;活動和活動參與記錄之間沒有一致性規則,可以分開;因為活動參與記錄數量會很多,如果和活動在一個聚合中,會降低性能。

所以我們將活動、參與資格、權益設計成一個聚合,而活動參與記錄作為一個單獨的聚合。而活動和活動參與記錄分別作為這兩個聚合的聚合根。對應的,聚合都會配備其專屬的Repository。

同時加上遍歷方向箭頭。由于活動是聚合根,從活動可以遍歷到聚合內部的參與資格和權益。另外查詢活動參與記錄,可以通過其Repository,所以沒有活動到活動參與記錄的箭頭。

由于我們將活動和活動參與記錄之間劃分成不同聚合,那他們之間的關聯將使用聚合的ID來關聯,而不是聚合本身。

PS:如果使用了關聯對象,遍歷方向也可以是從活動到活動參與記錄。

如何使用領域模型

領域模型已經建立完畢,我們來看如何使用領域模型以滿足用例。

運營人員創建活動基本信息及其關聯的參與資格和權益。領域模型的客戶(一般來說是應用服務),使用運營人員輸入的參數構造出活動對象,再利用Repository將其保存。

運營人員修改活動。應用服務利用Repository獲取需要修改的活動,再根據運營人員提供的參數修改活動,最后利用Repository保存活動對象。

用戶參與活動。應用服務:

  1. 使用活動通用規則判斷用戶是否可以參加。由于活動通用規則需要用到活動參與記錄,因此應用服務會使用Repository獲取活動參與記錄;
  2. 如果可以參加,則執行活動的參與活動方法獲得結果。這需要利用Repository獲取用戶參與的活動,并構造用戶對象(可能需要調用用戶服務獲取用戶信息,但是領域層并不關心這些邏輯);
  3. 如果結果是獲得權益,則創建活動參與記錄,并利用Repository保存。

考慮到并發情況,應用服務可以在第1步前加鎖,并在第3步后釋放鎖。

再次思考

(1) 配置和參與活動可否是兩個模型?

在實現運營人員配置活動的用例過程中,我們會發現可能找到了一個隱藏的領域概念,將輸入的參數轉換成領域模型的邏輯有些枯燥和復雜,同樣將領域模型和數據庫的數據模型之間轉換也如此。輸入參數和數據模型都是只是扁平的數據數據,沒有繼承結構。如果使用另外一種面向數據的模型,也許這些用例實現起來會簡單得多。

每個模型都是為了解決某個問題。這里運營人員配置和用戶參與活動是不同的問題,如果用一個模型來解決這兩個問題,可能會有些吃力。那么干脆設計成兩個模型,使用限界上下文的概念將這兩個模型限定在各自的上下文中,也許更加合理。兩個模型可以共享同一份數據庫數據,并加上一段(非領域層的)邏輯用于模型之間的轉換。

這實際上是一種配置-使用模式。在配置階段,注重配置類型和參數、審批等;在使用階段,注重邏輯計算和性能。

(2) 活動參與記錄是否可以建模成領域事件?

活動參與記錄實際上是不可變的,可以將其設計為領域事件。

(3) 用戶參與活動的用例里,邏輯復雜,有泄漏領域概念的嫌疑?

如果發現應用服務里邏輯變得復雜,可能意味著我們找到了一個隱藏的領域概念。我們可以定義一個「用戶參與活動邏輯」的概念:如果用戶通過了活動通用規則的判斷,則可以參與活動。將其加入模型和通用語言中,在溝通中驗證此概念是否合理。

總結

很多項目雖然也使用了以領域模型為中心的架構,但是設計者仍然是數據模型/貧血領域模型的思考方式,把大量領域邏輯放置在了萬能的Service中,讓領域概念隱藏在了冗長的過程代碼中,無法享受到DDD帶來的收益。

最后總結下本文想要強調的要點:

  • 領域模型和領域概念一一對應
  • 領域模型和實現關聯,也和通用語言關聯。刻意使用通用語言溝通以驗證模型是否合理
  • 演示了一種設計領域模型的步驟
  • 構造塊類型不是最重要的,領域模型本身更加重要
  • 更多的使用可以表達業務含義的值對象和臨時值對象
  • 聚合是一種設計,需要方法權衡
  • 使用Repository、Factory獲取和創建領域模型是應用層的職責,領域層應該關注在表達領域概念
責任編輯:趙寧寧 來源: Thoughtworks洞見
相關推薦

2017-11-17 05:39:27

DDD建模模型

2025-01-26 10:10:30

2021-08-11 10:38:08

云計算云計算環境云應用

2020-10-28 08:08:39

DevOps

2019-08-07 11:15:04

安全 IT部門技術

2021-09-17 16:28:22

零信任網絡防御

2021-09-08 09:22:23

領域驅動設計

2011-03-03 10:00:14

ProFTPD建立MySQL

2020-09-02 08:12:05

CodeDDD代碼

2024-09-24 16:27:57

2023-02-26 10:59:51

2023-02-19 12:44:07

領域事件DDD

2014-09-26 10:00:25

驅動設計DDD領域

2017-10-13 15:59:24

iPhone機器學習iOS

2025-08-26 02:10:00

.NET 10領域驗證模型

2023-02-15 13:50:58

DDD戰略設計

2023-04-13 14:53:45

2020-04-06 13:52:45

數據倉庫大數據平臺Hadoop

2022-07-17 07:37:29

微服務DDD工程化落地

2020-10-27 09:37:43

PyTorchTensorFlow機器學習
點贊
收藏

51CTO技術棧公眾號

日韩精品在线观看网站| 亚洲h精品动漫在线观看| 国产精品小说在线| 国产大片免费看| 精品自拍偷拍| 欧美又粗又大又爽| 日本精品福利视频| 四虎精品在线| 狠狠网亚洲精品| 91sa在线看| 久久精品黄色片| 国产精品探花在线观看| 91麻豆精品国产91久久久资源速度| 国产一区二区三区小说| eeuss影院www在线播放| 成人深夜在线观看| 国产在线观看精品| wwwwww国产| 一区二区电影| 亚洲人精品午夜在线观看| 久久久精品人妻一区二区三区| 成人在线视频播放| 午夜视频在线观看一区| 黄色一级片网址| 青青青免费视频在线2| 国产乱色国产精品免费视频| 国产精品第一视频| 日产精品久久久久| 亚洲色图插插| 深夜福利国产精品| 在线观看免费小视频| 免费萌白酱国产一区二区三区| 91精品国产综合久久国产大片| 无码人妻丰满熟妇区五十路百度| 91桃色在线| 亚洲精品国产无套在线观 | 激情av综合| 宅男噜噜噜66一区二区66| 黄色片在线免费| 蜜臀久久精品| 亚洲成年人网站在线观看| 麻豆一区二区三区在线观看| av大片在线播放| 久久久精品国产99久久精品芒果| 精品乱子伦一区二区三区| 丰满人妻熟女aⅴ一区| 国产一区二区毛片| 91性高湖久久久久久久久_久久99| 天堂av免费在线观看| 午夜亚洲伦理| 欧美一区二区.| 久久夜靖品2区| 1024精品一区二区三区| 欧美激情视频网址| 日韩欧美三级在线观看| 亚洲日本欧美| 国内精品伊人久久| 毛片视频网站在线观看| 亚洲深夜福利| 国产91色在线|| 欧美超碰在线观看| 人禽交欧美网站| 国产精品国产三级国产专播精品人 | 热久久免费国产视频| 亚洲精品午夜国产va久久成人| 一区二区动漫| 国产成人精品视频在线观看| 波多野结衣绝顶大高潮| 日本在线不卡视频| 国产日韩在线观看av| 国产白浆在线观看| 成人av网址在线观看| 久久精品99久久| 国产在线观看黄| 亚洲视频综合在线| 人妻少妇精品久久| 超碰一区二区| 欧美日产在线观看| 91精品国产高清91久久久久久| 一区二区三区欧洲区| 日韩精品视频观看| 成人在线观看免费高清| 亚洲乱码在线| 性色av一区二区咪爱| 免费视频网站在线观看入口| 九九**精品视频免费播放| 999国内精品视频在线| 午夜性色福利视频| 国产精品久久久久久久久免费相片 | 天堂中文字幕在线| 国产精品情趣视频| 国内少妇毛片视频| 丝袜美腿一区| 日韩一本二本av| 波多野结衣办公室33分钟| 99精品在线免费在线观看| 国产+人+亚洲| 在线观看免费中文字幕| 成人一区二区三区视频在线观看| 欧美凹凸一区二区三区视频| 老司机午夜在线| 精品美女久久久久久免费| 在线观看国产一级片| 精品人人人人| 精品国产拍在线观看| 玖玖爱免费视频| 美女视频免费一区| 久久99久久99精品蜜柚传媒| 黄色小网站在线观看| 岛国av一区二区| 中文字幕无码毛片免费看| 自拍亚洲一区| 国模视频一区二区| 国产精品日韩无码| 国产丝袜欧美中文另类| 欧美乱大交xxxxx潮喷l头像| 欧美91在线|欧美| 精品国产一区二区三区四区四| 亚洲熟女少妇一区二区| 美女精品网站| 高清日韩一区| 国产在线高清理伦片a| 91成人在线观看喷潮| 尤物网站在线观看| 欧美二区视频| 91精品视频播放| 色网站在线看| 日韩欧美国产中文字幕| 五月天激情小说| 国产精品v日韩精品v欧美精品网站| 国产精品视频99| 可以在线观看的黄色| 婷婷成人综合网| 欧亚乱熟女一区二区在线| 欧美视频成人| 成人综合电影| 青青草原av在线| 欧美一级日韩一级| 中文字幕在线2021| 加勒比av一区二区| 中文字幕久久一区| 欧洲美女精品免费观看视频| 色偷偷偷亚洲综合网另类 | 日本不卡的三区四区五区| 久久精品丝袜高跟鞋| 成人黄色动漫| 亚洲国产天堂久久综合网| 国产精品美女毛片真酒店| 成人综合婷婷国产精品久久蜜臀 | 777xxx欧美| 性欧美疯狂猛交69hd| 麻豆国产精品777777在线| 五月天丁香综合久久国产| av亚洲一区二区三区| 怡红院精品视频| 伊人久久一区二区| 自拍视频在线观看一区二区| 中文字幕日韩久久| 欧美在线首页| 国产伦精品一区二区三区四区免费| 波多野在线观看| 亚洲欧美在线一区| 自拍偷拍色综合| 综合久久一区二区三区| 欧美精品色视频| 亚洲精选成人| 日本精品一区二区三区不卡无字幕| 亚洲www啪成人一区二区| 日韩在线视频网| 亚洲精品视频91| 富二代精品短视频| 无码人妻丰满熟妇啪啪欧美| 久久99这里只有精品| 免费cad大片在线观看| 哺乳挤奶一区二区三区免费看| 97婷婷大伊香蕉精品视频| 精品99又大又爽又硬少妇毛片| 欧美三级在线看| 亚洲一级生活片| 99热在这里有精品免费| 天天天干夜夜夜操| 欧美日韩国产色综合一二三四| 久久一区二区三区欧美亚洲| www.成人在线视频| 欧美成人精品一区二区三区| 日韩在线观看视频一区二区三区 | 久久久久久尹人网香蕉| 亚洲三区在线播放| 91精品在线观看入口| 日韩久久久久久久久| 国产三级精品视频| 国产精品19p| 日韩二区三区四区| www.亚洲成人网| 欧美日韩性在线观看| 999国产视频| 91精品国产经典在线观看| 久久久久中文字幕2018| 色哟哟免费在线观看| 亚洲精品国产欧美| 国产又大又长又粗| 黑人巨大精品欧美一区免费视频| 欧美性生交大片| 久久综合成人精品亚洲另类欧美| 天天爽夜夜爽视频| 日韩不卡免费视频| 日本精品一区在线观看| 91精品精品| 日本一区二区三不卡| 黑色丝袜福利片av久久| 成人在线免费观看视视频| 波多野结衣亚洲| 久久久免费在线观看| 理论片午午伦夜理片在线播放| 日韩精品极品在线观看播放免费视频 | 欧美极品少妇videossex| 中日韩午夜理伦电影免费| 天天干视频在线观看| 欧美一级片免费看| 伊人精品在线视频| 日本韩国欧美在线| 日韩精品在线免费视频| 亚洲永久免费av| 日韩一区二区不卡视频| 国产日韩v精品一区二区| xxxxxx黄色| 福利视频网站一区二区三区| 国产在线观看中文字幕| 男女男精品网站| 美女一区二区三区视频| 天堂久久久久va久久久久| 777777av| 一本一道久久综合狠狠老精东影业| 欧美视频在线第一页| 亚洲精品在线观看91| 91xxx视频| 牛牛国产精品| 国产一区二区三区乱码| 午夜久久福利| 国产曰肥老太婆无遮挡| 国产真实久久| 成年人深夜视频| 好看的av在线不卡观看| 中文精品无码中文字幕无码专区 | 欧美顶级毛片在线播放| 国产亚洲第一区| 日韩福利视频一区| 久久99精品久久久久久水蜜桃| 色88888久久久久久影院| 欧美激情论坛| 欧美一级精品片在线看| 亚洲一区二区在线看| 日韩精品电影| 女同性恋一区二区| 欧美日韩国产一区精品一区| 丁香六月激情婷婷| 亚洲自拍另类| 久久婷婷综合色| 国产在线不卡一区| 欧美xxxx日本和非洲| 国产福利一区二区三区视频| 亚洲国产精品狼友在线观看| 成人av影院在线| 亚洲精品国产91| 中文字幕亚洲一区二区av在线| 一区二区国产精品精华液| 一区二区成人在线观看| 国产一区二区三区影院| 在线观看欧美黄色| 国产日韩一级片| 亚洲福利视频网站| 蜜桃成人在线视频| 日韩中文在线中文网三级| 制服丝袜在线播放| 7m精品福利视频导航| 国产一区二区精品调教| 亚洲一区二区三区香蕉| 欧美黑人巨大videos精品| 日韩国产高清一区| 欧美在线91| 国产福利视频在线播放| 韩国三级在线一区| 制服丝袜第一页在线观看| 欧美国产欧美综合| 久一区二区三区| 91福利视频网站| 亚洲精品无遮挡| 最近的2019中文字幕免费一页 | 日本一二三区在线| 久久免费视频色| 国产午夜手机精彩视频| 日韩欧美aⅴ综合网站发布| 国产精品欧美激情在线| 日韩黄色高清视频| 成人高清免费在线| 欧美中文字幕在线播放| 日本在线视频一区二区三区| 九九九九久久久久| 一区二区免费不卡在线| 熟女少妇精品一区二区| 成人污视频在线观看| 日韩亚洲欧美中文字幕| 色视频一区二区| 性猛交富婆╳xxx乱大交天津| 亚洲日本中文字幕免费在线不卡| 91三级在线| 国产精品久久久久久av| 国产精品毛片视频| 手机看片日韩国产| 日本最新不卡在线| 182在线视频| 亚洲自拍偷拍九九九| 亚洲天堂免费av| 国产性色av一区二区| 玖玖在线播放| 国产91亚洲精品一区二区三区| 日韩伦理一区| 久久精品香蕉视频| 99久久99精品久久久久久| 三级影片在线看| 欧美日本在线播放| 国产粉嫩一区二区三区在线观看| 51午夜精品视频| 岛国精品一区| 97在线国产视频| 成人一级黄色片| 久久久久久久极品内射| 欧美一区二区三区婷婷月色| 91精品国产91久久久久游泳池| 日韩美女中文字幕| 日韩在线影视| 激情五月宗合网| 91小视频在线免费看| 日韩激情在线播放| 日韩精品免费在线视频观看| 成人免费图片免费观看| 国产有色视频色综合| 136国产福利精品导航网址| 国产一精品一aⅴ一免费| 艳妇臀荡乳欲伦亚洲一区| 国产丰满美女做爰| 欧美另类暴力丝袜| 视频在线亚洲| 亚洲 自拍 另类小说综合图区 | 中文字幕黄色网址| 欧美影视一区在线| a天堂中文在线88| 国产精品视频男人的天堂| 欧美日韩亚洲在线观看| www.日本一区| 亚洲靠逼com| 懂色av成人一区二区三区| 久久久久久久色| 日韩成人一级| 久久九九国产视频| 国产精品久久久爽爽爽麻豆色哟哟 | 一区二区日本视频| 免费a在线观看播放| 欧美性高跟鞋xxxxhd| 国产在线观看免费网站| 国产噜噜噜噜噜久久久久久久久| 五月开心六月丁香综合色啪| 免费高清视频在线观看| 亚洲成人av一区| 国产视频网址在线| 91精品在线一区| 亚洲福利免费| 亚洲黄色免费视频| 欧美一卡在线观看| 午夜影院一区| 亚洲ai欧洲av| 国产成人综合在线| 潘金莲一级淫片aaaaaa播放| 日韩视频第一页| 老司机在线精品视频| 美女网站免费观看视频| 亚洲日本青草视频在线怡红院| 亚洲va久久久噜噜噜无码久久| 97视频在线观看亚洲| 色135综合网| 91丝袜在线观看| 欧美日韩视频一区二区| 牛牛精品在线视频| 欧美日韩在线一二三| 九九在线精品视频| 欧美一区二区激情视频 | bl在线肉h视频大尺度| 免费观看成人高| 国产麻豆日韩欧美久久| 久久99国产综合精品免费| 久久精品男人天堂| 久久久久高潮毛片免费全部播放| 日日噜噜噜噜久久久精品毛片| 一区二区三区在线观看国产| 精品视频一二三| 国产伦精品一区二区三区四区免费| 免费人成在线不卡| 欧美一二三区视频| 欧美巨猛xxxx猛交黑人97人| 国产探花一区|