精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

久久精品五月婷婷| 国产成人高潮免费观看精品| 亚洲成a人片在线www| 污网站在线免费看| www.久久精品| 日本久久久久久久| 成人一级黄色大片| 国产乱人伦丫前精品视频| 狠狠干狠狠久久| 亚洲国产精品123| 亚洲卡一卡二卡三| 天堂影院一区二区| 在线视频亚洲欧美| wwwxxxx在线观看| 国产欧美一区二区三区精品酒店| 国产精品人妖ts系列视频| 国产高清不卡av| 四虎影院在线免费播放| 中文一区一区三区免费在线观看| 亚洲国产精品推荐| 国产三级日本三级在线播放| 1区2区在线观看| 久久精品亚洲精品国产欧美| 亚洲自拍偷拍色图| 国产第一页在线观看| 欧美日韩一区自拍| 中文字幕精品一区二区精品| 欧洲熟妇的性久久久久久| 国产69精品久久久久9999人| 午夜精品久久久久久久蜜桃app| 一级日韩一区在线观看| 天堂av一区二区三区| 精品在线观看视频| 日韩av片永久免费网站| 国产污视频在线看| 中文字幕一区二区三区久久网站| 亚洲天堂成人在线| 99久久免费看精品国产一区| 欧美视频三区| 欧美日韩小视频| 人妻熟女一二三区夜夜爱| 青春草在线免费视频| 成人免费在线视频| 日韩精品第一页| 久久久pmvav| www.久久精品| 国产精品乱码视频| 国产婷婷在线视频| 精品亚洲国内自在自线福利| 国产精品久久久久福利| 国产污污视频在线观看 | 日韩精品中午字幕| 欧美成年人视频在线观看| 粉嫩一区二区| 色综合天天狠狠| 69堂免费视频| 少妇淫片在线影院| 高潮白浆女日韩av免费看| 日韩精品视频在线观看视频| 欧美性爽视频| 亚洲精品大片www| 超碰97免费观看| 国产网友自拍视频导航网站在线观看| 国产精品美女一区二区| 一本久久a久久精品vr综合| 北岛玲日韩精品一区二区三区| 久久午夜电影网| 鲁鲁视频www一区二区| 视频一区二区在线播放| 2020国产精品久久精品美国| 欧美亚州在线观看| 98在线视频| 亚洲天堂免费在线观看视频| 欧美三级午夜理伦三级老人| 制服丝袜在线播放| 亚洲国产视频网站| 无码精品a∨在线观看中文| 国模冰冰炮一区二区| 在线观看免费成人| 天天操天天干天天做| 中文字幕一区日韩精品 | 国产美女被下药99| 国产精品久久久久久免费免熟| 韩国三级电影一区二区| 亚洲iv一区二区三区| 性网爆门事件集合av| 99精品久久只有精品| 欧美日韩一区二区视频在线观看| 亚洲精品传媒| 亚洲人成在线观看一区二区| 分分操这里只有精品| 91看片一区| 91精品国产免费久久综合| 丰满人妻一区二区三区免费视频棣 | 欧美理论在线播放| 两个人的视频www国产精品| 九九久久免费视频| 久久精品一区二区国产| 成人免费淫片aa视频免费| 色噜噜在线播放| 中文子幕无线码一区tr| 久久这里只有精品8| 黄色亚洲网站| 91精品免费在线观看| 特大黑人巨人吊xxxx| 亚洲第一偷拍| 欧美在线观看网址综合| 国产精品一区二区人人爽| 99re热这里只有精品视频| 亚洲三区在线观看| 极品美鲍一区| 欧美高清www午色夜在线视频| 秘密基地免费观看完整版中文 | 亚洲精品理论电影| 萌白酱视频在线| 精品国产乱子伦| 四虎永久免费在线观看| 牛牛影视久久网| 中文字幕日韩综合av| 日韩av在线电影| 黑人精品欧美一区二区蜜桃 | 久久福利视频导航| 日本高清不卡码| 国产成人亚洲综合a∨婷婷| 午夜精品视频在线观看一区二区| segui88久久综合9999| 宅男噜噜噜66一区二区66| av女人的天堂| 亚洲少妇自拍| 91国产在线免费观看| 免费在线观看av片| 欧美中文字幕一二三区视频| 中国一级特黄录像播放| 欧美网站在线| 91中文在线观看| 无遮挡动作视频在线观看免费入口| 亚洲国产另类av| 亚洲综合20p| 日韩精品不卡一区二区| 日本精品中文字幕| 色鬼7777久久| 欧美日韩国产在线看| 在线观看免费视频黄| 国产精品豆花视频| 91精品国产99久久久久久红楼| 黄网站在线免费看| 在线播放一区二区三区| 天天色天天综合| 免费看欧美美女黄的网站| 欧美一区二区视频17c| 性国裸体高清亚洲| 亚洲欧美日韩一区二区三区在线| 成人免费看片98| 国产999精品久久久久久绿帽| 91制片厂免费观看| 国产视频一区二区在线播放| 久久中文字幕在线| av av片在线看| 综合激情成人伊人| 中国老熟女重囗味hdxx| 好吊日精品视频| 国产在线视频欧美一区二区三区| av影片在线| 日韩精品中文字| www.久久精品视频| 国产女同互慰高潮91漫画| 一区二区三区 欧美| 爽成人777777婷婷| 成人网址在线观看| 免费男女羞羞的视频网站在线观看| 欧美大片日本大片免费观看| 精品无码人妻一区二区三区| 99免费精品视频| 亚洲熟妇av日韩熟妇在线| 国产精品欧美大片| 欧美怡红院视频一区二区三区| 日本黄色免费视频| 色综合天天综合网天天狠天天| caopeng视频| 久久av中文字幕片| 男人的天堂avav| 美女呻吟一区| 国产精品7m视频| h片在线免费| 亚洲精品美女免费| 亚洲天堂999| 亚洲午夜电影在线| 国产jk精品白丝av在线观看| 久久99最新地址| 无码粉嫩虎白一线天在线观看 | 精品久久国产老人久久综合| 日韩熟女精品一区二区三区| 欧美国产综合一区二区| 日本女人黄色片| 国产精品综合| 致1999电视剧免费观看策驰影院| 成人在线超碰| 国产精品日韩在线一区| 福利网站在线观看| 国产一区二区三区在线| www.亚洲天堂.com| 在线观看亚洲a| 国产精品不卡av| 国产精品久久精品日日| 国产人妻黑人一区二区三区| 麻豆成人综合网| 青草青青在线视频| 天天av综合| 老牛影视免费一区二区| 国产精品**亚洲精品| 欧美亚洲国产日本| h片在线免费| 伊人久久免费视频| 日本久久一级片| 7777精品伊人久久久大香线蕉最新版| 91国产丝袜播放在线| 亚洲精品久久久久久国产精华液| www.av欧美| youjizz久久| 四虎成人在线播放| 蜜桃视频在线一区| 欧在线一二三四区| 亚洲国产专区校园欧美| 欧美精品久久96人妻无码| 精品国产中文字幕第一页| 国产综合 伊人色| 日韩av综合| 亚洲va久久久噜噜噜| 国产69精品久久久久按摩| 日韩av日韩在线观看| 中文字幕在线直播| 97在线免费视频| caoprom在线| 久精品免费视频| av网址在线播放| 神马国产精品影院av| 成人午夜在线观看视频| 亚洲摸下面视频| 天堂中文在线视频| 亚洲国内高清视频| 丰满岳乱妇国产精品一区| 欧美一区二区三区四区高清| 中文字幕第2页| 欧美在线观看视频一区二区| 国产精品久免费的黄网站| 精品久久久久久久久久| 日韩精品人妻中文字幕| 亚洲高清免费视频| 日本少妇xxxx动漫| 五月婷婷激情综合| 国产午夜在线播放| 精品福利在线视频| 国产在线观看黄色| 精品高清美女精品国产区| 天堂网av手机版| 欧美性猛交xxxx免费看久久久 | 欧美网站一区二区| 日本黄色一级视频| 欧美视频在线一区二区三区 | 日韩亚洲欧美成人一区| www.国产黄色| 亚洲成人黄色在线观看| 四虎国产精品永远| 在线视频日本亚洲性| 天堂аⅴ在线地址8| 欧美成人精品h版在线观看| 50度灰在线| 91av视频导航| 日韩国产网站| 91久久精品国产91性色| 2020国产精品极品色在线观看| 国产欧美亚洲日本| 美女久久99| 宅男在线精品国产免费观看| 欧美va天堂| 成人综合视频在线| 麻豆国产精品官网| 精品国产免费久久久久久婷婷| av不卡免费在线观看| 免费看黄色的视频| 亚洲欧洲综合另类| 亚州国产精品视频| 欧美视频在线播放| 亚洲av无码乱码国产麻豆| 精品亚洲男同gayvideo网站| 调教视频免费在线观看| 欧美激情区在线播放| 成人在线爆射| 亚洲直播在线一区| 亚洲毛片免费看| 亚洲天堂av免费在线观看| 亚洲毛片av| www.99r| www.成人网.com| 五月天免费网站| 亚洲国产aⅴ成人精品无吗| 日韩精选在线观看| 精品久久国产97色综合| 在线看免费av| 91精品国产色综合久久不卡98| 国产精品99| 九九热久久66| 91精品国产91久久久久久黑人| 日日橹狠狠爱欧美超碰| 国产一区二区美女| 性欧美一区二区| 亚洲一区二区中文在线| 中文字幕人妻互换av久久| 亚洲国产精品人久久电影| 毛片在线看网站| 日韩av成人在线观看| 成人资源在线| 日韩第一页在线观看| 久久欧美肥婆一二区| 日本少妇xxxx软件| 亚洲日本在线观看| 五月婷婷丁香在线| 亚洲精品v天堂中文字幕| 久久bbxx| 国产99久久精品一区二区永久免费 | 久久99久国产精品黄毛片入口| 欧美黑人一区| 国产一区免费视频| 欧美不卡一区| 日本中文字幕观看| 亚洲国产成人一区二区三区| 国产超碰人人爽人人做人人爱| 日韩一区二区三区三四区视频在线观看 | 劲爆欧美第一页| 欧美蜜桃一区二区三区| 黄色av网站在线| 欧美一乱一性一交一视频| 99香蕉久久| 欧美性受黑人性爽| 黄色资源网久久资源365| 极品尤物一区二区| 在线观看区一区二| 风间由美一区| 国产精品成人一区二区三区吃奶| 一道在线中文一区二区三区| 成人网站免费观看入口| 成人爱爱电影网址| 精品无码人妻一区二区三| 精品国产乱码久久久久久蜜臀| 中文字幕在线播放网址| 亚洲综合精品一区二区| 亚洲乱码电影| 97免费公开视频| 一区二区三区加勒比av| 丰满熟妇人妻中文字幕| 欧美高清自拍一区| 国产精品qvod| www在线观看免费| 99综合电影在线视频| 日韩精品成人一区| 日韩福利在线播放| 成人av观看| 亚洲精品乱码视频| 精品一区二区国语对白| 在线观看美女av| 欧美精品在线一区二区三区| 黄a在线观看| 99国产在线视频| 亚洲日本免费| 欧洲美一区二区三区亚洲| 欧美在线免费观看视频| 日本精品在线| 成人3d动漫一区二区三区91| 亚洲欧洲午夜| 91网站免费入口| 欧美人妖巨大在线| av大大超碰在线| 好看的日韩精品| 丝袜国产日韩另类美女| av在线免费播放网址| 日韩免费看网站| 中文字幕乱码中文乱码51精品| 日韩欧美一区二区三区四区五区 | 国产精品久久久久久久久久免费| 久久蜜桃av| 久草免费资源站| 欧美午夜无遮挡| 日本中文字幕电影在线免费观看| 亚洲va欧美va在线观看| 99视频精品| 国产福利在线导航| 精品盗摄一区二区三区| 成人做爰视频www网站小优视频| 亚洲综合av一区| 成人a免费在线看| 中文字幕乱码在线观看| 欧美美最猛性xxxxxx| 亚洲女娇小黑人粗硬| 一起操在线视频| 精品国产精品自拍| 老司机99精品99| 久久人人爽爽人人爽人人片av| 久久99国产精品久久| 欧美三级一区二区三区| 久久精品中文字幕免费mv|