作者 | 波哥
審校 | 重樓
隨著平臺(tái)業(yè)務(wù)的日益增長(zhǎng),單體的應(yīng)用架構(gòu)顯然已經(jīng)不能滿足正常的業(yè)務(wù)需求,將平臺(tái)進(jìn)行微服務(wù)拆分,對(duì)平臺(tái)進(jìn)行重新架構(gòu)勢(shì)在必行。那么問(wèn)題來(lái)了,如何對(duì)現(xiàn)有的平臺(tái)進(jìn)行拆分呢?有沒(méi)有一種指導(dǎo)性的方法論呢?答案是肯定的,隨著微服務(wù)大行其道,領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(Domain-Driven Design,簡(jiǎn)稱(chēng)DDD)這種指導(dǎo)方法越來(lái)越被重視,特別是對(duì)于那些長(zhǎng)期、多團(tuán)隊(duì)協(xié)作、并且具有高度復(fù)雜業(yè)務(wù)領(lǐng)域的項(xiàng)目, DDD更能凸顯其威力。

什么是DDD?簡(jiǎn)單來(lái)說(shuō),它是一種軟件開(kāi)發(fā)方法論,強(qiáng)調(diào)在開(kāi)發(fā)過(guò)程中將業(yè)務(wù)領(lǐng)域的理解貫穿整個(gè)軟件開(kāi)發(fā)生命周期。領(lǐng)域建模是DDD方法中的核心技術(shù),通過(guò)建立清晰的領(lǐng)域模型,幫助開(kāi)發(fā)團(tuán)隊(duì)更好地理解和應(yīng)對(duì)復(fù)雜的業(yè)務(wù)需求。接下來(lái),筆者將深入探討DDD領(lǐng)域建模的方法,從概念到實(shí)踐,幫助老鐵們更好地理解和應(yīng)用這一方法。
1.什么是領(lǐng)域建模?
領(lǐng)域建模是領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)方法中的關(guān)鍵概念之一,指的是通過(guò)對(duì)業(yè)務(wù)領(lǐng)域的深入理解和抽象,構(gòu)建出能夠準(zhǔn)確反映業(yè)務(wù)需求的模型。領(lǐng)域建模關(guān)注的是業(yè)務(wù)領(lǐng)域的本質(zhì),而不是技術(shù)實(shí)現(xiàn)細(xì)節(jié)。它通過(guò)使用一組統(tǒng)一的語(yǔ)言和模型來(lái)表達(dá)業(yè)務(wù)概念、規(guī)則和流程,從而幫助開(kāi)發(fā)團(tuán)隊(duì)更好地理解和應(yīng)對(duì)復(fù)雜的業(yè)務(wù)需求。
它的目標(biāo)是將業(yè)務(wù)領(lǐng)域的知識(shí)轉(zhuǎn)化為可執(zhí)行的軟件模型,以便開(kāi)發(fā)團(tuán)隊(duì)能夠更準(zhǔn)確地理解和滿足業(yè)務(wù)需求。通過(guò)領(lǐng)域建模,可以建立起業(yè)務(wù)領(lǐng)域與軟件系統(tǒng)之間的緊密聯(lián)系,減少溝通誤差,提高開(kāi)發(fā)效率和軟件質(zhì)量。
2.領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的基本原則
領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)是一種面向復(fù)雜領(lǐng)域的軟件開(kāi)發(fā)方法,強(qiáng)調(diào)將領(lǐng)域?qū)I(yè)知識(shí)融入到軟件設(shè)計(jì)和開(kāi)發(fā)過(guò)程中。以下是領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的基本原則:
- 模型驅(qū)動(dòng)設(shè)計(jì)(Model-Driven Design):領(lǐng)域模型是軟件設(shè)計(jì)和開(kāi)發(fā)的核心。開(kāi)發(fā)團(tuán)隊(duì)需要與領(lǐng)域?qū)<颐芮泻献鳎餐瑯?gòu)建和演化領(lǐng)域模型,確保模型能夠準(zhǔn)確地反映業(yè)務(wù)領(lǐng)域的知識(shí)和需求。
- 共享模型(Shared Model):領(lǐng)域模型應(yīng)該成為開(kāi)發(fā)團(tuán)隊(duì)和領(lǐng)域?qū)<抑g的共享語(yǔ)言,用于溝通和理解業(yè)務(wù)需求。通過(guò)統(tǒng)一的語(yǔ)言和模型,可以避免溝通誤差和概念混淆,提高開(kāi)發(fā)效率。這點(diǎn)很重要,不知道老鐵們有沒(méi)有發(fā)現(xiàn),在實(shí)際開(kāi)發(fā)過(guò)程中,往往開(kāi)發(fā)人員理解的業(yè)務(wù)和業(yè)務(wù)需求本身相差甚遠(yuǎn),從而造成反復(fù)修改代碼。
- 領(lǐng)域?qū)<覅⑴c(Ubiquitous Language):領(lǐng)域?qū)<覒?yīng)該積極參與領(lǐng)域建模過(guò)程,共同定義和驗(yàn)證領(lǐng)域模型。他們對(duì)業(yè)務(wù)領(lǐng)域的深入了解能夠?yàn)殚_(kāi)發(fā)團(tuán)隊(duì)提供寶貴的業(yè)務(wù)洞察和指導(dǎo)。
- 按領(lǐng)域邊界劃分(Bounded Context):將大型業(yè)務(wù)系統(tǒng)劃分為多個(gè)邊界清晰的領(lǐng)域上下文,每個(gè)領(lǐng)域上下文都有自己的領(lǐng)域模型。這種劃分可以簡(jiǎn)化系統(tǒng)的復(fù)雜性,使開(kāi)發(fā)團(tuán)隊(duì)能夠更好地理解和管理不同領(lǐng)域的業(yè)務(wù)邏輯和規(guī)則。
接下來(lái)將詳細(xì)介紹DDD領(lǐng)域建模的核心概念,理解和應(yīng)用這些概念可以幫助開(kāi)發(fā)團(tuán)隊(duì)構(gòu)建出準(zhǔn)確、可靠的領(lǐng)域模型,更好地滿足業(yè)務(wù)需求。
3.領(lǐng)域建模的核心概念
- 實(shí)體(Entity):實(shí)體是具有唯一標(biāo)識(shí)的領(lǐng)域?qū)ο螅哂猩芷诤蜖顟B(tài)變化。實(shí)體通常具有行為和屬性,并通過(guò)標(biāo)識(shí)符來(lái)進(jìn)行唯一標(biāo)識(shí)。
- 值對(duì)象(Value Object):值對(duì)象是沒(méi)有唯一標(biāo)識(shí)的領(lǐng)域?qū)ο螅纳矸菔峭ㄟ^(guò)其屬性值來(lái)確定的。值對(duì)象通常用于描述領(lǐng)域中的屬性集合,它們是不可變的,不會(huì)發(fā)生狀態(tài)變化。
- 聚合(Aggregate):聚合是一組相關(guān)的領(lǐng)域?qū)ο蟮募希鼈冏鳛橐粋€(gè)整體進(jìn)行處理和管理。聚合定義了聚合根(Aggregate Root)作為訪問(wèn)聚合的唯一入口點(diǎn),并通過(guò)聚合根保持聚合內(nèi)對(duì)象的一致性和完整性。
- 領(lǐng)域服務(wù)(Domain Service):領(lǐng)域服務(wù)是一些與領(lǐng)域邏輯相關(guān)的操作和行為,它們不屬于任何特定的領(lǐng)域?qū)ο螅峭ㄟ^(guò)領(lǐng)域服務(wù)來(lái)實(shí)現(xiàn)。
- 領(lǐng)域事件(Domain Event):領(lǐng)域事件表示領(lǐng)域中發(fā)生的重要事情或狀態(tài)變化,它們被用于通知其他部分關(guān)于領(lǐng)域中發(fā)生的事件,從而引發(fā)相應(yīng)的反應(yīng)和處理。
- 領(lǐng)域模型的層次結(jié)構(gòu):領(lǐng)域模型通常可以劃分為多個(gè)層次,如聚合根、實(shí)體、值對(duì)象、領(lǐng)域服務(wù)等,通過(guò)這種層次結(jié)構(gòu)來(lái)組織和管理領(lǐng)域模型的各個(gè)部分。
4.DDD領(lǐng)域建模方法
領(lǐng)域建模是一個(gè)迭代的過(guò)程,主要涉及以下步驟:
- 領(lǐng)域建模的前期準(zhǔn)備:在開(kāi)始領(lǐng)域建模之前,需要確保團(tuán)隊(duì)對(duì)業(yè)務(wù)領(lǐng)域有基本的了解,并與領(lǐng)域?qū)<疫M(jìn)行初步的溝通和討論。還需要確定建模的范圍和目標(biāo),明確所需的建模工具和技術(shù)。
- 挖掘業(yè)務(wù)領(lǐng)域知識(shí):與領(lǐng)域?qū)<颐芮泻献鳎ㄟ^(guò)訪談、工作坊等方式收集業(yè)務(wù)領(lǐng)域的知識(shí)和需求。理解業(yè)務(wù)概念、規(guī)則、業(yè)務(wù)流程等,并將其轉(zhuǎn)化為領(lǐng)域模型中的概念、屬性和關(guān)系。
- 定義核心領(lǐng)域模型:基于收集到的業(yè)務(wù)領(lǐng)域知識(shí),開(kāi)始構(gòu)建核心領(lǐng)域模型。識(shí)別出領(lǐng)域中的實(shí)體、值對(duì)象、聚合以及它們之間的關(guān)系。使用領(lǐng)域特定語(yǔ)言(DSL)或UML類(lèi)圖等工具來(lái)表達(dá)和記錄領(lǐng)域模型。
- 驗(yàn)證和迭代領(lǐng)域模型:將領(lǐng)域模型與領(lǐng)域?qū)<疫M(jìn)行驗(yàn)證,確保模型準(zhǔn)確地反映業(yè)務(wù)需求。根據(jù)反饋和發(fā)現(xiàn)的問(wèn)題,進(jìn)行模型的修正和迭代。這是一個(gè)迭代循環(huán)的過(guò)程,直到達(dá)到與領(lǐng)域?qū)<业囊恢抡J(rèn)可。
5.領(lǐng)域建模中的挑戰(zhàn)與解決方案
在進(jìn)行領(lǐng)域建模時(shí),可能會(huì)面臨一些挑戰(zhàn),下面是一些常見(jiàn)的挑戰(zhàn)及相應(yīng)的解決方案:
- 復(fù)雜業(yè)務(wù)需求的建模策略:復(fù)雜的業(yè)務(wù)領(lǐng)域可能包含大量的實(shí)體、規(guī)則和流程,如何將其有效地建模是一個(gè)挑戰(zhàn)。解決方案是通過(guò)分解領(lǐng)域模型為較小的子領(lǐng)域,每個(gè)子領(lǐng)域?qū)W⒂诮鉀Q特定的業(yè)務(wù)問(wèn)題,同時(shí)通過(guò)上下文邊界明確不同子領(lǐng)域之間的關(guān)系。
- 大團(tuán)隊(duì)協(xié)作下的領(lǐng)域建模實(shí)踐:在大型項(xiàng)目中,可能涉及多個(gè)開(kāi)發(fā)團(tuán)隊(duì)和領(lǐng)域?qū)<抑g的協(xié)作。為了確保領(lǐng)域模型的一致性和準(zhǔn)確性,需要進(jìn)行跨團(tuán)隊(duì)的溝通和協(xié)調(diào)。解決方案是建立良好的溝通渠道和協(xié)作機(jī)制,例如定期的領(lǐng)域模型評(píng)審會(huì)議、文檔共享和團(tuán)隊(duì)協(xié)作工具的使用。
- 領(lǐng)域模型與持久化模型的映射:領(lǐng)域模型通常是獨(dú)立于數(shù)據(jù)存儲(chǔ)的,而實(shí)際的系統(tǒng)需要將領(lǐng)域模型持久化到數(shù)據(jù)庫(kù)或其他存儲(chǔ)介質(zhì)中。如何將領(lǐng)域模型與持久化模型進(jìn)行映射是一個(gè)重要的問(wèn)題。解決方案是使用ORM(對(duì)象關(guān)系映射)框架或其他映射工具來(lái)實(shí)現(xiàn)領(lǐng)域模型與持久化模型之間的映射,并確保數(shù)據(jù)的一致性和完整性。
接下來(lái)筆者以社交媒體平臺(tái)為例,給大家簡(jiǎn)單介紹下DDD領(lǐng)域建模的實(shí)踐過(guò)程。
- 挖掘社交媒體領(lǐng)域的核心概念:與領(lǐng)域?qū)<液献鳎钊肓私馍缃幻襟w領(lǐng)域的核心概念。通過(guò)訪談、分析現(xiàn)有平臺(tái)等方式,收集業(yè)務(wù)領(lǐng)域的核心概念,如用戶(hù)、帖子、評(píng)論、關(guān)注等。探索各個(gè)概念之間的關(guān)系和交互。
- 定義用戶(hù)、帖子、評(píng)論等核心領(lǐng)域模型:基于收集到的業(yè)務(wù)知識(shí),開(kāi)始構(gòu)建核心領(lǐng)域模型。例如,用戶(hù)可以被定義為一個(gè)實(shí)體,具有屬性如用戶(hù)名、頭像、粉絲數(shù)等。帖子可以被定義為一個(gè)實(shí)體,具有屬性如內(nèi)容、發(fā)布時(shí)間、點(diǎn)贊數(shù)等。評(píng)論可以被定義為一個(gè)實(shí)體,具有屬性如內(nèi)容、評(píng)論時(shí)間、用戶(hù)信息等。用戶(hù)之間的關(guān)注關(guān)系可以建模為一個(gè)聚合,包含關(guān)注者和被關(guān)注者等。
- 實(shí)現(xiàn)領(lǐng)域模型的驗(yàn)證和迭代:與領(lǐng)域?qū)<乙黄痱?yàn)證領(lǐng)域模型的準(zhǔn)確性和可行性。通過(guò)模擬用戶(hù)交互和業(yè)務(wù)流程,驗(yàn)證領(lǐng)域模型的適用性。例如,可以模擬用戶(hù)發(fā)布帖子、添加評(píng)論、關(guān)注其他用戶(hù)等場(chǎng)景,驗(yàn)證領(lǐng)域模型的有效性。根據(jù)反饋和發(fā)現(xiàn)的問(wèn)題,對(duì)領(lǐng)域模型進(jìn)行迭代和改進(jìn),確保模型能夠準(zhǔn)確地反映社交媒體平臺(tái)的業(yè)務(wù)需求。
在該例中,重要的是捕捉用戶(hù)之間的關(guān)系和交互,以及帖子、評(píng)論等核心概念的屬性和行為。通過(guò)定義清晰的領(lǐng)域模型,可以更好地理解和滿足社交媒體平臺(tái)的業(yè)務(wù)需求。
6.DDD領(lǐng)域建模的優(yōu)勢(shì)和適用場(chǎng)景
領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(DDD)的領(lǐng)域建模方法具有以下優(yōu)勢(shì):
- 更好的業(yè)務(wù)理解:領(lǐng)域建模幫助開(kāi)發(fā)團(tuán)隊(duì)更深入地理解業(yè)務(wù)領(lǐng)域,通過(guò)共享的語(yǔ)言和模型來(lái)準(zhǔn)確表達(dá)業(yè)務(wù)需求。
- 可維護(hù)的代碼:通過(guò)將業(yè)務(wù)邏輯和領(lǐng)域知識(shí)融入到領(lǐng)域模型中,代碼更易于理解、擴(kuò)展和維護(hù)。
- 減少溝通成本:領(lǐng)域建模提供了一種與領(lǐng)域?qū)<疫M(jìn)行有效溝通的方式,減少溝通誤差,提高團(tuán)隊(duì)的協(xié)作效率。
- 高質(zhì)量的軟件:通過(guò)準(zhǔn)確的領(lǐng)域模型,可以更好地滿足業(yè)務(wù)需求,提供高質(zhì)量的軟件解決方案。
7.DDD領(lǐng)域建模的注意事項(xiàng)和挑戰(zhàn)
在實(shí)踐DDD領(lǐng)域建模時(shí),需要注意以下事項(xiàng)和挑戰(zhàn):
- 需要領(lǐng)域?qū)<业膮⑴c和支持:領(lǐng)域建模需要與領(lǐng)域?qū)<揖o密合作,他們對(duì)業(yè)務(wù)領(lǐng)域的深入理解是建模過(guò)程的關(guān)鍵。
- 需要適當(dāng)?shù)某橄蠛头纸?/span>:領(lǐng)域建模需要在抽象和細(xì)節(jié)之間找到平衡,以確保模型既準(zhǔn)確又可理解。
- 持續(xù)的迭代和改進(jìn):領(lǐng)域模型是一個(gè)持續(xù)演化的過(guò)程,需要根據(jù)反饋和需求的變化進(jìn)行不斷迭代和改進(jìn)。
- 需要技術(shù)和業(yè)務(wù)的理解:領(lǐng)域建模需要開(kāi)發(fā)團(tuán)隊(duì)具備一定的技術(shù)和業(yè)務(wù)理解能力,以更好地應(yīng)用DDD方法。
作者介紹
波哥,在互聯(lián)網(wǎng)行業(yè)從業(yè)10余年,先后擔(dān)任項(xiàng)目總監(jiān)及架構(gòu)師。目前專(zhuān)攻技術(shù),喜歡研究技術(shù)原理。技術(shù)全面,主攻Java,精通JVM底層機(jī)制及Spring全家桶底層框架原理,熟練掌握當(dāng)前主流的中間件、服務(wù)網(wǎng)格等技術(shù)原理。




























