DDD入門
領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)作為一種軟件方法陆赋,它可以幫助我們?cè)O(shè)計(jì)高質(zhì)量的軟件模型。在正確實(shí)現(xiàn)的情況下嚷闭,我們通過(guò)DDD完成的設(shè)計(jì)恰恰就是軟件的工作方式攒岛。
了解DDD可以為你的項(xiàng)目和團(tuán)隊(duì)帶來(lái)哪些好處。
- 首先胞锰,DDD不應(yīng)該是一個(gè)儀式性的過(guò)程灾锯,更不應(yīng)該成為你項(xiàng)目進(jìn)度的阻礙。我們的目標(biāo)應(yīng)該是創(chuàng)造一個(gè)可測(cè)試的嗅榕,可伸縮顺饮,組織良好的軟件模型。
- 將領(lǐng)域?qū)<乙氲綀F(tuán)隊(duì)是大有好處的
在實(shí)施DDD的過(guò)程中凌那,你最好將那些不怎么使用技術(shù)語(yǔ)言的人加進(jìn)自己的團(tuán)隊(duì)兼雄。就像你會(huì)像他們學(xué)習(xí)一樣,他們也會(huì)向你學(xué)習(xí)帽蝶。
但是我們還沒(méi)有領(lǐng)域?qū)<?/li>
領(lǐng)域?qū)<也⒉皇且粋€(gè)職位赦肋,他可以是精通業(yè)務(wù)的任何人。他們可能了解更多的關(guān)于業(yè)務(wù)領(lǐng)域的背景知識(shí),他們可能是軟件產(chǎn)品的設(shè)計(jì)者佃乘,甚至有可能是銷售員囱井。
什么是領(lǐng)域模型
領(lǐng)域模型是關(guān)于某個(gè)特定業(yè)務(wù)的軟件模型。通常趣避,領(lǐng)域模型通過(guò)對(duì)象模型來(lái)實(shí)現(xiàn)庞呕,這些對(duì)象同時(shí)包含了數(shù)據(jù)和型為,并且表達(dá)了準(zhǔn)確的業(yè)務(wù)含義程帕。
為什么我們需要DDD
- 幫助業(yè)務(wù)人員自我提高
- 2.確保軟件知識(shí)并不只是掌握在少數(shù)人手中住练。
- 3.領(lǐng)域/開發(fā)者,軟件本身不存在“翻譯”愁拭,當(dāng)大家都是用相同的而語(yǔ)言進(jìn)行交流澎羞,沒(méi)人都能聽懂他人所說(shuō)。
- 4敛苇,設(shè)計(jì)就是代碼,代碼就是設(shè)計(jì)顺呕。
DDD如何幫助我們
- 1.領(lǐng)域?qū)<液烷_發(fā)人員聚集到一起枫攀,開發(fā)的軟件能夠反映出專家的思維模型。
- 2.DDD關(guān)注業(yè)務(wù)戰(zhàn)略
- 3.通過(guò)使用戰(zhàn)術(shù)設(shè)計(jì)建模工具株茶,DDD滿足了軟件真正的技術(shù)需求来涨。
處理領(lǐng)域復(fù)雜性。
在使用DDD時(shí)启盛,我們首先希望將他應(yīng)用在最重要的業(yè)務(wù)場(chǎng)景下蹦掐。這樣的模型命名為核心域(Core Domain),而相對(duì)次要的成為支撐子域(Supporting Subdomain)
DDD的作用是簡(jiǎn)化,而不是復(fù)雜化僵闯。
在使用DDD時(shí)卧抗,我們應(yīng)該采用最簡(jiǎn)單的方式對(duì)復(fù)雜領(lǐng)域進(jìn)行建模,而不是使問(wèn)題變的更復(fù)雜鳖粟。
貧血癥和失憶癥
貧血領(lǐng)域?qū)ο螅ˋnemic Domain Object)表述一個(gè)缺少內(nèi)在型為的領(lǐng)域?qū)ο蟆?/p>
如:
public bool SaveCustomer(參數(shù)1社裆,參數(shù)2){
屬性賦值,
Save();
}
三大問(wèn)題:
1.業(yè)務(wù)意圖不明顯
2.方法的實(shí)現(xiàn)本身增加了潛在的復(fù)雜性
3.Customer本身并不是對(duì)象向图,而只是一個(gè)數(shù)據(jù)持有器泳秀。
這種情況成為“由貧血導(dǎo)致的失憶癥”
如何DDD
DDD最具威力的特性:通用語(yǔ)言和限界上下文(Bounded Context),同時(shí)構(gòu)成了DDD的兩大支柱,并且他們時(shí)相輔相成的榄攀。
通用語(yǔ)言嗜傅,澄清的幾點(diǎn)
是通用,不是萬(wàn)能檩赢。
只有團(tuán)隊(duì)工作在一個(gè)獨(dú)立的限界上下文時(shí)吕嘀,通用語(yǔ)言才是"通用“的。通過(guò)上下文映射圖和其他限界上下文進(jìn)行集成。每個(gè)限界上下文都有自己的通用語(yǔ)言币他。
如果你打算將某個(gè)通用語(yǔ)言運(yùn)用在整個(gè)企業(yè)范圍之內(nèi)坞靶,你將失敗。
DDD業(yè)務(wù)價(jià)值
- 1.獲得了一個(gè)非常有用的領(lǐng)域莫能行
- 2.業(yè)務(wù)得到了更準(zhǔn)確的定義和理解
- 3.領(lǐng)域?qū)<铱梢詾檐浖O(shè)計(jì)做出貢獻(xiàn)
- 4.更好的用戶體驗(yàn)蝴悉。
- 5.敏捷/迭代式和持續(xù)建模
- 彰阴。。拍冠。
- 8.使用戰(zhàn)略和站術(shù)新工具
實(shí)施DDD所面臨的挑戰(zhàn)
- 1.為創(chuàng)建通用語(yǔ)言騰出時(shí)間和精力
- 2.持續(xù)的將領(lǐng)域?qū)<乙腠?xiàng)目
- 3.改變開發(fā)者對(duì)領(lǐng)域的思考方式尿这。
- 如何在項(xiàng)目中引入領(lǐng)域?qū)<?br> 例子1:以數(shù)據(jù)為中心
public 類A{
public 屬性A1,
public 屬性B1
}
例子2:使用領(lǐng)域?qū)ο蟆?/p>
pulic 類B{
public 方法行為 (類C){
}
}
DDD并不笨重。
DDD能很好的與敏捷項(xiàng)目框架結(jié)合起來(lái)庆杜,也傾向于”測(cè)試先行射众,逐步改進(jìn)“。
DDD-Lite是DDD站術(shù)模式的一個(gè)子集晃财,它并不強(qiáng)調(diào)對(duì)通用語(yǔ)言的使用叨橱,此外,DDD-Lite通常也忽略了限界上下文和上下文映射圖断盛。