領(lǐng)域建模
描述
領(lǐng)域建谋幼唬可以理解為對(duì)要解決的現(xiàn)實(shí)中的業(yè)務(wù)問題進(jìn)行歸納、需求分析的一個(gè)過程。領(lǐng)域模型是領(lǐng)域類或者是業(yè)務(wù)實(shí)體的可視化展示粉铐,可作為是一種將業(yè)務(wù)人員需求轉(zhuǎn)為技術(shù)層面向?qū)ο笤O(shè)計(jì)的溝通交流工具藐吮。(不要和DDD混為一談啦)
價(jià)值和目的
建立開發(fā)和業(yè)務(wù)都能理解的統(tǒng)一語言溺拱,建立系統(tǒng)的服務(wù)地圖,識(shí)別應(yīng)該重點(diǎn)投入的核心領(lǐng)域谣辞。
適?場(chǎng)景
完成場(chǎng)景識(shí)別與流程設(shè)計(jì)之后迫摔,適用需要拆分的遺留系統(tǒng)或需要建模的新系統(tǒng),通常在詳細(xì)方案設(shè)計(jì)階段進(jìn)行泥从。
過程步驟
第一步句占,業(yè)務(wù)場(chǎng)景分析
根據(jù)業(yè)務(wù)流程或用戶旅程,識(shí)別出需要重點(diǎn)分析的領(lǐng)域場(chǎng)景躯嫉。這一步可參考上一篇指南“場(chǎng)景與流程設(shè)計(jì)”纱烘。
第二步,識(shí)別關(guān)鍵領(lǐng)域事件
通過頭腦風(fēng)暴的方式祈餐,團(tuán)隊(duì)成員一起發(fā)散尋找核心域中業(yè)務(wù)關(guān)心的事件擂啥。將所有事件記在橙色便簽上,按時(shí)間順序貼到看板帆阳,形成一條或多條團(tuán)隊(duì)認(rèn)可的事件流程哺壶。識(shí)別事件要點(diǎn)如下:1.根據(jù)事件因果關(guān)系來識(shí)別各自的前置事件和后置事件。2.在識(shí)別事件過程中,發(fā)現(xiàn)事件流分支山宾;出現(xiàn)分歧和爭(zhēng)執(zhí)的事件至扰;需要強(qiáng)調(diào)的事件或?qū)?yīng)的領(lǐng)域邏輯的事件需要用粉色便簽標(biāo)記好,重點(diǎn)關(guān)注塌碌。
[if !supportLists]??[endif]事件命名時(shí)需要充分溝通交流渊胸,提煉出統(tǒng)一語言。如訂單已創(chuàng)建,(OrdeCreated)台妆,即業(yè)務(wù)名稱+動(dòng)詞過去時(shí)態(tài)的形式翎猛。
第三步、識(shí)別決策和命令
接著以事件為線索進(jìn)行反推接剩,是可以找到觸發(fā)事件的命令及命令的發(fā)出者的切厘,領(lǐng)域事件觸發(fā)來源包括:角色(觸發(fā)事件的人)、策略(觸發(fā)事件的規(guī)則)懊缺、外部系統(tǒng)疫稿、事件(即事件的當(dāng)前事件)。以此完善核心子域的領(lǐng)域事件的實(shí)際業(yè)務(wù)場(chǎng)景鹃两。如下圖所示:
第四步遗座、識(shí)別業(yè)務(wù)實(shí)體
接下來要根據(jù)決策和領(lǐng)域事件之間的關(guān)系找出業(yè)務(wù)主體。例如:在“訂單已創(chuàng)建”的領(lǐng)域事件與“提交訂單”決策之間抽象的業(yè)務(wù)主體有可能是“訂單”俊扳。這里有兩個(gè)方式找到實(shí)體:
找決策與事件中的名詞途蒋,并通過上下文場(chǎng)景驗(yàn)證業(yè)務(wù)概念的合理性。?
結(jié)合決策和事件馋记,補(bǔ)充并定義聚合根/實(shí)體/值對(duì)象号坡。
接下來要將已經(jīng)識(shí)別出的領(lǐng)域事件進(jìn)一步劃分為子域梯醒,每個(gè)子域?qū)?yīng)一個(gè)更小的問題域或更小的業(yè)務(wù)范圍宽堆。劃分出來的多個(gè)核心子領(lǐng)域構(gòu)成整個(gè)業(yè)務(wù)領(lǐng)域中的核心問題域。
第六步茸习、識(shí)別限界上下文.
以產(chǎn)品愿景為前提,圍繞某個(gè)業(yè)務(wù)價(jià)值進(jìn)行聚合建設(shè)涕刚。
將業(yè)務(wù)能力相似的問題域聚合放到一個(gè)限界上下文中。
打開問題域聚合乙帮,發(fā)現(xiàn)問題域中有二義性的部分杜漠,將其分解成多個(gè)聚合,劃分到不同的限界上下文中。
根據(jù)組織結(jié)構(gòu)與團(tuán)隊(duì)結(jié)構(gòu)驾茴,將不同團(tuán)隊(duì)所負(fù)責(zé)的業(yè)務(wù)能力放到不同的限界上下文中盼樟。
考慮技術(shù)約束,包括:技術(shù)異構(gòu)與語言異構(gòu)锈至,非功能需求晨缴,技術(shù)限制等。
第七步峡捡、識(shí)別上下文映射
首先識(shí)別跨界限上下文之間的相鄰事件關(guān)系击碗,其次是事件之間是否存在直接觸發(fā)關(guān)系。最后判斷:前置事件為下游為D表示依賴方们拙。后置事件為上游U表示被依賴方稍途。完成上下文映射識(shí)別后,即可得到領(lǐng)域分析模型砚婆。
常見工具
事件風(fēng)暴:是事件風(fēng)暴由Alberto Brandolini提出械拍,是一種在領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)環(huán)境中的研討會(huì)格式,可讓您快速分析復(fù)雜業(yè)務(wù)領(lǐng)域,完成領(lǐng)域建模的目的方法装盯。
關(guān)鍵技巧
“不忘初心”坷虑,在劃分核心子領(lǐng)域的時(shí)候,以業(yè)務(wù)價(jià)值聚合建設(shè)埂奈,識(shí)別核心域迄损。
“避免分布式單體”如果你想研究籃子,就不要把雞蛋打碎挥转。同樣每個(gè)子域?qū)τ诮鉀Q某個(gè)特定的問題海蔽,如果問題的再分解后,邊界更加混亂绑谣,建議先不分解党窜。