摘自
http://www.reibang.com/p/8392c63b0136
http://www.reibang.com/p/b6ec06d6b594
https://www.zhihu.com/question/25089273/answer/969378280
https://zhuanlan.zhihu.com/p/345679681
設(shè)計(jì)流程
- 統(tǒng)一語(yǔ)言: 通過(guò)在業(yè)務(wù)與代碼中的技術(shù)之間采用共同的語(yǔ)言達(dá)成
- 戰(zhàn)略建模: 根據(jù)業(yè)務(wù)需求劃分出初步的領(lǐng)域和限界上下文,以及上下文之間的關(guān)系远搪;
- 戰(zhàn)術(shù)建模: 進(jìn)一步分析每個(gè)上下文內(nèi)部,識(shí)別出哪些是實(shí)體谁鳍,哪些是值對(duì)象;對(duì)實(shí)體倘潜、值對(duì)象進(jìn)行關(guān)聯(lián)和聚合,劃分出聚合的范疇和聚合根涮因;
- 數(shù)據(jù)倉(cāng)儲(chǔ)設(shè)計(jì): 為聚合根設(shè)計(jì)倉(cāng)儲(chǔ)废睦,并思考實(shí)體或值對(duì)象的創(chuàng)建方式养泡;
- 工程實(shí)施: 在工程中實(shí)踐領(lǐng)域模型,并在實(shí)踐中檢驗(yàn)?zāi)P偷暮侠硇岳窖冢雇颇P椭胁蛔愕牡胤讲⒅貥?gòu)购披。 在不同上下文之間適當(dāng)引入防腐層
統(tǒng)一語(yǔ)言
- 業(yè)務(wù)語(yǔ)言起源于公司的業(yè)務(wù)側(cè)肩榕,業(yè)務(wù)側(cè)擁有需要實(shí)現(xiàn)的概念
- 業(yè)務(wù)語(yǔ)言中的術(shù)語(yǔ)由公司的的業(yè)務(wù)側(cè)和技術(shù)側(cè)通過(guò)協(xié)商來(lái)定義(意味著業(yè)務(wù)側(cè)也不能總是選到最好的命名)
- 目標(biāo)是創(chuàng)造可以被業(yè)務(wù)、技術(shù)和代碼自身無(wú)歧義使用的共同術(shù)語(yǔ)株汉,即統(tǒng)一語(yǔ)言。
- 要求:代碼乔妈、類(lèi)、方法路召、屬性和模塊的命名必須和統(tǒng)一語(yǔ)言相匹配贮懈,必要的時(shí)候需要對(duì)代碼進(jìn)行重構(gòu)优训!
- 在PRD文檔各聘、設(shè)計(jì)文檔、代碼以及團(tuán)隊(duì)日常交流中躲因,如果有一套領(lǐng)域術(shù)語(yǔ)是統(tǒng)一無(wú)歧義的忌傻,會(huì)極大地提升溝通和工作效率;避免概念理解不一致搞监,或者語(yǔ)言表達(dá)上的問(wèn)題,導(dǎo)致溝通效率低琐驴,甚至發(fā)生誤解
- 明確概念、形成統(tǒng)一語(yǔ)言至關(guān)重要
戰(zhàn)略建模 - 領(lǐng)域劃分
領(lǐng)域模型: 能夠精確反映領(lǐng)域中某一知識(shí)元素的載體
- 無(wú)關(guān)技術(shù)绝淡,具有高度的業(yè)務(wù)抽象性宙刘;
- 能夠精確的描述領(lǐng)域中的知識(shí)體系牢酵;
- 模型彼此之間獨(dú)立,同時(shí)有關(guān)聯(lián)
合作關(guān)系 | Partnership | 兩個(gè)上下文緊密合作的關(guān)系馍乙,一榮俱榮,一損俱損 |
共享內(nèi)核 | Shared Kernel | 兩個(gè)上下文依賴(lài)部分共享的模型 |
客戶(hù)方-供應(yīng)方開(kāi)發(fā) | Customer-Supplier Development | 上下文之間有組織的上下游依賴(lài) |
遵奉者 | Conformist | 下游上下文只能盲目依賴(lài)上游上下文 |
防腐層 | Anticorruption Layer | 一個(gè)上下文通過(guò)一些適配和轉(zhuǎn)換與另一個(gè)上下文交互 |
開(kāi)放主機(jī)服務(wù) | Open Host Service | 定義一種協(xié)議來(lái)讓其他上下文來(lái)對(duì)本上下文進(jìn)行訪(fǎng)問(wèn) |
發(fā)布語(yǔ)言 | Published Language | 通常與OHS一起使用丝格,用于定義開(kāi)放主機(jī)的協(xié)議 |
大泥球 | Big Ball of Mud | 混雜在一起的上下文關(guān)系,邊界不清晰 |
另謀他路 | SeparateWay | 兩個(gè)完全沒(méi)有任何聯(lián)系的上下文 |
戰(zhàn)術(shù)建奶罚—細(xì)化上下文
提煉出業(yè)務(wù)中的精華季蚂,合理的抽象為實(shí)體(Entity)琅束、值對(duì)象(ValueObject)、聚合(Aggregate)
這種抽象需隨著領(lǐng)域里的概念變化而變化
結(jié)合運(yùn)用這3者讓項(xiàng)目隨業(yè)務(wù)變化而進(jìn)化涩禀,是DDD的核心之一
Entity
可變;有唯一ID艾船;封裝實(shí)體自操作的行為ValueObject
不可變葵腹;無(wú)唯一ID;用于度量和描述事物屿岂,即屬性Aggregate
實(shí)體和值對(duì)象的組合;領(lǐng)域服務(wù)
領(lǐng)域行為
不包含實(shí)體類(lèi)中對(duì)實(shí)體自己操作的行為
一切領(lǐng)域邏輯的對(duì)外暴露都需要通過(guò)領(lǐng)域服務(wù)來(lái)完成爷怀。
數(shù)據(jù)倉(cāng)儲(chǔ)設(shè)計(jì)
//數(shù)據(jù)庫(kù)資源
import com.shrb.mobile.pay.card.repo.dao.CardDao;//數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)對(duì)象-銀行卡
import com.shrb.mobile.pay.card.repo.dao.po.CardPO;//數(shù)據(jù)庫(kù)持久化對(duì)象-銀行卡
import com.shrb.mobile.pay.card.repo.dao.po.CardTransferPO;//數(shù)據(jù)庫(kù)持久化對(duì)象-獎(jiǎng)池
import com.shrb.mobile.pay.card.repo.cache.CardCacheAccessObj;//分布式緩存訪(fǎng)問(wèn)對(duì)象-銀行卡緩存訪(fǎng)問(wèn)
import com.shrb.mobile.pay.card.repo.repository.CardRepository;//資源庫(kù)訪(fǎng)問(wèn)對(duì)象-銀行卡資源庫(kù)
工程實(shí)施
通過(guò)模塊將限界上下文進(jìn)行區(qū)分
樣例: com.公司名.歸屬團(tuán)隊(duì).業(yè)務(wù).上下文.*
對(duì)于模塊內(nèi)的組織結(jié)構(gòu),一般按照領(lǐng)域?qū)ο笤耸凇㈩I(lǐng)域服務(wù)乔煞、領(lǐng)域資源庫(kù)、防腐層等組織方式進(jìn)行定義渡贾,以對(duì)應(yīng)DDD中各個(gè)概念
import com.shrb.mobile.pay.card.*;//支付卡上下文
import com.shrb.mobile.pay.card.domain.valobj.*;//領(lǐng)域?qū)ο?值對(duì)象
import com.shrb.mobile.pay.card.domain.entity.*;//領(lǐng)域?qū)ο?實(shí)體
import com.shrb.mobile.pay.card.domain.aggregate.*;//領(lǐng)域?qū)ο?聚合根
import com.shrb.mobile.pay.card.service.*;//領(lǐng)域服務(wù)
import com.shrb.mobile.pay.card.repo.*;//領(lǐng)域資源庫(kù)(倉(cāng)庫(kù)),封裝了獲取對(duì)象的邏輯雄右,領(lǐng)域?qū)ο鬅o(wú)須和底層數(shù)據(jù)庫(kù)交互,它只需要從倉(cāng)庫(kù)中獲取對(duì)象即可
import com.shrb.mobile.pay.card.acl.*;//領(lǐng)域防腐層
import com.shrb.mobile.pay.riskcontrol.*;//支付交易風(fēng)控上下文
...
import com.shrb.mobile.pay.route.*;//支付路由上下文
...
import com.shrb.mobile.pay.thirdparty.*;//外部三方支付上下文
...
工廠(Factories)
用來(lái)創(chuàng)建復(fù)雜的實(shí)體或聚合
以下場(chǎng)景不需要工廠:
a)構(gòu)造器很簡(jiǎn)單
b)構(gòu)造對(duì)象時(shí)不依賴(lài)于其他對(duì)象的創(chuàng)建
c)用策略模式就可以解決的
防腐層
以下場(chǎng)景考慮引入防腐層
- 需要將外部上下文中的模型翻譯成本上下文理解的模型不脯。
- 不同上下文之間的團(tuán)隊(duì)協(xié)作關(guān)系,如果是供奉者關(guān)系防楷,建議引入防腐層牺丙,避免外部上下文變化對(duì)本上下文的侵蝕复局。
- 該訪(fǎng)問(wèn)本上下文使用廣泛,為了避免改動(dòng)影響范圍過(guò)大亿昏。
防腐層就是一個(gè)不同限界上下文之間的Adapter,主要做的工作就是數(shù)據(jù)轉(zhuǎn)換
將其他領(lǐng)域的實(shí)體轉(zhuǎn)換成當(dāng)前限界上下文可以處理的實(shí)體角钩,在不同上下文中做了一層隔離吝沫,這樣當(dāng)其他限界上下文業(yè)務(wù)實(shí)體有改動(dòng)的時(shí)候,可以將對(duì)本限界上下文的影響降到最小递礼。