大白話講明白—DDD(領(lǐng)域驅(qū)動設(shè)計)如何從0到落地

好文必讀

入門還是先看看這幾篇:

阿里技術(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ù)層去簡單的編排接口。

  1. 資源設(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ì)的能力。
  2. 領(lǐng)域?qū)樱▋?nèi)聚):比較好的開發(fā)模式,是將某個功能全部內(nèi)聚為一個領(lǐng)域服務(wù)。由這個領(lǐng)域服務(wù)對外提供所有的能力,這樣就實現(xiàn)了某個功能的內(nèi)聚性。
  3. 縱向抽取(開閉原則):回到某個領(lǐng)域服務(wù)中,此時domain層的代碼可以實現(xiàn)縱向抽取。使用模板方法模式抽取大量公用邏輯,子類去實現(xiàn)個性化邏輯。然后通過枚舉類來維護各個策略子類,通過入?yún)⒙酚傻骄唧w的子類來完成業(yè)務(wù)邏輯。
  4. 數(shù)據(jù)校驗(內(nèi)聚):數(shù)據(jù)校驗分為兩類,一類是無狀態(tài)的校驗(例如NPE校驗和url)可以將邏輯寫在DP中(以實現(xiàn)充血對象);一類是有狀態(tài)的校驗,必須借助其他類完成(例如校驗id是否存在數(shù)據(jù)庫中),可以將邏輯寫在domain層;
  5. 防腐層(解耦):調(diào)用第三方接口時,為了不強依賴而破壞我們的代碼,可以在中間加一層適配層,這一層的作用可以完成參數(shù)轉(zhuǎn)換、結(jié)果緩存、兜底等邏輯。

其實一個項目中實現(xiàn)以上幾點(非常好落地),就可以稱為DDD了。

注意:DDD不是想出來的,而是一次次需求迭代出來的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容