學AI,好工作 就找北大青鳥
關注小青 聽課做題,輕松學習
周一至周日
4000-9696-28

DDD,領域驅動設計究竟是什么?

來源:北大青鳥總部 2023年08月22日 14:02

摘要: 在互聯(lián)網的萌芽時代,我們倡導能滿足用戶的基本需求即可;在互聯(lián)網的野蠻生長時代,大量網民涌入互聯(lián)網,我們倡導能滿足不同用戶的不同需求;在互聯(lián)網的穩(wěn)定成熟時代,互聯(lián)網之爭也變?yōu)榫W民時間的爭奪,這時候倡導“精細化運營”。

在互聯(lián)網的萌芽時代,這會兒互聯(lián)網還剛剛誕生,我們倡導“有即可”,能滿足用戶的基本需求即可;在互聯(lián)網的野蠻生長時代,這會兒已經大量的玩家和網民涌入互聯(lián)網,我們倡導“小步快跑,快速迭代”,能滿足不同用戶的不同需求;在互聯(lián)網的穩(wěn)定成熟時代,這會兒互聯(lián)網紅利已經薅的差不多了,網民就那么多,互聯(lián)網之爭也變?yōu)榫W民時間的爭奪,這時候我們倡導“精細化運營”。

與“有即可”匹配的架構設計思想是單體架構,與“快速迭代”匹配的架構設計思想是SOA架構,而與精細化運營匹配的架構設計思想便是DDD領域驅動設計(DomainDriver Design)。那么為什么會有DDD出現(xiàn)?它解決什么問題呢?它是什么樣?


01為什么會有DDD出現(xiàn)?

技術架構不匹配業(yè)務發(fā)展要求。在早期的時候,互聯(lián)網剛剛出現(xiàn),我們的要求都很低,功能也很簡單,只要增、刪、改、查即可。所以那會兒的業(yè)務,只要用PHP寫個程序、連接Mysql數(shù)據(jù)庫、搭在Linux系統(tǒng)之上就可以運行起來。于是乎就出現(xiàn)了一個模塊里包含多個功能。

比如在電商平臺中的訂單服務,我們把下訂單、支付、售后、評價等都放在里面,早期的時候功能很簡單,只維護訂單服務,只CRUD訂單大表即可。但是隨著業(yè)務的發(fā)展,當我們只想改支付功能或評價功能時,就不能輕易做改動了,因為改動支付的時候,有可能影響到售后。通過大量的測試雖然可以避免此類問題,但是投入的人力物力高。而DDD便可以很好的解決掉這個問題。


02DDD解決了什么問題?

在第一個問題中,我們可以看到答案很顯然是系統(tǒng)架構設計不清晰,系統(tǒng)模塊高耦合、低內聚。DDD提出以領域驅動設計的思想進行業(yè)務架構設計(根據(jù)業(yè)務需求設計業(yè)務模塊)、系統(tǒng)架構設計(設計系統(tǒng)、子系統(tǒng))、技術架構設計(采用技術及相關框架),將業(yè)務架構映射到系統(tǒng)架構上,業(yè)務需求變化時,系統(tǒng)架構也能隨之變化。

在保證整個系統(tǒng)的相關人員(設計人員、開發(fā)人員、測試人員、維護人員)都在同一個認知上討論事情的同時,也能快速高效響應業(yè)務需求。通過將業(yè)務架構映射到系統(tǒng)架構上,DDD所呈現(xiàn)的系統(tǒng)必然是高內聚、低耦合的,即在業(yè)務系統(tǒng)中,修改A模塊并不會影響B(tài)模塊正常使用。


03DDD是什么樣?

在DDD中有一些關鍵名詞,我們先來理解一下。領域,即某個有邊界的業(yè)務的抽象,反應業(yè)務需求的本質;限界上下文,界定領域的邊界;實體,即有唯一標識的對象,是一個持續(xù)存在、更新的生命,一般一個領域一個實體;值對象,即描述事物的對象,沒有唯一標識;聚合,即一組相關的被視為整體的對象;聚合根,聚合的對象,外部對象訪問聚合只能通過聚合根訪問。進行DDD設計的步驟一般包含5步:

1.根據(jù)需求劃分出領域、限界上下文;

2.分析每一個限界上下文中的實體、值對象;

3.聚合實體、值對象,劃分出聚合范圍、聚合根;

4.設計聚合根的倉儲;

5.實際操作,不斷反饋,迭代模型。不過只談概念不實踐,便是耍流氓。

那我們以設計一個秒殺系統(tǒng)為例,來看看DDD如何進行設計實踐?


產品需求:在除夕夜當天舉辦一個秒殺活動,所有參加的商品都以超低價賣出,比如iPhone12、Macbook等,時間是20:00開始,先到先得,售完為止。拿到這樣的一個需求時,首先我們根據(jù)使用用戶可以拆分成兩個領域,User活動域、Manager管理域。在User域,用戶的整體使用路徑包含參加活動、瀏覽商品、購買商品、售后評價,在這其中涉及到的領域包含活動子域、支付子域、庫存子域、售后子域,為了保障刷單等行為不發(fā)生,我們還需要風控子域。通過DDD的明確領域劃分,我們可以確定秒殺活動準入、支付、庫存、風控的上下文,每個上下文對內高度內聚、對外低度耦合。

領域驅動設計(DomainDriverDesign)是一種新的軟件設計方法論,它的思想是使用統(tǒng)一的語言將業(yè)務進行劃分,保障開發(fā)人員、設計人員在交流時是針對同一個事務進行溝通,產品的業(yè)務架構能夠完全映射到技術架構、系統(tǒng)架構當中。DDD最大的好處是統(tǒng)一交流語言,降低了溝通成本,但存在的難點是領域專家尚缺,它還是一個很新的概念,正在等待著更多最佳實踐~


熱門班型時間
人工智能就業(yè)班 即將爆滿
AI應用線上班 即將爆滿
UI設計全能班 即將爆滿
數(shù)據(jù)分析綜合班 即將爆滿
軟件開發(fā)全能班 爆滿開班
網絡安全運營班 爆滿開班
報名優(yōu)惠
免費試聽
課程資料
官方微信
返回頂部
培訓課程 熱門話題 站內鏈接