領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)在重構(gòu)業(yè)務(wù)系統(tǒng)中的實(shí)踐_第1頁
領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)在重構(gòu)業(yè)務(wù)系統(tǒng)中的實(shí)踐_第2頁
領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)在重構(gòu)業(yè)務(wù)系統(tǒng)中的實(shí)踐_第3頁
領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)在重構(gòu)業(yè)務(wù)系統(tǒng)中的實(shí)踐_第4頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)在重構(gòu)業(yè)務(wù)系統(tǒng)中的實(shí)踐 編者按:領(lǐng)域建模首先要解決業(yè)務(wù)領(lǐng)域問題,而這不是翻譯過來的一個(gè)個(gè)需求和用例,是需要挖掘背后的專業(yè)領(lǐng)域,以及客戶真實(shí)的需求。本文就是很好的一個(gè)案例。學(xué)習(xí)領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(DDD)相關(guān)的知識(shí)有一段時(shí)間了,但是一直苦惱于其中的一些概念無法理解透徹,導(dǎo)致無法落地實(shí)現(xiàn)甚至生根發(fā)芽。機(jī)緣巧合,不久前的工作內(nèi)容中,需要把之前分散在若干個(gè)業(yè)務(wù)系統(tǒng)中(微服務(wù))的購買相關(guān)功能進(jìn)行梳理重構(gòu),在這個(gè)重構(gòu)的過程中,充分運(yùn)用了領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)中戰(zhàn)略設(shè)計(jì)部分的思想,達(dá)成了目標(biāo)。本文將結(jié)合一些文字和圖片,圍繞著領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)中戰(zhàn)略部分的三個(gè)核心概念:領(lǐng)域通用語言(UBIQUITOUS LANGUA

2、GE),領(lǐng)域模型(Domain)和限界上下文(Bounded Context),來分享下心得。1系統(tǒng)居然不能完全解決業(yè)務(wù)的問題訂單化系統(tǒng)的前世入職得 到后端不久,團(tuán)隊(duì)交給我一份設(shè)計(jì)文檔和排期計(jì)劃,要求完成個(gè)開發(fā)任務(wù),實(shí)現(xiàn)一個(gè)“訂單化”系統(tǒng)。文檔中,該系統(tǒng)的設(shè)計(jì)目標(biāo)是:實(shí)現(xiàn)一個(gè)代理服務(wù),對(duì)接商城平臺(tái)組的訂單系統(tǒng)和基礎(chǔ)平臺(tái)組的支付系統(tǒng),然后推動(dòng)近若干個(gè)業(yè)務(wù)系統(tǒng)改造,把原來直接調(diào)用外部系統(tǒng)的方式,改成調(diào)用這個(gè)新的代理服務(wù)。讓我們看下文檔中的架構(gòu)圖,簡潔明了,而我的工作也似乎就是個(gè)“體力活”。如果是剛出道那會(huì),拿到設(shè)計(jì)文檔,也許我早就不管三七二十一地敲代碼了。但是,經(jīng)歷過多年在業(yè)務(wù)開發(fā)線上摸爬滾打,加

3、上對(duì)學(xué)習(xí)OO和領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的一些領(lǐng)悟,直覺告訴我沒那么簡單,我應(yīng)該了解清楚來龍去脈再動(dòng)手經(jīng)過調(diào)研,我終于明白了“訂單化”是什么?顧名思義,就是把得到app內(nèi)所有的虛擬商品在交付時(shí)用標(biāo)準(zhǔn)的訂單號(hào)關(guān)聯(lián)起來?你也許會(huì)好奇,一個(gè)電商平臺(tái)居然沒有訂單?我相信“存在即合理”,當(dāng)時(shí)這么做肯定有當(dāng)時(shí)的原因和背景,說白了一切都是為了快速上線,快速驗(yàn)證得到app的商業(yè)模式,活下去比設(shè)計(jì)實(shí)現(xiàn)一個(gè)完美的系統(tǒng)優(yōu)先級(jí)更高。沒有訂單的購買機(jī)制運(yùn)行了一年多后,商城平臺(tái)組實(shí)現(xiàn)了訂單系統(tǒng),經(jīng)過財(cái)務(wù)核算部門的“努力”推動(dòng),若干后端業(yè)務(wù)方把虛擬商品的購買對(duì)接了訂單系統(tǒng)的三個(gè)接口(創(chuàng)建、支付、簽收),這就是最初的訂單化的“萌芽”。如下

4、圖,以精品課系統(tǒng)舉例,要實(shí)現(xiàn)精品課的售賣,該系統(tǒng)要和若干個(gè)外部系統(tǒng)直接打交道,如果把別的幾個(gè)業(yè)務(wù)系統(tǒng)的調(diào)動(dòng)關(guān)系也畫上,腦補(bǔ)一下這個(gè)圖會(huì)成為什么樣子。不管怎樣,財(cái)務(wù)核算部門的第一步要求是實(shí)現(xiàn)了,那就是用訂單號(hào)串起來了所有的購買信息,實(shí)現(xiàn)了原始樸素的“訂單化”要求。如此復(fù)雜的調(diào)用關(guān)系,和“高內(nèi)聚低耦合”背道而馳,很快就暴露了問題:業(yè)務(wù)方要求在訂單簽收的時(shí)候增加一個(gè)簽收時(shí)間字段,并且要求傳遞寫入已購數(shù)據(jù)表的實(shí)際時(shí)間。這個(gè)很小的需求,據(jù)參與的同事說,投入了20多人/日,將近一個(gè)月才上線,因?yàn)橐礁臄?shù)個(gè)業(yè)務(wù)系統(tǒng)呢!團(tuán)隊(duì)嘗到了痛苦,決定改變,于是下決心做一個(gè)“訂單化”系統(tǒng),同時(shí)把財(cái)務(wù)要求的數(shù)據(jù)校驗(yàn)規(guī)則加

5、上。訂單化系統(tǒng)不能完全解決業(yè)務(wù)的問題分析業(yè)務(wù)規(guī)則并讀了一些代碼后,整理出了訂單化系統(tǒng)的一些分析和設(shè)計(jì)文檔,經(jīng)過了團(tuán)隊(duì)內(nèi)部確認(rèn)理解正確,找業(yè)務(wù)方在溝通一下就可以開工了。如下圖,是其中在第三方支付(微信和支付寶)這個(gè)場(chǎng)景下的時(shí)序圖:開發(fā)工作眼看著就要開始了,我?guī)е莆盏膬?nèi)容,滿懷信心的去和合作部門(關(guān)注訂單化系統(tǒng)的一些“老板”們)交流,卻感覺大家關(guān)注的點(diǎn)甚至方向都常常不一致,越交流內(nèi)心越分裂。我作為訂單化系統(tǒng)的負(fù)責(zé)人是乙方,最關(guān)心的是:基于現(xiàn)有確定的需求,如何盡快上線訂單化系統(tǒng)。而他們甲方關(guān)心的是:一定要正確的記賬(面向現(xiàn)在),能夠高效準(zhǔn)確的算賬(面向未來),把過去的賬給解釋清楚(面向過去),似乎

6、對(duì)“訂單化”系統(tǒng)并不是那么“感興趣”。我的目標(biāo)在財(cái)務(wù)生態(tài)圈里只是個(gè)過程!怎么達(dá)到真正的目標(biāo)?我該怎么辦?那個(gè)時(shí)間段感受到了雙重的壓力,一面來自于業(yè)務(wù)方,因?yàn)榻唤o我的開發(fā)任務(wù)居然不能完全解決業(yè)務(wù)的問題,一面來自于開發(fā)團(tuán)隊(duì)內(nèi)部,領(lǐng)導(dǎo)們不理解為什么訂單化系統(tǒng)遲遲不能取得顯著進(jìn)展轉(zhuǎn)折點(diǎn)帶著問題,我參與了財(cái)務(wù)審計(jì)對(duì)賬工作。開始時(shí),可以用“身陷重圍,十面埋伏”來形容,因?yàn)閹缀趺刻於紩?huì)被“拷問”,為什么這么多問題數(shù)據(jù)?誰是對(duì)應(yīng)的產(chǎn)品經(jīng)理呢?得到端誰對(duì)權(quán)益數(shù)據(jù)準(zhǔn)確性負(fù)責(zé)呢?讓你們老大招個(gè)懂財(cái)務(wù)的產(chǎn)品經(jīng)理吧!誰都能聽出來,是對(duì)我能否勝任工作的擔(dān)憂和不信任終于順利出關(guān),完成了公司的要求,自己直接和業(yè)務(wù)方的伙伴們,

7、面對(duì)面的工作近一個(gè)月,讓我收獲頗豐:從財(cái)務(wù)角度,理解了和體會(huì)了正確記錄數(shù)據(jù)的重要性推進(jìn)已知問題的止損,理解了得到“訂單化”在全局的地位“提煉”了一些“統(tǒng)一語言”自己下決心:不能為了“訂單化”而實(shí)現(xiàn)“訂單化”收獲了些許財(cái)務(wù)思維,和財(cái)務(wù)相關(guān)的數(shù)據(jù)變動(dòng)和規(guī)則結(jié)論,要“記在小本本上”收獲了財(cái)務(wù)生態(tài)圈的信任。信任很關(guān)鍵,一個(gè)團(tuán)隊(duì)或者跨團(tuán)隊(duì)協(xié)作時(shí),信任本身就是生產(chǎn)力。2“訂單化”系統(tǒng)演變?yōu)榱恕坝唵谓桓丁?系統(tǒng)領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(DDD)思想指導(dǎo)的開發(fā)過程,是一個(gè)全程強(qiáng)調(diào)“領(lǐng)域模型”的開發(fā)過程,首先開發(fā)團(tuán)隊(duì)要和領(lǐng)域?qū)<胰メ槍?duì)業(yè)務(wù)需求進(jìn)行充分的討論溝通,才能確定真正的問題域和業(yè)務(wù)期望。主動(dòng)與業(yè)務(wù)的溝通下面的圖,是一

8、次找財(cái)務(wù)方向的產(chǎn)品經(jīng)理溝通討論時(shí)給我畫的,產(chǎn)品經(jīng)理說第一次有技術(shù)主動(dòng)和她聊財(cái)務(wù)相關(guān)的業(yè)務(wù),一高興就給我講了很多。為了讓自己的理解和產(chǎn)品經(jīng)理想要表達(dá)的不產(chǎn)生太大的偏差,當(dāng)天結(jié)合這個(gè)草圖,趕緊畫了一個(gè)自己理解的圖,第二天又去給產(chǎn)品經(jīng)理講了一遍。反述的過程,自己明白訂單化在全局的位置,雖然貌似不起眼但是卻擔(dān)負(fù)著得到所有虛擬商品的交付。經(jīng)過和業(yè)務(wù)方的多次交流后,我們逐漸提煉和理解了一些“統(tǒng)一語言”,舉例如下:訂單完整的生命周期:下單,支付,已支付待交付,交付(發(fā)貨),簽收確收:收入和交付數(shù)據(jù)核對(duì)無誤,可以確認(rèn)為財(cái)務(wù)收入權(quán)益:用戶購買虛擬商品后,獲得可以學(xué)習(xí)對(duì)應(yīng)課程的權(quán)利補(bǔ)償:該給權(quán)益的時(shí)候沒給,要補(bǔ)上

9、權(quán)益回到領(lǐng)域驅(qū)動(dòng)設(shè)計(jì),扣一下字眼。首先,一個(gè)領(lǐng)域,解決一個(gè)核心問題,任何一個(gè)系統(tǒng)都會(huì)屬于某個(gè)特定的領(lǐng)域;確定了系統(tǒng)所屬的領(lǐng)域,相當(dāng)于確定了系統(tǒng)的核心目標(biāo);確定了系統(tǒng)的核心業(yè)務(wù),那么要解決的關(guān)鍵問題、問題的范圍邊界就基本確定了。驅(qū)動(dòng),我理解的是回答優(yōu)先級(jí)和孰輕孰重,前面的“訂單化”系統(tǒng)之所以不能解決業(yè)務(wù)的問題,就是因?yàn)橄萑肓苏`區(qū)之一“還沒有確定自己要干什么,就陷入技術(shù)細(xì)節(jié)”。訂單化系統(tǒng)演變?yōu)椤坝唵谓桓断到y(tǒng)”經(jīng)過繼續(xù)深入調(diào)研后,把“訂單化”要完成的內(nèi)容,劃分成了支付和交付兩部分,如下圖。重新確定的領(lǐng)域問題是:訂單簽約和履約,正確的交付權(quán)益。從全局角度看,就是交易與訂單。交易是行為,訂單是契約,交付

10、是履約。從得到后端的角度看,核心領(lǐng)域問題是“訂單交付”,所以一個(gè)“訂單交付”系統(tǒng)就呼之欲出了。幾乎在同時(shí),公司也確定了要做一個(gè)交易中心的中臺(tái)服務(wù),去和若干支付系統(tǒng)對(duì)接,我把他們起名為“交易生態(tài)圈”。下面這個(gè)圖,用來說明訂單交付系統(tǒng)和其它系統(tǒng)的關(guān)系,在整個(gè)得到app中用戶發(fā)生購買行為后,一起確保用戶的購買權(quán)益及時(shí)交付,一起履約訂單這個(gè)合同?!坝唵谓桓断到y(tǒng)”的設(shè)計(jì)建模從前面的內(nèi)容中我們可以看到,“訂單化”系統(tǒng)的設(shè)計(jì),依然沒有使得各個(gè)業(yè)務(wù)系統(tǒng)(諸如精品課、訂閱專欄等)從購買交付的商品售賣場(chǎng)景擺脫出來,導(dǎo)致各個(gè)業(yè)務(wù)系統(tǒng)各自為戰(zhàn)的重復(fù)實(shí)現(xiàn)了自己不擅長的商品購買交付邏輯,由于缺乏領(lǐng)域知識(shí)敏感度,產(chǎn)生的交付

11、數(shù)據(jù)達(dá)不到財(cái)務(wù)核算的精確要求。這個(gè)其實(shí)在領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)思想中也有理論依據(jù),原有的建模方法陷入了“以用戶為中心”的誤區(qū)。DDD的思想認(rèn)為,建模不能以用戶為中心作為出發(fā)點(diǎn),在人機(jī)交互系統(tǒng)面前,各個(gè)系統(tǒng)的領(lǐng)域模型將變得沒有差別,職責(zé)會(huì)不明,因?yàn)闊o論什么都可以歸結(jié)為“用戶的行為”,以用戶為中心來思考領(lǐng)域模型的思維只是停留在需求的表面,而沒有挖掘出真正的需求的本質(zhì)。借助DDD的建模思想指導(dǎo),進(jìn)行了重新建模,新模型面對(duì)的核心領(lǐng)域模型是“商品”,核心限界上下文是“訂單交付”。實(shí)現(xiàn)后的訂單交付系統(tǒng),使得從下單到交付,業(yè)務(wù)系統(tǒng)無需關(guān)注,感覺不到訂單的存在。3用限界上下文保護(hù)領(lǐng)域確定了領(lǐng)域后,就要保護(hù)領(lǐng)域不能隨意被

12、“侵犯”,而保護(hù)的依據(jù),就是“限界上下文”。如下圖,Eric Evans 用細(xì)胞來形容限界上下文,因?yàn)椤凹?xì)胞之所以能夠存在,是因?yàn)榧?xì)胞膜限定了什么在細(xì)胞內(nèi),什么在細(xì)胞外,并且確定了什么物質(zhì)可以通過細(xì)胞膜?!边@里,細(xì)胞代表上下文,而細(xì)胞膜代表了包裹上下文的邊界。對(duì)業(yè)務(wù)上下文和限界的理解不足,很容易切換到以用戶為中心去建立領(lǐng)域模型的心流模式。例如,人去乘坐飛機(jī),要強(qiáng)調(diào)出機(jī)場(chǎng)登機(jī)流程管理這個(gè)上下文的重要性,不管到機(jī)場(chǎng)之前是什么角色,人到了登機(jī)這個(gè)場(chǎng)景就是乘客,是屬于“登機(jī)流程”這個(gè)上下文的,要遵守這個(gè)場(chǎng)景上下文的業(yè)務(wù)規(guī)則和規(guī)范,接受“登機(jī)流程”的調(diào)度指揮,而不是由著自己“肆意妄為”。由機(jī)場(chǎng)“登機(jī)流程

13、上下文”業(yè)務(wù)規(guī)則調(diào)度,和乘客去主動(dòng)觸發(fā)登記所需要的動(dòng)作,完全可以表現(xiàn)為兩種設(shè)計(jì),偽代碼如下。前者登機(jī)流程上下文.排隊(duì)(乘客)登機(jī)流程上下文.安檢(乘客)登機(jī)流程上下文.擺渡(乘客,航班)登機(jī)流程上下文.登機(jī)(乘客,航班)后者乘客.排隊(duì)(機(jī)場(chǎng))乘客.我要安檢(機(jī)場(chǎng))乘客.我要坐擺渡車(擺渡車)乘客.我要上飛機(jī)(航班)前者是有序的安全的,不會(huì)給機(jī)場(chǎng)制造意外,后者機(jī)場(chǎng)是不可控的。在“訂單交付系統(tǒng)”推進(jìn)的過程中,由于大家立場(chǎng)不同,所以遇到一些來破壞領(lǐng)域的事情也就不足為奇,例如我推進(jìn)了如下的一些動(dòng)作來保衛(wèi)領(lǐng)域,其中有些動(dòng)作已經(jīng)完全超越了一名“開發(fā)人員”的職責(zé)范圍。一名技術(shù)人員敢于對(duì)業(yè)務(wù)內(nèi)容做決策,離不開對(duì)領(lǐng)域知識(shí)的把握。4總結(jié)DDD思想指導(dǎo)的開發(fā)過程,首先是開發(fā)團(tuán)隊(duì)要和領(lǐng)域?qū)<胰メ槍?duì)業(yè)務(wù)需求進(jìn)行充分的討論溝通,這一點(diǎn)很重要,業(yè)務(wù)線的開發(fā)人員有個(gè)不好的習(xí)慣:被動(dòng)接受需求,回頭再來抱怨業(yè)務(wù)人員或者產(chǎn)品經(jīng)理沒有表述清楚,人非圣賢孰能無過,合作的就是要互相補(bǔ)位

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論