本文希望能夠通過(guò)總結(jié)過(guò)去自己對(duì)領(lǐng)域建模的一點(diǎn)粗淺經(jīng)驗(yàn)給需要的同學(xué)能有些許啟發(fā),少走彎路。
背景
總體思想
-
需求模型:通過(guò)和產(chǎn)品及業(yè)務(wù)同學(xué)的溝通,結(jié)合行業(yè)經(jīng)驗(yàn)和知識(shí),明確用戶(hù)的真實(shí)需求; -
領(lǐng)域模型:基于需求模型,提煉出領(lǐng)域相關(guān)的概念,為后面的面向?qū)ο笤O(shè)計(jì)打下基礎(chǔ); -
代碼模型:以領(lǐng)域模型為基礎(chǔ),綜合面向?qū)ο蟮母鞣N設(shè)計(jì)技巧,完成類(lèi)的設(shè)計(jì); -
數(shù)據(jù)模型:以代碼模型類(lèi)及類(lèi)之間的關(guān)系,用ER圖刻畫(huà)數(shù)據(jù)的底層存儲(chǔ)關(guān)系;
還有一個(gè)重要的認(rèn)知,領(lǐng)域建模并不是萬(wàn)能的,比如你做的系統(tǒng)很簡(jiǎn)單,使用數(shù)據(jù)庫(kù)的CRUD可能一個(gè)更好的方式(如上圖中的虛線(xiàn)箭頭),如果做的是基礎(chǔ)架構(gòu),比如開(kāi)發(fā)一個(gè)RPC框架,也不需要用領(lǐng)域驅(qū)動(dòng)。運(yùn)用領(lǐng)域驅(qū)動(dòng)的前提一定是業(yè)務(wù)足夠復(fù)雜且多變,需要系統(tǒng)靈活支持。下面這個(gè)圖供參考:
需求建模
萬(wàn)事開(kāi)頭難,需求是項(xiàng)目最開(kāi)始的輸入,肯定是非常重要的,但現(xiàn)實(shí)情況往往是當(dāng)我們接到需求后第一個(gè)想到的問(wèn)題確是我該如何實(shí)現(xiàn),而沒(méi)有在業(yè)務(wù)思考這一塊過(guò)多的停留。如果最開(kāi)始理解的輸入是錯(cuò)誤的,后面的過(guò)程再優(yōu)秀可想而知也只能是垃圾。為了解決這一問(wèn)題,很多優(yōu)秀的大佬發(fā)明了很多對(duì)需求進(jìn)行功能建模的工具,主要目的就是讓我們更好的理解需求并認(rèn)識(shí)其背后的本質(zhì)。如常用的工具有5w2h、業(yè)務(wù)活動(dòng)、用戶(hù)旅程、商業(yè)畫(huà)布等。這些在網(wǎng)上都有很多的資料,只舉幾個(gè)例子,不做重點(diǎn)介紹。
-
業(yè)務(wù)活動(dòng)
-
用戶(hù)旅程
-
商業(yè)畫(huà)布
領(lǐng)域建模
下面的每一種方法都是從某一個(gè)角度幫助我們更好理解客觀(guān)事物,所以沒(méi)有哪一種方法是萬(wàn)能的,在實(shí)際項(xiàng)目中常常要多種方法共用,才可能認(rèn)清事情的全貌。
?
四步建模
在我們?nèi)粘9ぷ鞯捻?xiàng)目中,大多數(shù)場(chǎng)景都可以通過(guò)在需求用例中通過(guò)找名稱(chēng)的方式來(lái)最終刻畫(huà)出領(lǐng)域模型,當(dāng)然找到的名詞后并不是所有的都符合要求,這時(shí)可以通過(guò)一條原則"一個(gè)名詞或?qū)嶓w必有其屬性和行為,一屬性或行為也必歸屬于一個(gè)實(shí)體"來(lái)進(jìn)行提煉,不符合這條原則的名詞就是需求剔除的。總體來(lái)說(shuō)建模一共分為四步
-
選名詞:從用例中選出所有名詞,在去偽存真選出符合要求的; -
找動(dòng)詞:找出所有動(dòng)詞,在判斷這些動(dòng)詞屬不屬于上一步選出的名詞所具有的行為; -
加屬性:找出所有屬性,在判斷這些屬性屬不屬于上一步選出的名詞所具有的特征; -
連關(guān)系:確定實(shí)體和實(shí)體之間的協(xié)作關(guān)系;
案例:用戶(hù)購(gòu)買(mǎi)商品
需求用例
用例名稱(chēng) |
用戶(hù)購(gòu)買(mǎi)商品 |
用例描述 |
1、用戶(hù)在購(gòu)物app上選取多款商品進(jìn)行下單 2、通過(guò)用戶(hù)檔案獲取用戶(hù)名稱(chēng)、地址等信息 3、從不同商家購(gòu)買(mǎi)的商品生成不同的子訂單;記錄商品及其數(shù)量,并匯總付款金額 4、保存訂單 5、選擇一種支付方式(包括銀行卡、支付寶、微信)并進(jìn)行支付;超過(guò)30分鐘未支付自動(dòng)取消訂單 |
約束和限制 |
1、一個(gè)商品單次購(gòu)買(mǎi)不能超過(guò)30單 2、單次支付金額最大不能超過(guò)99999RMB |
建模步驟
第一步:選名詞。從用例上選的名詞如下:用戶(hù)、購(gòu)物app、商品、用戶(hù)檔案、用戶(hù)名稱(chēng)、地址、商家、訂單、子訂單、支付方式、銀行卡、支付寶、微信。通過(guò)這種方式可以很輕松的識(shí)別領(lǐng)域中的相關(guān)概念,但選取的名詞并不一定都是領(lǐng)域相關(guān)的,所以接下來(lái)還需要進(jìn)一步的提煉。提煉過(guò)程
-
刪除"購(gòu)物app":購(gòu)物app只是一個(gè)功能的載體,并不屬于購(gòu)買(mǎi)商品流量里的一個(gè)領(lǐng)域概念,所以刪掉 -
刪除"用戶(hù)名稱(chēng)" :用戶(hù)名稱(chēng)只是用戶(hù)的一個(gè)屬性,并不是領(lǐng)域概念 -
刪除"地址" :地址只是用戶(hù)檔案的一個(gè)屬性,并不是領(lǐng)域概念 -
刪除"銀行卡、支付寶、微信、支付方式":銀行卡、支付寶、微信屬于支付方式的一種具體形式,而支付方式可以歸屬為訂單的一個(gè)屬性,并不是獨(dú)立的領(lǐng)域概念
所以最終提取的領(lǐng)域?qū)嶓w是:用戶(hù)、商品、用戶(hù)檔案、子訂單、訂單、商家
第二步:找動(dòng)詞。從用例上選的動(dòng)詞如下:選取、匯總、下單、保存、支付、取消
找動(dòng)詞的目的是反向檢查是否有遺漏的實(shí)體沒(méi)有提煉出來(lái),因?yàn)橛行╇[含的概念并不一定能在用例里找到,且一個(gè)動(dòng)作必歸屬于一個(gè)實(shí)體。如果有發(fā)現(xiàn)動(dòng)作沒(méi)有歸屬實(shí)體只有2種情況,一是這個(gè)動(dòng)作不屬于這個(gè)領(lǐng)域,二是有遺漏的實(shí)體沒(méi)有提取出來(lái)。經(jīng)過(guò)分析 "選取" 是用戶(hù)主觀(guān)的一種行為,并不屬于這個(gè)領(lǐng)域所以刪掉,"下單、匯總、保存、支付、取消" 都屬于訂單的動(dòng)作。
第三步:加屬性。理論上產(chǎn)品同學(xué)要在用例上把模型的所有屬性全部列出來(lái),但現(xiàn)實(shí)情況不一定能做到,這時(shí)除了用例還需要當(dāng)面和產(chǎn)品對(duì)焦清楚各個(gè)模型的屬性。
名詞 |
屬性 |
用戶(hù) |
用戶(hù)名稱(chēng)、性別、證據(jù)類(lèi)型、手機(jī)號(hào) |
商品 |
商品名稱(chēng)、單價(jià)、商家、商品類(lèi)別、商品編碼 |
用戶(hù)檔案 |
國(guó)家、省份、地市、區(qū)縣、地址詳情、聯(lián)系電話(huà) |
子訂單 |
商品、數(shù)量、單價(jià)、金額 |
訂單 |
用戶(hù)、地址、金額、下單時(shí)間 |
商家 |
商家名稱(chēng)、經(jīng)營(yíng)地址、經(jīng)營(yíng)范圍、聯(lián)系人、聯(lián)系電話(huà) |
第四步:連關(guān)系。關(guān)系主要表達(dá)模型和模型之間怎樣協(xié)作
補(bǔ)充場(chǎng)景:比如 "一個(gè)客戶(hù)想入駐平臺(tái)成為一個(gè)服務(wù)商",按照上述方法提煉出動(dòng)詞"入駐",但會(huì)發(fā)現(xiàn)其并不適合成為"客戶(hù)"、"平臺(tái)"、"服務(wù)商"實(shí)體的行為,因此可以反向推出還應(yīng)存在另外一個(gè)實(shí)體"入駐申請(qǐng)單"的概念,"入駐" 這個(gè)動(dòng)詞更準(zhǔn)確的叫法是"申請(qǐng)入駐"。
?
歸類(lèi)分組
歸類(lèi)分組,就是把具有相似性或相關(guān)聯(lián)的信息,按照一定的標(biāo)準(zhǔn)進(jìn)行分類(lèi),歸為同一個(gè)邏輯范疇?!邦?lèi)”是一個(gè)極其重要的概念,可以看作本質(zhì)相同或相似的事物的集合。分類(lèi)就是按照一定的標(biāo)準(zhǔn),根據(jù)對(duì)象屬性、特征的共同點(diǎn)和不同點(diǎn),將對(duì)象劃分為不同的種類(lèi)。分類(lèi)時(shí),需要對(duì)這些類(lèi)別進(jìn)行鑒定、描述和命名。
分類(lèi)在生活中無(wú)處不在。通過(guò)分類(lèi),一方面可以把雜亂無(wú)序的事物區(qū)分開(kāi)來(lái);另一方面還要賦予不同類(lèi)別以穩(wěn)定的、概念化的名稱(chēng)。一個(gè)好的命名,能夠簡(jiǎn)潔有力地表述事物的本質(zhì)。分類(lèi)的過(guò)程,就是探尋事物和問(wèn)題本質(zhì)的過(guò)程。
如何用歸類(lèi)分組進(jìn)行領(lǐng)域建??梢苑譃?個(gè)步驟
第一步:定義要建模的領(lǐng)域問(wèn)題:也就是要清楚我們要解決的問(wèn)題是什么?
第二步:對(duì)領(lǐng)域問(wèn)題進(jìn)行拆解:對(duì)問(wèn)題進(jìn)行分析拆解,形成平鋪的多個(gè)子問(wèn)題,此步驟可以盡量發(fā)散
第三步:歸類(lèi)分組:對(duì)子問(wèn)題進(jìn)行歸類(lèi),剪枝,將趨同的子問(wèn)題,合并成一類(lèi)(可以理解問(wèn)產(chǎn)出實(shí)體)
?
案例:生活服務(wù)類(lèi)商品
生活服務(wù)類(lèi)商品場(chǎng)景
-
預(yù)定類(lèi)商品(KTV預(yù)定、休娛預(yù)定、麗人預(yù)定等):
-
可以按照周期設(shè)置每周的價(jià)格;支持設(shè)定節(jié)假日的價(jià)格; -
業(yè)務(wù)特點(diǎn):商品價(jià)格同樣呈周期性變化,有特殊日期以及不可用日期;計(jì)價(jià)方式包括按人、按間
-
場(chǎng)館預(yù)定類(lèi)
歸類(lèi)分組建模過(guò)程:
-
第一步:定義要建模的領(lǐng)域問(wèn)題:從上面的售賣(mài)商品場(chǎng)景可以看出一個(gè)商品有多個(gè)價(jià)格;而決定這個(gè)價(jià)格的是由一系列的因子決定的,有可能是0個(gè)也可能是多個(gè);如何用一套完備的價(jià)格模型來(lái)支持這些場(chǎng)景是需要解決的問(wèn)題; -
第二步:對(duì)領(lǐng)域問(wèn)題進(jìn)行拆解:羅列出所有商品價(jià)格的場(chǎng)景;
-
第三步:歸類(lèi)分組:
-
按人群、日期、階梯、座位等類(lèi)型,可以統(tǒng)一抽象為價(jià)格的不同"維度" -
原價(jià)、起拍價(jià)、保證金、評(píng)估價(jià)等可以看做室價(jià)格的不同類(lèi)型
所以一個(gè)價(jià)格由什么決定:sku的價(jià)格 = 價(jià)格類(lèi)型 + 價(jià)格維度 + 具體價(jià)格,具體抽象過(guò)程如下:
-
第四步;產(chǎn)出領(lǐng)域模型
案例:本地通商家成長(zhǎng)
商家成長(zhǎng):為不同層級(jí)的商家門(mén)店下發(fā)不同類(lèi)型的任務(wù),完成對(duì)應(yīng)的任務(wù),商家會(huì)獲取到對(duì)應(yīng)的權(quán)益,進(jìn)而幫助商家在平臺(tái)的不同階段能夠更好的成長(zhǎng)。
-
第一步:定義要建模的領(lǐng)域問(wèn)題,針對(duì)門(mén)店維度為商家建立一套任務(wù)體系,不同的門(mén)店可以下發(fā)不同的系列任務(wù)
-
第二步:略
-
第三步:
-
基礎(chǔ)裝修、商品優(yōu)化、服務(wù)評(píng)價(jià)等屬于一個(gè)維度,可以抽象為"任務(wù)流" -
門(mén)店圖、手藝人、是否有品牌故事等屬于一個(gè)維度,可以抽象為"任務(wù)" -
而由"門(mén)店圖、手藝人"等任務(wù)組成的基礎(chǔ)裝修,可以抽象為"任務(wù)組" -
門(mén)店圖片里又包含指標(biāo)和完成的跳轉(zhuǎn)動(dòng)作,可以分別抽象為"任務(wù)指標(biāo)","任務(wù)動(dòng)作"
-
第四步;產(chǎn)出領(lǐng)域模型
?
事件風(fēng)暴
為什么引入事件風(fēng)暴。事件風(fēng)暴之一的作用就是拉通業(yè)務(wù)方、產(chǎn)品、研發(fā)、測(cè)試對(duì)業(yè)務(wù)知識(shí)的統(tǒng)一理解,避免各方理解誤差。但在實(shí)際操作中受限于各方時(shí)間協(xié)調(diào)的難度及領(lǐng)域?qū)<业慕巧娜笔?,事件風(fēng)暴往往作為理解業(yè)務(wù),領(lǐng)域建模及領(lǐng)域劃分的利器去使用。
什么是事件風(fēng)暴。事件風(fēng)暴是一種以工作坊的方式對(duì)復(fù)雜業(yè)務(wù)領(lǐng)域進(jìn)行探索的高效協(xié)作方法,事件風(fēng)暴強(qiáng)調(diào)以事件驅(qū)動(dòng)團(tuán)隊(duì)探索分析業(yè)務(wù)領(lǐng)域。
-
一種捕獲行為需求的方法
-
強(qiáng)調(diào)以先發(fā)散后收斂的方式開(kāi)展
-
相關(guān)干系人協(xié)作的方式進(jìn)行
-
注重對(duì)領(lǐng)域事件的識(shí)別
事件風(fēng)暴相關(guān)元素
-
事件:重要且已發(fā)生的事情。命名方式:完成時(shí)+被動(dòng)語(yǔ)態(tài)=賓語(yǔ)+動(dòng)詞過(guò)去式
-
命令:產(chǎn)生事件觸發(fā)的動(dòng)作
-
角色/執(zhí)行者:觸發(fā)命令的主體,包括:人員、系統(tǒng)、定時(shí)任務(wù)
-
讀模型:執(zhí)行者決策執(zhí)行命令時(shí)參考的視圖元素
-
識(shí)別重要事件
-
識(shí)別命令
-
識(shí)別執(zhí)行者和讀模型
-
識(shí)別領(lǐng)域?qū)ο?/p>
-
產(chǎn)出領(lǐng)域模型
案例:銷(xiāo)售基礎(chǔ)
產(chǎn)品截圖
-
識(shí)別重要事件
-
識(shí)別命令
-
識(shí)別執(zhí)行者和讀模型
-
識(shí)別領(lǐng)域?qū)ο?/section>
這里說(shuō)的領(lǐng)域?qū)ο?,是從命令、領(lǐng)域事件、執(zhí)行者、查詢(xún)數(shù)據(jù)里找到的名詞性概念。例如,對(duì)于簽訂合同這個(gè)命令而言,受到影響的名詞性概念是“合同”;類(lèi)似地,對(duì)于合同已簽訂這個(gè)領(lǐng)域事件,是由于“合同”這個(gè)名詞性概念的狀態(tài)變化所導(dǎo)致的。
-
產(chǎn)出領(lǐng)域模型
?
?
四色建模
關(guān)于四色建模的概念我們可與追溯到90年代,是被廣泛使用的一種系統(tǒng)分析方法。四色建模的目的是要對(duì)目標(biāo)業(yè)務(wù)系統(tǒng)進(jìn)行分析并通過(guò)不同的顏色標(biāo)示出人,事,物,角色,通過(guò)四色建模得到四色原型圖,每個(gè)原型圖有屬性和連接(關(guān)聯(lián)與依賴(lài)等關(guān)系)兩個(gè)部分組成。
那四色原型具體是哪四色呢?一起來(lái)看看
-
時(shí)標(biāo)原型(Moment-Interval Archetype,簡(jiǎn)稱(chēng)MI)
-
表示事物在某個(gè)時(shí)刻或某一段時(shí)間內(nèi)發(fā)生的,如銷(xiāo)售訂單、收款記錄等,使用淺紅色表示。
-
PPT原型(Part-Place-Thing Archetype,人/事/物原型,簡(jiǎn)稱(chēng)PPT)
-
表示參與扮演不同角色的人或事物,如商品、賬戶(hù)、店鋪等,使用淺綠色表示。
-
角色原型(Role Archetype,簡(jiǎn)稱(chēng)ROLE)
-
抽象了一種參與方式,由人或組織機(jī)構(gòu)、地點(diǎn)或物品來(lái)承擔(dān),如客戶(hù)、商家、財(cái)務(wù)組織等,使用淺黃色表示。
-
描述原型(Description Archetype,簡(jiǎn)稱(chēng)DESC)
-
對(duì)上述顏色表示的內(nèi)容進(jìn)行解釋?zhuān)糜诜诸?lèi)或者描述建模過(guò)程中產(chǎn)生的數(shù)據(jù),事件,或者活動(dòng),使用淺藍(lán)色表示。
用一句話(huà)來(lái)概括四色原型就是:一個(gè)什么樣的人或物品以某種角色在某個(gè)時(shí)刻或某段時(shí)間內(nèi)參與某個(gè)活動(dòng)。其中“什么樣的”就是DESC,“人或物品”就是PPT,”角色”就是ROLE,而“某個(gè)時(shí)刻或某個(gè)時(shí)間段內(nèi)的某個(gè)活動(dòng)”就是MI。
接下來(lái)使用四色建模法來(lái)分析領(lǐng)域模型,總共分為四大步:
-
建立時(shí)標(biāo)原型:尋找需要追溯的事件,根據(jù)追溯事件尋找足跡
-
建立PPT原型:豐富模型,尋找時(shí)標(biāo)原型周?chē)娜?事/物,使它可以更好地描述業(yè)務(wù)概念
-
建立角色原型:進(jìn)一步從中抽象出可以參與到不同流程中去的角色
-
建立描述原型:把一些信息用描述對(duì)象補(bǔ)足
案例:商家咨詢(xún)
產(chǎn)品截圖
梳理咨詢(xún)業(yè)務(wù)時(shí)序,任何的業(yè)務(wù)事件都會(huì)以某種數(shù)據(jù)的形式留下足跡。我們對(duì)于事件的追溯可以通過(guò)對(duì)數(shù)據(jù)的追溯來(lái)完成,當(dāng)我們把這些數(shù)據(jù)的足跡按照時(shí)間順序排列起來(lái),就可以清晰的推測(cè)出過(guò)往的一段時(shí)間內(nèi)發(fā)生的事情。
通過(guò)對(duì)業(yè)務(wù)的梳理可以產(chǎn)出了四色原型圖的關(guān)鍵業(yè)務(wù)時(shí)刻,如下面表格
關(guān)鍵業(yè)務(wù)活動(dòng) |
關(guān)鍵業(yè)務(wù)時(shí)刻對(duì)象 |
備注 |
注冊(cè)到店app賬號(hào) |
用戶(hù)賬號(hào)信息 |
? |
建群 |
群關(guān)系記錄 |
用戶(hù)點(diǎn)擊咨詢(xún)會(huì)自動(dòng)創(chuàng)建群 |
聊天 |
群消息 |
通過(guò)群聊實(shí)現(xiàn)不同客服的接待 |
打電話(huà) |
電話(huà)記錄 |
用戶(hù)也可以通過(guò)打電話(huà)直接咨詢(xún)商家 |
留資 |
客資信息 |
? |
視頻面診 |
面診記錄 |
? |
通過(guò)上面的表格大概知道用戶(hù)在IM應(yīng)用中的關(guān)鍵業(yè)務(wù)時(shí)刻和對(duì)象
尋找關(guān)鍵業(yè)務(wù)時(shí)刻對(duì)象周?chē)娜恕⑹?、物?duì)象
從人,事,物中抽象出角色
把一些描述信息用對(duì)象補(bǔ)足
?
?
產(chǎn)出領(lǐng)域模型
?
限界筆紙法
限界筆紙法起源于thoughtworks,由thoughtworks大佬提出的基于四色建模的改進(jìn)方法。在“四色建模法”的“時(shí)標(biāo)對(duì)象”的基礎(chǔ)上確定"限界上下文”與“聚集”的概念,再使用“紙和筆來(lái)管理”的方法,力圖在建模過(guò)程中實(shí)現(xiàn)“分而治之”,增強(qiáng)數(shù)據(jù)的完整性,并避免過(guò)度設(shè)計(jì)。
建模步驟
-
根據(jù)“業(yè)務(wù)發(fā)生時(shí)刻”的價(jià)值識(shí)別核心領(lǐng)域(core domain)
-
確定核心領(lǐng)域之間的依賴(lài)關(guān)系
-
用紙和筆畫(huà)表格并寫(xiě)實(shí)例(這里的實(shí)例可以是業(yè)務(wù)用例,用戶(hù)故事,或者業(yè)務(wù)發(fā)生時(shí)刻)
-
確定“聚合根 (AGGREGATE ROOT)”
-
以“人以群分”的原則抽取新的“聚合”
?
分析模式
學(xué)會(huì)了上面的建模方法就有能力應(yīng)對(duì)開(kāi)發(fā)中等難度的系統(tǒng)了。不過(guò),如果遇到更復(fù)雜的業(yè)務(wù)領(lǐng)域,還需要更深入的建模技能?!斗治瞿J健肥?Martin Fowler 寫(xiě)的一本領(lǐng)域建模的專(zhuān)著。講述各種分析模式和輔助模式,專(zhuān)注于面向?qū)ο蠓治雠c設(shè)計(jì)的結(jié)果——模型本身,給出了來(lái)自金融貿(mào)易、測(cè)量、財(cái)務(wù)以及組織關(guān)系等多個(gè)領(lǐng)域內(nèi)的一系列模式。書(shū)中每個(gè)模式都包含了設(shè)計(jì)背后的原理、使用的規(guī)則以及實(shí)現(xiàn)的技巧,給出的例子包含了有用模型的細(xì)節(jié),并介紹了用于提高分析、建模和實(shí)現(xiàn)的重用技巧。研究不深感興趣的可以看下。
?
代碼建模
經(jīng)過(guò)領(lǐng)域模型的分析后,面向?qū)ο笠呀?jīng)初具雛形,但領(lǐng)域類(lèi)并不能指導(dǎo)我們進(jìn)行編碼工作,因?yàn)轭I(lǐng)域類(lèi)只是從用例模型中提煉出來(lái)的反映業(yè)務(wù)領(lǐng)域的概念,并不是真正意義上的軟件類(lèi),我們要需要在進(jìn)一步,完成領(lǐng)域類(lèi)到軟件類(lèi)的轉(zhuǎn)換,這就是代碼建模階段的主要任務(wù)。那么具體如何做的
-
第一步:完成領(lǐng)域類(lèi)到代碼類(lèi)的映射
-
類(lèi):領(lǐng)域模型中的類(lèi)直接映射成代碼里的類(lèi) -
屬性:領(lǐng)域模型類(lèi)的屬性直接映射成代碼類(lèi)里的屬性 -
動(dòng)作:領(lǐng)域模型類(lèi)的動(dòng)作直接映射成代碼類(lèi)里的方法 -
狀態(tài)機(jī):領(lǐng)域模型里的狀態(tài)映射為類(lèi)的狀態(tài)機(jī) -
協(xié)作關(guān)系:用UML的類(lèi)關(guān)系圖重新刻畫(huà)協(xié)作關(guān)系
以上面的一個(gè)領(lǐng)域模型為例
-
第二步:應(yīng)用設(shè)計(jì)原則和設(shè)計(jì)模式。完成了第一步,類(lèi)就出來(lái)了,屬性和方法也有了,是不是就結(jié)束了呢,如果按照設(shè)計(jì)原則的衡量標(biāo)準(zhǔn),會(huì)發(fā)現(xiàn)第一步只是最基本的要求,而不是一個(gè)好的設(shè)計(jì)。還以"用戶(hù)購(gòu)買(mǎi)商品"案例為例,支付的方式分為支付寶、微信、銀行卡,運(yùn)用設(shè)計(jì)模式后,代碼模型變成如下:
數(shù)據(jù)建模
數(shù)據(jù)模型推導(dǎo)的來(lái)源是領(lǐng)域模型。一般原則,領(lǐng)域模型中的實(shí)體映射為數(shù)據(jù)庫(kù)中的表;領(lǐng)域模型中的屬性,映射成表中的字段,同時(shí)還要根據(jù)需求補(bǔ)充更多的字段。模型中的一個(gè)一對(duì)多關(guān)聯(lián),可以映射成一個(gè)外鍵字段,以及一個(gè)外鍵約束。但一般不會(huì)真的建立外鍵約束,而外鍵的邏輯關(guān)系還是存在的。可以用虛線(xiàn)箭頭表示這種邏輯上的外鍵關(guān)系,稱(chēng)為虛擬外鍵。對(duì)于多對(duì)多關(guān)聯(lián),必須增加一個(gè)關(guān)聯(lián)表,其中包括了兩個(gè)實(shí)體表各自的主鍵。另外,關(guān)聯(lián)上的多重性決定了外鍵字段的非空約束。
怎么判斷模型好不好
-
領(lǐng)域模型是生活中模型的映射。在幾十年前,我們沒(méi)有計(jì)算機(jī),但是我們?nèi)匀豢梢酝ㄟ^(guò)白紙黑字的方式完成我們的業(yè)務(wù)。換句話(huà)說(shuō),我們的業(yè)務(wù)系統(tǒng)只是把一個(gè)紙質(zhì)的單據(jù)變成了電腦里存在數(shù)據(jù)庫(kù)里的東西。也就是說(shuō),我們的模型,一定是在生活中有實(shí)際的對(duì)應(yīng)的單據(jù),而且名字也應(yīng)該是一致的。千萬(wàn)不要臆造概念。 -
領(lǐng)域模型不是DB模型。領(lǐng)域模型不是DB模型,一個(gè)領(lǐng)域?qū)ο罂梢杂卸喾N方式映射到數(shù)據(jù)庫(kù),但是我們聊領(lǐng)域模型的時(shí)候,一定不是聊DB模型,重要的一定是描述清楚業(yè)務(wù)概念。在做ORM的時(shí)候,如果有繼承關(guān)系需要的實(shí)現(xiàn)的時(shí)候,我們?cè)倏紤]是單表繼承(Single Table Inheritance)還是實(shí)體表(Concrete Table Inheritance)等模式。 -
領(lǐng)域模型的關(guān)系一定是穩(wěn)定的。當(dāng)接到一個(gè)新的需求時(shí),如果發(fā)現(xiàn)模型的關(guān)系不匹配了,那說(shuō)明之前的模型設(shè)計(jì)的肯定存在問(wèn)題,好的模型實(shí)體和實(shí)體之間的關(guān)系一定是穩(wěn)定的,只會(huì)新增不會(huì)對(duì)原有關(guān)系進(jìn)行改變。
領(lǐng)域模型為什么要一直持續(xù)迭代
要在"變化的現(xiàn)實(shí)世界中尋找不變性",希望尋找到一個(gè)穩(wěn)定的領(lǐng)域模型,讓系統(tǒng)流程可以靈活改變,模型不怎么變,但在實(shí)際中卻很難完美的做到,這是為什么呢?(備注:這里的迭代不是指對(duì)原有模型關(guān)系的重構(gòu),而是對(duì)模型新關(guān)系的升級(jí))
-
意識(shí)問(wèn)題。在用戶(hù)、產(chǎn)品人員、運(yùn)營(yíng)人員眼中,溝通的語(yǔ)音是"流程"而不是"模型"。開(kāi)發(fā)人員在與他們的溝通過(guò)程中,慢慢就形成了以"流程"為主導(dǎo),而不是以"模型"為主導(dǎo)的思維方式。這使得整個(gè)開(kāi)發(fā)過(guò)程是"流程驅(qū)動(dòng)",而不是"領(lǐng)域驅(qū)動(dòng)"。大家在討論業(yè)務(wù)與系統(tǒng)解決方案的時(shí)候,大部分時(shí)間都花在了業(yè)務(wù)流程、業(yè)務(wù)規(guī)則上,而不是深刻挖掘流程背后的不變因素。 -
現(xiàn)實(shí)世界的復(fù)雜性。業(yè)務(wù)也就是我們的現(xiàn)實(shí)世界,灰度的、模棱兩可的東西,比計(jì)算機(jī)的世界多得多,變化也多得多。很難確定有哪些東西是不怎么變的,什么東西是容易變的,而這恰恰是做建模的前提條件。 -
迭代速度。在穩(wěn)固的模型,也不可能一成不變,畢竟現(xiàn)實(shí)世界一直在變。當(dāng)現(xiàn)實(shí)世界變化到模型不能支撐的時(shí)候,要能馬上修改模型才行。但實(shí)際情況是,因?yàn)殚_(kāi)發(fā)效率的原因,工期趕不上,然后就會(huì)在舊的模型上進(jìn)行打補(bǔ)丁,補(bǔ)丁一個(gè)接著一個(gè)打,最后整個(gè)系統(tǒng)臃腫不堪,開(kāi)發(fā)效率進(jìn)一步降低,如此惡性循環(huán)。 -
火候的掌握。領(lǐng)域模型是要對(duì)現(xiàn)實(shí)世界建模,既要去尋找不變性,又要為可能變化的地方留出擴(kuò)展性。什么地方是不變的,要作為基礎(chǔ);什么地方是易變的,要留出擴(kuò)展性,這其中并沒(méi)有一個(gè)標(biāo)準(zhǔn)原則。另外,各家公司的業(yè)務(wù)規(guī)模、速度不一樣,團(tuán)隊(duì)實(shí)施能力也不一樣。所以在實(shí)踐中,要么會(huì)"缺乏設(shè)計(jì)",要么會(huì)"過(guò)度設(shè)計(jì)"。對(duì)火候的掌握,需要有悟性。只有反復(fù)思考,反復(fù)推翻自己之前的想法,再重建新的想法,才能在實(shí)踐中不斷找到領(lǐng)域模型、業(yè)務(wù)發(fā)展速度、技術(shù)團(tuán)隊(duì)能力之間的"最佳平衡點(diǎn)"。
?
背后需要修煉的思維
上面講的這些都是術(shù)的表現(xiàn),是借假修真,只有"真"才是我們修煉的道,也就是做事的思維,下圖列舉一些,歡迎感興趣的多交流。
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-693078.html
作者|?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-693078.html
到了這里,關(guān)于領(lǐng)域建模的體系化思維與6種方法論的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!