What's DDD?
DDD的目標:創(chuàng)建可測試、可伸縮蒸矛、組織良好的軟件模型瀑罗。
DDD不是關(guān)于技術(shù)的,而是關(guān)于討論雏掠、聆聽斩祭、理解和發(fā)現(xiàn)業(yè)務(wù)價值的,都是為了將知識集中起來乡话。
但是并不是說技術(shù)不重要摧玫,尤其是涉及到架構(gòu)與模塊設(shè)計,之間的設(shè)計模式以及一些面向?qū)ο蟮乃枷搿?/p>
什么是領(lǐng)域模型绑青?
領(lǐng)域模型是關(guān)于某個特定業(yè)務(wù)領(lǐng)域的軟件模型诬像。通常,領(lǐng)域模型通過對象模型來實現(xiàn)时迫,這些對象同時包含了數(shù)據(jù)和行為颅停,并且表達了準確的業(yè)務(wù)含義。
Why DDD?
軟件開發(fā)過程中的問題:
- “隨著業(yè)務(wù)的擴展掠拳,軟件開發(fā)投資越來越大” 團隊的規(guī)模也開始變得越來越大癞揉,軟件系統(tǒng)的投資和維護的成本變得越來越高。
- “業(yè)務(wù)人員不懂架構(gòu)溺欧,架構(gòu)師不懂代碼喊熟,開發(fā)人員不不懂業(yè)務(wù)模型” 當團隊中的關(guān)鍵角色誰也不懂誰的時候,問題來了姐刁。芥牌。。
- “重構(gòu)是好的聂使,但什么時候要重構(gòu)壁拉?重構(gòu)到什么樣的架構(gòu)就是夠?的了?” 每個有追求的團隊都在做重構(gòu)柏靶,但管理者更關(guān)心弃理,什么時間必須要重構(gòu)?重構(gòu)的目標在哪屎蜓?
采用DDD的原因:
- 業(yè)務(wù)沉淀痘昌,知識共享
- 業(yè)務(wù)人員及技術(shù)人員之間信息的準確傳遞
- 幫助業(yè)務(wù)人員與技術(shù)人員自我提高
- DDD同時提供了戰(zhàn)略設(shè)計與戰(zhàn)術(shù)設(shè)計。戰(zhàn)略設(shè)計幫助我們理解哪些投入是重要的;哪些軟件資產(chǎn)是可以復用的辆苔;哪些人應(yīng)當被加入到團隊中算灸。戰(zhàn)術(shù)設(shè)計則幫助我們創(chuàng)建DDD模型中的各個部件。
DDD如何幫助我們驻啤?
DDD主要關(guān)注三個方面:
- 將領(lǐng)域?qū)<遗c開發(fā)人員聚集到一起菲驴,創(chuàng)建一套適用于領(lǐng)域建模的通用語言。通用語言必須在全隊內(nèi)部達成一致街佑。
- DDD關(guān)注業(yè)務(wù)戰(zhàn)略谢翎。戰(zhàn)略設(shè)計用于清楚的區(qū)分不同的系統(tǒng)與業(yè)務(wù)關(guān)注點捍靠;更進一步指引我們實現(xiàn)面向服務(wù)架構(gòu)(SOA)或者業(yè)務(wù)驅(qū)動架構(gòu)(BDA)
- 通過使用戰(zhàn)術(shù)設(shè)計建模工具沐旨,滿足軟件真正的技術(shù)需求。
DDD的業(yè)務(wù)價值:
- 業(yè)務(wù)得到更準確的定義與理解
- 領(lǐng)域?qū)<乙材軈⑴c到軟件設(shè)計中來
- 更好的用于體驗
- 企業(yè)架構(gòu)
- 敏捷榨婆、迭代磁携、持續(xù)建模
When DDD?
- 業(yè)務(wù)復雜度高
- 需求的未知性
- 領(lǐng)域的未知性
處理領(lǐng)域復雜性
將重要的、復雜的模型稱為核心域(Core Domain)良风。
將相對次要的稱為支撐子域(Supporting Subdomain)谊迄。
貧血領(lǐng)域?qū)ο螅ˋnemic Domian Model)
缺少內(nèi)在行為的領(lǐng)域?qū)ο蟆?/p>
- 業(yè)務(wù)沒有沉淀在對應(yīng)的模型中;
- 隨時間推移烟央,業(yè)務(wù)邏輯被遺忘统诺;代碼風險變高
How DDD?
對于初步接觸DDD的團隊而言,事件風暴工作坊是一個很好的開始疑俭×改兀可以參考寫過的一篇事件風暴工作坊的實踐和總結(jié)和網(wǎng)上的一些其他資源。
以下是從DDD的經(jīng)典書籍中摘錄的一些實踐方式钞艇。
DDD兩大支柱:通用語言(Ubiquitous Language)和限界上下文(Bounded Context)啄寡。
通用語言是團隊的共享語言。領(lǐng)域?qū)<遗c開發(fā)者使用相同的通用語言進行交流哩照。通用語言的更改挺物,就是對領(lǐng)域模型的更改。
通用語言的缺失將造成高昂的解釋與誤解溝通成本飘弧。
限界上下文(Bounded Context)是應(yīng)用程序的一個概念性邊界识藤,這個邊界內(nèi)的各種領(lǐng)域?qū)儆凇簿褪峭ㄓ谜Z言,有確定的上下文含義次伶。在邊界之外痴昧,這些術(shù)語可能表示不同的意思。
如何制定通用語言学少?
- 繪制物理模型圖剪个,概念模型圖等,標以名字和行為
- 創(chuàng)建一個包含簡單定義的術(shù)語表
- 如果不喜歡術(shù)語表,也可以采用其他類型的文檔扣囊。同時將那些“不正式的”模型圖也給包括進去
- 與團隊其他成員來檢驗成本乎折,并且溝通迭代
TIPS:
- 通用語言通常只在團隊范圍內(nèi)使用,表示一個單一的領(lǐng)域模型
- 如果試圖創(chuàng)建企業(yè)級乃至更大范圍的通用語言時侵歇,幾乎一定會失敗
- 通用語言與限界上下文有一對一的關(guān)系
- 限界上下文也很小骂澄,剛好可以容納一個獨立業(yè)務(wù)領(lǐng)域使用的通用語言
- 每個限界上下文有自己的通用語言,和其他限界上下文打交道時惕虑,可以通過上下文映射圖來集成坟冲。
實現(xiàn)DDD的挑戰(zhàn)
- 創(chuàng)建通用語言時候,時間精力的投入
- 持續(xù)的引入領(lǐng)域?qū)<?/li>
- 改變開發(fā)者對領(lǐng)域的思考方式
DDD與敏捷結(jié)合的實踐
結(jié)合Scrum的思想溃蔫,DDD也傾向于“測試先行健提,逐步改進的策略”。
即便再專業(yè)的領(lǐng)域?qū)<椅芭眩矡o法在業(yè)務(wù)初期進行完美的設(shè)計私痹。
開發(fā)一個新的領(lǐng)域?qū)ο髸r,可以采用以下步驟:
- 編寫測試代碼统刮,模擬客戶端使用該領(lǐng)域?qū)ο?/li>
- 創(chuàng)建該領(lǐng)域?qū)ο笠允箿y試代碼可以編譯通過
- 對測試與領(lǐng)域?qū)ο笾貥?gòu)紊遵。測試能正確的模擬客戶代碼,領(lǐng)域?qū)ο罂梢员砻鳂I(yè)務(wù)行為
- 實現(xiàn)領(lǐng)域?qū)ο?/li>
- 向團隊成員侥蒙,包括領(lǐng)域?qū)<野的ぃ故敬a,以保證領(lǐng)域?qū)ο竽苷_的反映通用語言