DDD最全詳解(圖文全面總結(jié))
DDD
DDD,全稱是:“Domain-Driven-Design”,翻譯過(guò)來(lái)就是:領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(DDD)。
DDD,最早是埃里克·埃文斯(Eric Evans),出版了《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》這本書(shū),標(biāo)志著領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(DDD)的正式誕生。
DDD 強(qiáng)調(diào)以業(yè)務(wù)需求為中心,以領(lǐng)域模型為核心,通過(guò)不斷迭代開(kāi)發(fā),確保軟件系統(tǒng)能夠準(zhǔn)確反映業(yè)務(wù)邏輯、和需求。
DDD原理
在領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(DDD)中,領(lǐng)域模型通常被分為四層,以幫助開(kāi)發(fā)人員將業(yè)務(wù)邏輯、與技術(shù)實(shí)現(xiàn),進(jìn)行有效的分離。
如下圖所示:
圖片
DDD 的四層架構(gòu),提供了一個(gè)清晰的分層結(jié)構(gòu),使得系統(tǒng)的各個(gè)部分職責(zé)分明。
1.用戶界面層
用戶界面層,負(fù)責(zé)與用戶交互,顯示數(shù)據(jù)并收集用戶輸入。
這一層主要處理 UI/UX 邏輯,如:數(shù)據(jù)展示、用戶輸入驗(yàn)證.........等。
它是系統(tǒng)的入口,通過(guò)各種用戶界面,比如:如網(wǎng)頁(yè)、移動(dòng)應(yīng)用、桌面應(yīng)用、與最終用戶進(jìn)行交互。
2.應(yīng)用層
應(yīng)用層定義了系統(tǒng)的主要用例,通過(guò)服務(wù)接口暴露這些用例,以便用戶界面層調(diào)用。
該層負(fù)責(zé)管理事務(wù)、協(xié)調(diào)不同領(lǐng)域?qū)ο蟮慕换ィ约疤幚碛脩粽?qǐng)求的工作流。
應(yīng)用層還負(fù)責(zé)管理事務(wù)、一致性,以及調(diào)度各種領(lǐng)域?qū)ο?,以完成用戶的業(yè)務(wù)需求。
比如:電商系統(tǒng)中的訂單管理、庫(kù)存管理、客戶賬戶管理.....等核心業(yè)務(wù)邏輯。
3.領(lǐng)域?qū)?/h3>
領(lǐng)域?qū)邮?DDD 的核心部分,負(fù)責(zé):實(shí)現(xiàn)業(yè)務(wù)邏輯和規(guī)則。
DDD ,包含了領(lǐng)域模型(比如:實(shí)體、值對(duì)象、聚合、領(lǐng)域服務(wù)...等),這些模型直接反映了業(yè)務(wù)需求。
領(lǐng)域?qū)泳哂懈叨葍?nèi)聚性,所有業(yè)務(wù)邏輯都集中在這一層,避免邏輯分散。
4.基礎(chǔ)設(shè)施層
基礎(chǔ)設(shè)施層,負(fù)責(zé)技術(shù)實(shí)現(xiàn)的細(xì)節(jié),比如:持久化、消息傳遞、外部系統(tǒng)集成、日志記錄等。
比如:MySQL 數(shù)據(jù)庫(kù)訪問(wèn)層、Redis 緩存層、Kafka 消息隊(duì)列集成.......等等。
基礎(chǔ)設(shè)施層應(yīng)盡量、與領(lǐng)域?qū)印⒑蛻?yīng)用層解耦,以保持系統(tǒng)的靈活性、和可替換性。
通過(guò)這種分層設(shè)計(jì),開(kāi)發(fā)團(tuán)隊(duì)可以更好地管理系統(tǒng)的復(fù)雜性,確保業(yè)務(wù)邏輯的準(zhǔn)確性和系統(tǒng)的可維護(hù)性。
DDD實(shí)踐
DDD 的實(shí)施,一般包含如下步驟:
圖片
1.領(lǐng)域
首先,通過(guò)與領(lǐng)域?qū)<业木o密合作,深入理解業(yè)務(wù)領(lǐng)域,識(shí)別核心子領(lǐng)域、和業(yè)務(wù)邏輯。
領(lǐng)域是指一個(gè)特定的業(yè)務(wù)領(lǐng)域、或問(wèn)題空間。
DDD 強(qiáng)調(diào)對(duì)領(lǐng)域的深入理解,以構(gòu)建符合業(yè)務(wù)需求的軟件系統(tǒng)。
領(lǐng)域內(nèi)的所有規(guī)則、術(shù)語(yǔ)和概念都是業(yè)務(wù)專家、和開(kāi)發(fā)團(tuán)隊(duì)共同理解、和認(rèn)同的。
比如:電商系統(tǒng)的“領(lǐng)域”,可以是整個(gè)在線購(gòu)物平臺(tái),它包括了:商品管理、訂單處理、支付系統(tǒng)、客戶管理等多個(gè)子領(lǐng)域。
這個(gè)領(lǐng)域中的所有業(yè)務(wù)規(guī)則、和活動(dòng),都圍繞著:如何支持用戶購(gòu)買(mǎi)商品、處理訂單、進(jìn)行支付等關(guān)鍵業(yè)務(wù)功能。
2.領(lǐng)域模型
領(lǐng)域模型是對(duì)領(lǐng)域內(nèi)概念的抽象和簡(jiǎn)化,是 DDD 中的核心。
領(lǐng)域模型通過(guò)實(shí)體、值對(duì)象、聚合等構(gòu)建塊來(lái)描述業(yè)務(wù)邏輯和規(guī)則。
3.限界上下文
限界上下文,是在一個(gè)大的領(lǐng)域內(nèi)劃定的一個(gè)明確邊界,用于劃分、和隔離不同子域或模型的區(qū)域。
在不同的限界上下文內(nèi),相同的術(shù)語(yǔ)可能具有不同的含義。
一個(gè)限界上下文包含一個(gè)清晰定義的領(lǐng)域模型,確保在該上下文中,概念的一致性、和統(tǒng)一性。
如下圖所示:
圖片
比如:在電商系統(tǒng)中,不同的限界上下文,可能包括:“訂單管理上下文”、和“庫(kù)存管理上下文”。
訂單管理上下文:處理用戶訂單的創(chuàng)建、修改、支付、取消....等功能。
在這個(gè)上下文中,“訂單”主要涉及客戶信息、支付狀態(tài)。。。等。
庫(kù)存管理上下文:負(fù)責(zé)管理商品的庫(kù)存數(shù)量、倉(cāng)庫(kù)位置。。。等。
在這個(gè)上下文中,“訂單”更多地與庫(kù)存扣減、出貨等操作相關(guān)。
4.模型驅(qū)動(dòng)設(shè)計(jì)
模型驅(qū)動(dòng)設(shè)計(jì)是DDD的核心理念,它主張以領(lǐng)域模型為基礎(chǔ),來(lái)驅(qū)動(dòng)軟件系統(tǒng)的設(shè)計(jì)與開(kāi)發(fā)。
比如:在訂單管理上下文中,團(tuán)隊(duì)通過(guò)與領(lǐng)域?qū)<矣懻摚瑒?chuàng)建了一個(gè)領(lǐng)域模型。
其中包括“訂單(Order)”、“訂單項(xiàng)(OrderItem)”...等實(shí)體,以及訂單的各種狀態(tài)(如“待支付”、“已支付”、“已發(fā)貨”等)。
該模型驅(qū)動(dòng)了系統(tǒng)的設(shè)計(jì),開(kāi)發(fā)團(tuán)隊(duì)根據(jù)模型定義數(shù)據(jù)庫(kù)結(jié)構(gòu)、API接口和業(yè)務(wù)邏輯,實(shí)現(xiàn)了與訂單相關(guān)的功能。
5.聚合
聚合是指一組相關(guān)對(duì)象的集合,通常通過(guò)聚合根進(jìn)行訪問(wèn)、和管理。
聚合根是控制、和管理聚合內(nèi)部狀態(tài)的一部分,它負(fù)責(zé)維護(hù)聚合的一致性。
比如:在訂單管理上下文中,“訂單”可以作為一個(gè)聚合,包含:“訂單項(xiàng)(OrderItem)”、和“支付信息(PaymentInfo)”。
在這個(gè)聚合中,所有操作都通過(guò)訂單這個(gè)聚合根來(lái)進(jìn)行,以確保聚合內(nèi)部的規(guī)則和約束得以維護(hù)。
6.實(shí)體
實(shí)體是具有唯一標(biāo)識(shí)的對(duì)象,其生命周期貫穿系統(tǒng)中的多個(gè)狀態(tài)轉(zhuǎn)變。
實(shí)體的標(biāo)識(shí)符通常是不可變的,而它的狀態(tài)可以變化。
在校園教務(wù)系統(tǒng)中,“學(xué)生(Student)”就是一個(gè)實(shí)體。
如下圖所示:
圖片
每個(gè)學(xué)生都有一個(gè)唯一的學(xué)號(hào)作為標(biāo)識(shí)符,即使學(xué)生的姓名、地址等其他屬性發(fā)生變化,學(xué)號(hào)仍然保持不變,學(xué)號(hào)是這個(gè)實(shí)體的唯一標(biāo)識(shí)。
7.值對(duì)象
在“學(xué)生信息管理上下文”中,“聯(lián)系方式(ContactInfo)”可以作為一個(gè)值對(duì)象。
聯(lián)系方式(ContactInfo):包含電話、郵箱...等信息。
DDD領(lǐng)域驅(qū)動(dòng)設(shè)計(jì),可以幫助團(tuán)隊(duì)更好地組織、和管理復(fù)雜的業(yè)務(wù)邏輯,使系統(tǒng)能夠有效應(yīng)對(duì)業(yè)務(wù)需求的變化。