好文必讀
入門還是先看看這幾篇:
阿里技術(shù)專家詳解 DDD 系列 第一講- Domain Primitive
阿里技術(shù)專家詳解DDD系列 第二講 - 應(yīng)用架構(gòu)
阿里技術(shù)專家詳解DDD系列 第三講 - Repository模式
美團:領(lǐng)域驅(qū)動設(shè)計在互聯(lián)網(wǎng)業(yè)務(wù)開發(fā)中的實踐
github:ddd落地demo實現(xiàn)
思想感悟
其實DDD并不是一種新技術(shù),而是一種比較好的業(yè)務(wù)重構(gòu)的思想:所謂“領(lǐng)域驅(qū)動設(shè)計”名詞很高大上,但是實際就是編寫代碼時,先編寫領(lǐng)域服務(wù)層(domain層)。在領(lǐng)域?qū)佣x接口?;A(chǔ)設(shè)施層去實現(xiàn)接口,應(yīng)用服務(wù)層去簡單的編排接口。
- 資源設(shè)施層(解耦):Repository層技術(shù)可能會發(fā)生一下的演變:單庫單表->redis+DB查詢->分庫分表->拆分微服務(wù)RPC調(diào)用這么演變,技術(shù)類型可能經(jīng)由:jdbc Template->mybatis->jooq等演變。所以基礎(chǔ)設(shè)施層不能和domain層進行強依賴,傳輸對象不能和某個存儲介質(zhì)強綁定(例如DB的po對象)。所以我們需要在domain層來定義接口,由Repository層來進行實現(xiàn)。這樣的話,就可以實現(xiàn)可插拔的替換底層存儲介質(zhì)的能力。
- 領(lǐng)域?qū)樱▋?nèi)聚):比較好的開發(fā)模式,是將某個功能全部內(nèi)聚為一個領(lǐng)域服務(wù)。由這個領(lǐng)域服務(wù)對外提供所有的能力,這樣就實現(xiàn)了某個功能的內(nèi)聚性。
- 縱向抽取(開閉原則):回到某個領(lǐng)域服務(wù)中,此時domain層的代碼可以實現(xiàn)縱向抽取。使用模板方法模式抽取大量公用邏輯,子類去實現(xiàn)個性化邏輯。然后通過枚舉類來維護各個策略子類,通過入?yún)⒙酚傻骄唧w的子類來完成業(yè)務(wù)邏輯。
- 數(shù)據(jù)校驗(內(nèi)聚):數(shù)據(jù)校驗分為兩類,一類是無狀態(tài)的校驗(例如NPE校驗和url)可以將邏輯寫在DP中(以實現(xiàn)充血對象);一類是有狀態(tài)的校驗,必須借助其他類完成(例如校驗id是否存在數(shù)據(jù)庫中),可以將邏輯寫在domain層;
- 防腐層(解耦):調(diào)用第三方接口時,為了不強依賴而破壞我們的代碼,可以在中間加一層適配層,這一層的作用可以完成參數(shù)轉(zhuǎn)換、結(jié)果緩存、兜底等邏輯。
其實一個項目中實現(xiàn)以上幾點(非常好落地),就可以稱為DDD了。
注意:DDD不是想出來的,而是一次次需求迭代出來的。