DDD 的七大關(guān)鍵概念,你知道嗎?
領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)是一種設(shè)計(jì)思想,來(lái)源于 Eric Evans 的一本書(shū) Domain-Driven Design –Tackling Complexity in the Heart of Software。它倡導(dǎo)通過(guò)建立領(lǐng)域模型來(lái)驅(qū)動(dòng)軟件的設(shè)計(jì),也就是從業(yè)務(wù)知識(shí)出發(fā)設(shè)計(jì)業(yè)務(wù)人員和技術(shù)人員都能理解的模型。
統(tǒng)一語(yǔ)言是領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的關(guān)鍵概念之一。領(lǐng)域建模的核心難點(diǎn)就在于業(yè)務(wù)人員和技術(shù)人員使用了不同的概念(詞匯)來(lái)描述他們對(duì)軟件的理解。如果能使用同樣的語(yǔ)言交流,那么復(fù)雜軟件的設(shè)計(jì)就變得更加容易。
領(lǐng)域模型就是跨越業(yè)務(wù)領(lǐng)域作為問(wèn)題空間和軟件解決方案空間的橋梁。
01 使用模型表達(dá)業(yè)務(wù)實(shí)體
使用模型來(lái)表達(dá)業(yè)務(wù)概念和知識(shí),并指導(dǎo)數(shù)據(jù)庫(kù)、API 等軟件的進(jìn)一步設(shè)計(jì)。模型思維是軟件工程中重要的思維之一,它可以簡(jiǎn)化復(fù)雜問(wèn)題,并從某一個(gè)視角出發(fā)讓人們更加容易理解問(wèn)題。
模型是對(duì)現(xiàn)實(shí)世界的簡(jiǎn)化,例如地圖就是一種有效的模型,幫助人們理解道路和街道。
領(lǐng)域模型就是對(duì)業(yè)務(wù)領(lǐng)域簡(jiǎn)化的模型。
02 識(shí)別模型的邊界
領(lǐng)域模型集合之間由于業(yè)務(wù)的相關(guān)性可能形成松散的邊界,這些邊界就是我們分解復(fù)雜、大型問(wèn)題為局部、消息問(wèn)題的契機(jī)。
通過(guò)辨析模型的相關(guān)性,找到邊界就能為軟件模塊的劃分(單體架構(gòu))、服務(wù)的劃分(微服務(wù)架構(gòu))提供指導(dǎo)。
在領(lǐng)域驅(qū)動(dòng)中,識(shí)別出來(lái)的邊界被稱(chēng)為界限上下文。
03 識(shí)別聚合
在數(shù)據(jù)庫(kù)的關(guān)系模型中,模型為一張網(wǎng)絡(luò)結(jié)構(gòu)。這樣對(duì)于代碼實(shí)現(xiàn)存在困擾,因?yàn)殡y以處理業(yè)務(wù)的一致性問(wèn)題。例如,訂單、訂單項(xiàng)目、商品之間,訂單和訂單項(xiàng)目的關(guān)系更加密切,具有相同的業(yè)務(wù)生命周期。在領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)理念中,我們使用聚合代表一組模型的從屬關(guān)系,其中起到關(guān)鍵帶頭作用的模型被叫做聚合根,除此之外被叫做實(shí)體和值對(duì)象。
如果一個(gè)聚合只有一個(gè)實(shí)體,那么聚合根就是這個(gè)實(shí)體。
04 區(qū)分實(shí)體和值對(duì)象
除了聚合根和實(shí)體之外,有一些模型看起來(lái)就像一次性的,他們沒(méi)有自己的 ID 來(lái)標(biāo)明身份,更多的是作為某個(gè)實(shí)體的一部分,表達(dá)幾個(gè)字段的集合。
例如,在電商系統(tǒng)中,用戶(hù)設(shè)定的常用地址,就是典型的實(shí)體,它有自己的 ID 作為身份。但當(dāng)用戶(hù)為訂單選擇地址時(shí),這時(shí)的地址只是訂單上的若干字段,我們就會(huì)把它處理為值對(duì)象。
05 操作模型
在領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)中,為了操作這些模型,又衍生了一些作為“操作者”的對(duì)象。
工廠:處理領(lǐng)域模型創(chuàng)建過(guò)程的對(duì)象,但有時(shí)候不是必須的。服務(wù):用來(lái)處理某些業(yè)務(wù)邏輯的對(duì)象。例如,為訂單計(jì)算總價(jià),或者校驗(yàn)一些業(yè)務(wù)規(guī)則。倉(cāng)儲(chǔ):負(fù)責(zé)將領(lǐng)域模型持久化到數(shù)據(jù)庫(kù)中或從數(shù)據(jù)庫(kù)中重建的對(duì)象,它的目的是為了隔離領(lǐng)域模型和技術(shù)實(shí)現(xiàn)之間的差異。
06 對(duì)架構(gòu)分層
為了更好的組織項(xiàng)目中各種各樣的對(duì)象,我們需要像計(jì)算機(jī)網(wǎng)絡(luò)一樣分層,來(lái)簡(jiǎn)化復(fù)雜項(xiàng)目的復(fù)雜性。
在領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)中,推薦使用四層架構(gòu):
- 用戶(hù)接入層:處理用戶(hù)接入的數(shù)據(jù)結(jié)構(gòu),例如 RESTful API,或者事件。
- 應(yīng)用層:處理用戶(hù)的業(yè)務(wù)操作邏輯,也就是用例,它和用戶(hù)的使用場(chǎng)景相關(guān)。
- 領(lǐng)域?qū)樱禾幚硗ㄓ玫念I(lǐng)域邏輯,也就是較為專(zhuān)業(yè)的業(yè)務(wù)邏輯,例如訂單價(jià)格計(jì)算。
- 基礎(chǔ)設(shè)施層:用來(lái)和基礎(chǔ)設(shè)施適配,例如連接數(shù)據(jù)庫(kù),操作 Redis等。
07 建立領(lǐng)域模型
為了從業(yè)務(wù)知識(shí)中提取出領(lǐng)域模型,人們發(fā)明了很多種方法。
事件風(fēng)暴是一種流行的軟件建模方法。它的形式是通過(guò)工作坊引導(dǎo)業(yè)務(wù)人員和技術(shù)人員共同創(chuàng)作領(lǐng)域模型,以業(yè)務(wù)事件為線(xiàn)索,探索系統(tǒng)中可能的領(lǐng)域模型。
除了事件風(fēng)暴之外,彩色建模也是一種常用的建模方法。它通過(guò)顏色區(qū)分不同領(lǐng)域模型的特點(diǎn),來(lái)澄清領(lǐng)域模型的職責(zé)。彩色建模在過(guò)去的很多年里曾非常流行。