DDD领域驱动设计---战略设计(包括四色原型建模)
????? 相當(dāng)于策略設(shè)計(jì),從宏觀角度著眼于領(lǐng)域的分析設(shè)計(jì),屬于系統(tǒng)分析階段,注重如何從有界上下文中尋找領(lǐng)域模型,戰(zhàn)略模式由有界上下文、無所不在的語言和上下文映射組成。
???? 在戰(zhàn)略設(shè)計(jì)前首先要了解下領(lǐng)域知識(shí)、業(yè)務(wù)策略、業(yè)務(wù)規(guī)劃。
?????? 1、有界上下文:是指再空間或時(shí)間上有邊界的一段環(huán)境背景,它確定了每個(gè)模型的適用范圍,模型體現(xiàn)了這個(gè)范圍內(nèi)的邏輯一致性。
?????? 2、統(tǒng)一語言:統(tǒng)一語言必須在領(lǐng)域模型中表達(dá)出來,主要體現(xiàn)在領(lǐng)域模型中的名稱上。不應(yīng)只由業(yè)務(wù)專家或是其他單一職位定義,而應(yīng)團(tuán)隊(duì)人員共同商定。
?????? 3、上下文映射組成(上下文關(guān)系):
????????????? a、共享內(nèi)核(例如兩個(gè)團(tuán)隊(duì)共享一份類庫)此種方式很少用,耦合度太高。
????????????? b、開發(fā)主機(jī)服務(wù)也就是上下游關(guān)系映射或API調(diào)用,一個(gè)服務(wù)通過RPC等同步方式調(diào)用另一個(gè)上下文的API,這種目前比較普及。
????????????? c、發(fā)布\訂閱模式:一個(gè)發(fā)布,一個(gè)訂閱,只依賴事件或消息,使得兩者之間最大化松耦合。???
????????????? d、發(fā)布語言(Published Language):兩個(gè)有界上下文中的模型溝通的語言表達(dá)方式。例如XML,JSON
?????? 康威第一定理(Conways Law):組織性質(zhì)決定架構(gòu)。即系統(tǒng)架構(gòu)代表實(shí)現(xiàn)系統(tǒng)的組織的溝通結(jié)構(gòu),對(duì)于軟件中的每個(gè)模塊,都對(duì)應(yīng)有一個(gè)組織單元;組織單元之間存在溝通依賴,軟件中對(duì)應(yīng)的模塊之間同樣存在依賴關(guān)系。
?????? 在領(lǐng)域(獨(dú)立的產(chǎn)品或是項(xiàng)目)中劃分{核心子域(業(yè)務(wù)策略和業(yè)務(wù)規(guī)則重點(diǎn)實(shí)施地),支持(輔助)子域,通用子域。}(具體的項(xiàng)目)每個(gè)域確定上下文(領(lǐng)域邊界)
?????? 最佳實(shí)踐:一個(gè)有界上下文對(duì)應(yīng)一個(gè)子域,對(duì)應(yīng)一個(gè)團(tuán)隊(duì),對(duì)應(yīng)一個(gè)微服務(wù)。
?????? DDD建模基本上只需要三種UML圖:用例圖(表達(dá)需求用例)、序列圖(模擬領(lǐng)域中的邏輯流程,能夠記錄和驗(yàn)證邏輯)、類圖(表達(dá)類與結(jié)構(gòu)關(guān)系)。
劃清領(lǐng)域上下文的方法:
????? 1、通過領(lǐng)域故事(Domain Storytelling)的方式,專注于領(lǐng)域知識(shí),通過領(lǐng)域語言來探索和理解用戶流程、工作程序和整體業(yè)務(wù)流程和規(guī)則。
???? 例如:問:“你的工作做什么的?”
??????????????? 答:“進(jìn)行貨運(yùn)計(jì)劃調(diào)度”
??????????????? 問:“具體怎么回事?”
??????????????? 答:“舉個(gè)例子,客戶需要托運(yùn)一批貨物,然后需要讓路線小組規(guī)劃路線,機(jī)場小組再分配計(jì)劃,最后指定機(jī)位。”
??????????????? 這里“客戶需要托運(yùn)一批貨物”主語是“客戶”,謂語動(dòng)詞“托運(yùn)”,賓語是“貨物”。可以使用不同顏色表示他們:黃色是主語,粉紅色表謂語,藍(lán)色表示賓語,具體顏色取決自己,也可參考下面的四色原型。
???? 2、還有填寫表格法和事件風(fēng)暴會(huì)議發(fā)現(xiàn)有界上下文。
本環(huán)節(jié)最主要的就是劃清領(lǐng)域上下文。也是整個(gè)領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的難點(diǎn)。
領(lǐng)域事件:事件代表過去發(fā)生完成的事,它既是業(yè)務(wù)架構(gòu)概念也是技術(shù)架構(gòu)概念,以事件為驅(qū)動(dòng)的編程技術(shù)模型稱為事件驅(qū)動(dòng)架構(gòu)(EDA)。領(lǐng)域事件強(qiáng)調(diào)其業(yè)務(wù)概念。事件即指已經(jīng)發(fā)生的事情,可以從動(dòng)詞完成時(shí)理解。
命令:命令表示事件的觸發(fā)器。命令是請(qǐng)求,而事件是完成。命令相當(dāng)于頁面(UI)點(diǎn)擊的按鈕來觸發(fā)一個(gè)需要完成的任務(wù),這個(gè)完成的任務(wù)既是指一個(gè)事件。
命令命名和事件命名,命令命名相當(dāng)于動(dòng)詞結(jié)尾的ing,事件命名相當(dāng)于結(jié)尾的ed。
關(guān)鍵事件:即指識(shí)別狀態(tài)機(jī)狀態(tài)之間轉(zhuǎn)換的事件,關(guān)鍵事件是領(lǐng)域邊界劃分的重要指標(biāo)。
還有事件建模頭腦風(fēng)暴法,這個(gè)也是工作中會(huì)使用的方法,但是這種方法一定要確定會(huì)議各階段目標(biāo),要不效率太低。
例如:首先,確定探索子域。
? ? ? ? ? ?2、確定探索有節(jié)上下文。
? ? ? ? ? ?3、確定用戶角色,那些角色發(fā)出那些命令,完成那些事件。
? ? ? ? ? ?4、確定關(guān)鍵測試場景。
????? 可參考四色原型建模:
????? 1、moment-interval(某個(gè)時(shí)刻(moment)或一段很短時(shí)間(interval)內(nèi). 意味在某個(gè)時(shí)刻發(fā)生的事情因?yàn)闃I(yè)務(wù)要求或合法性原因需要跟蹤;或者過一段時(shí)間以后,應(yīng)該是很短的時(shí)間,可以幫助我們尋找到它。)
?????? 賣東西是在某個(gè)時(shí)刻發(fā)生的,它有發(fā)生日期和時(shí)間。租賃行為是在一段時(shí)間內(nèi)發(fā)生,從開始出租和歸還所租物品;預(yù)定也是持續(xù)一段時(shí)間,什么時(shí)候預(yù)定;什么時(shí)候過期等。
這些我們都使用moment-interval原型來表達(dá)。Moment-intervals經(jīng)常封裝的是最關(guān)鍵的方法,為讓其顯目,moment-interval的UML圖我們使用粉紅顏色表示
????? 2、role(角色原型比較容易理解,任何一個(gè)系統(tǒng)都需要人或某個(gè)組織介入運(yùn)行,例如論壇系統(tǒng)需要注冊(cè)者角色發(fā)言;銷售訂單需要業(yè)務(wù)員角色制定,等等。)
?????? 這里有一個(gè)Party原型定義:它表示一個(gè)可標(biāo)識(shí)、可定位的單元,這個(gè)單元有自己正常的狀態(tài)并且能夠自主控制自己的一些行為,通常情況下,人或組織是一種Party,但象護(hù)照,身份證等注冊(cè)性標(biāo)志等都可以作為Party。
?????? Role角色是Party扮演的(a role that a Party plays),Party是角色Role的扮演者(role-player)。角色原型在UML中是使用黃顏色標(biāo)識(shí)的。角色模型是第二重要的原型,所以使用黃色。
????? 3、description archetype
?????? 比如你的紅色福克斯是福特生產(chǎn)的一輛轎車,它有車牌號(hào)、購買日期、顏色和里程表等,這些代表Thing原型,那么作為轎車這個(gè)種類來說,它有一些種類屬性,例如:生產(chǎn)廠家、生產(chǎn)批號(hào)、適用顏色等,這些屬性是轎車這類所有車輛都共有的。
??????? 在設(shè)計(jì)模式這個(gè)實(shí)現(xiàn)級(jí)別,我們通常使用組合模式來實(shí)現(xiàn)種類原型。Description原型在UML中使用藍(lán)色表達(dá)。
????? 4、party, place or thing
???????? party place或thing都可以成為角色原型,注意到角色原型中的UML圖,party圖是以綠色表達(dá)。
????
總結(jié)
以上是生活随笔為你收集整理的DDD领域驱动设计---战略设计(包括四色原型建模)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DDD领域驱动设计简介
- 下一篇: DDD领域驱动设计特点及难点