DDD開(kāi)發(fā)實(shí)踐流程

摘自
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ì)流程

  1. 統(tǒng)一語(yǔ)言: 通過(guò)在業(yè)務(wù)與代碼中的技術(shù)之間采用共同的語(yǔ)言達(dá)成
  2. 戰(zhàn)略建模: 根據(jù)業(yè)務(wù)需求劃分出初步的領(lǐng)域和限界上下文,以及上下文之間的關(guān)系远搪;
  3. 戰(zhàn)術(shù)建模: 進(jìn)一步分析每個(gè)上下文內(nèi)部,識(shí)別出哪些是實(shí)體谁鳍,哪些是值對(duì)象;對(duì)實(shí)體倘潜、值對(duì)象進(jìn)行關(guān)聯(lián)和聚合,劃分出聚合的范疇和聚合根涮因;
  4. 數(shù)據(jù)倉(cāng)儲(chǔ)設(shè)計(jì): 為聚合根設(shè)計(jì)倉(cāng)儲(chǔ)废睦,并思考實(shí)體或值對(duì)象的創(chuàng)建方式养泡;
  5. 工程實(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ì)

DDD數(shù)據(jù)轉(zhuǎn)換流程
//數(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ì)本限界上下文的影響降到最小递礼。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末惨险,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子脊髓,更是在濱河造成了極大的恐慌辫愉,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件将硝,死亡現(xiàn)場(chǎng)離奇詭異恭朗,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)依疼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)痰腮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人诽嘉,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵稀余,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我睛琳,道長(zhǎng),這世上最難降的妖魔是什么师骗? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮辟癌,結(jié)果婚禮上寒屯,老公的妹妹穿的比我還像新娘黍少。我一直安慰自己,他們只是感情好厂置,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著昵济,像睡著了一般。 火紅的嫁衣襯著肌膚如雪访忿。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,301評(píng)論 1 301
  • 那天醉顽,我揣著相機(jī)與錄音,去河邊找鬼游添。 笑死系草,一個(gè)胖子當(dāng)著我的面吹牛唆涝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播廊酣,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了饿幅?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤栗恩,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后洪燥,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡捧韵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了再来。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡其弊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出梭伐,到底是詐尸還是另有隱情,我是刑警寧澤糊识,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站赂苗,受9級(jí)特大地震影響愉耙,放射性物質(zhì)發(fā)生泄漏拌滋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一败砂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧昌犹,春花似錦、人聲如沸斜姥。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)缚忧。三九已至,卻和暖如春搔谴,著一層夾襖步出監(jiān)牢的瞬間魁袜,已是汗流浹背敦第。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工芜果, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人融师。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像旱爆,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子怀伦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容