掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
領(lǐng)導(dǎo):為什么要使用DDD?

河北ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!
我也苦思冥想,怎么跟領(lǐng)導(dǎo)說咱們從 MVC 升級到 DDD 吧,因為 DDD 代碼結(jié)構(gòu)更加清晰、領(lǐng)域驅(qū)動比測試驅(qū)動開發(fā)更加先進、研發(fā)的兄弟們也更想用用新框架等。
不過這么聊被噴一頓不說,還得說你是過度設(shè)計瞎折騰,咋回事呢?因為沒聊到重點呀,你MVC升級DDD;給業(yè)務(wù)帶來了什么、提升了交付效率嗎、降低了公司研發(fā)成本嗎,都沒有?不僅沒有,你還說為了后期的迭代維護,前期會需要更多的設(shè)計和開發(fā)時間。咋?你是想這一個Q就把我送走嗎,我剛來咱們部門KPI在那懸著,壓的我頭發(fā)都白了!別瞎搞,求穩(wěn)!
那就不搞了嗎?搞哇,不讓搞換領(lǐng)導(dǎo)!但搞之前,要考慮清楚,DDD 不是 Silver Bullet,你有一腔熱血雖好,可是也得知曉 DDD 的設(shè)計原則是什么、它更適合的場景是什么、與 MVC 對比有什么云泥之別。
使用 DDD 模式開發(fā)代碼的成本到底在哪?是因為使用 DDD 四層分層結(jié)構(gòu)就比MVC 三層分層結(jié)構(gòu) 更浪費時間嗎?其實并不是,因為四層結(jié)構(gòu)相對于三層結(jié)構(gòu),反而更好的區(qū)分了代碼所屬職責,在熟悉模塊功能職責后,開發(fā)起來也會更加順暢。
那這里的 DDD 領(lǐng)域驅(qū)動設(shè)計開發(fā)的成本在哪呢?這個成本在于對于一個復(fù)雜系統(tǒng)又尚未在開發(fā)前期就有非常充足的經(jīng)驗來拆分職責邊界、劃分功能領(lǐng)域、明確編排邏輯和對未知流程擴展的把控上,所帶來的風暴模型設(shè)計成本。
而通常使用的 MVC 結(jié)構(gòu)基本不會出現(xiàn)這樣的問題,因為在實際的代碼中,DAO、PO、VO等都是共用的,大家在開發(fā)代碼的時候,像堆泥球一樣面向過程寫代碼,直接串聯(lián)出產(chǎn)品的PRD功能節(jié)點即可,不用過多的思考解耦和內(nèi)聚。
那不是可以設(shè)計模式嗎,這就需要看你是站在哪個維度去思考問題。設(shè)計模式在這里是戰(zhàn)術(shù)問題的,DDD和MVC是確定戰(zhàn)略問題的,有點像是說:“方向不對,努力白費一樣”
那么現(xiàn)在我們再來看這條開發(fā)成本曲線:
架構(gòu)模式,開發(fā)成本曲線
在了解和掌握 DDD 領(lǐng)域驅(qū)動設(shè)計的路上,你一定會碰到兩個抽象的釘子 —— “貧血模型”、“充血模型”:
貧血模型:事務(wù)腳本模式,最早起源于 EJB2,到 Spring 進入開“春”盛世。
充血模型:領(lǐng)域模型模式,2003年提出,一直到《實現(xiàn)領(lǐng)域驅(qū)動設(shè)計》的問世,才開啟了 DDD 的大門。但國內(nèi)直到微服務(wù)、低代碼的興起,才開始 DDD 熱
MVC 分層結(jié)構(gòu)將:“狀態(tài)”(數(shù)據(jù),成員對象)、“行為“(邏輯、過程),分離到不同的對象中,只有狀態(tài)的對象(VO -> Value Object) 被稱為貧血模型,只有行為的對象,就是框架分層中常見的Logic/Service/Manager層(對應(yīng)到EJB2中的Stateless Session Bean)
MVC 分層結(jié)構(gòu)
DDD 的分層結(jié)構(gòu)也是面向?qū)ο缶幊痰谋举|(zhì):”一個對象擁有行為和數(shù)據(jù)“,在領(lǐng)域?qū)影耍簩ο?、聚合對象、倉儲和Service實現(xiàn)。
DDD 分層結(jié)構(gòu)
首先 DDD 的設(shè)計分為戰(zhàn)略和戰(zhàn)術(shù);
在以DDD領(lǐng)域驅(qū)動設(shè)計落地的過程中,要依靠領(lǐng)域驅(qū)動設(shè)計的設(shè)計思想,通過事件風暴建立領(lǐng)域模型,合理劃分領(lǐng)域邏輯和物理邊界,建立領(lǐng)域?qū)ο蠹胺?wù)矩陣和服務(wù)架構(gòu)圖,定義符合DDD分層架構(gòu)思想的代碼結(jié)構(gòu)模型,保證業(yè)務(wù)模型與代碼模型的一致性。通過上述設(shè)計思想、方法和過程,指導(dǎo)團隊按照DDD設(shè)計思想完成微服務(wù)設(shè)計和開發(fā)。
拒絕泥球小單體、拒絕污染功能與服務(wù)、拒絕加功能排期一個月
架構(gòu)出高可用極易符合互聯(lián)網(wǎng)高速迭代的應(yīng)用服務(wù)
物料化、組裝化、可編排的服務(wù),提高人效
要領(lǐng)域驅(qū)動設(shè)計,而不是數(shù)據(jù)驅(qū)動設(shè)計,也不是界面驅(qū)動設(shè)計
要職能清晰的分層,而不是什么都放的大籮筐
DDD 的領(lǐng)域模型設(shè)計,界限內(nèi)的上下文,可以拆分為獨立的微服務(wù)。但不僅要從業(yè)務(wù)視角看問題,也要考慮非業(yè)務(wù)的技術(shù)因素,包括:高性能、安全、團隊、技術(shù)異構(gòu)等,這些非業(yè)務(wù)的技術(shù)因素,也會決定領(lǐng)域模型落地的具體落地。
你說我 MVC 不好,你說我 MVC 貧血模型,PO 類不斷的膨脹,但讓我用 DDD 又都是理論,程序員更喜歡看的是已經(jīng)落地的代碼,告訴我怎么干。
為什么這么難落地呢?因為從 MVC 過度到 DDD 描述對比只是積累了 MVC 失敗的教訓(xùn),但沒有 DDD 成功的經(jīng)驗,所以更多的時候想落地 DDD 除了有理論支撐,更需要一份案例擺在面前。
所以為了讓更多的碼農(nóng)看到在 DDD 上一條能走的路,專門折騰了個 DDD 分布式抽獎系統(tǒng),來告訴大家怎么使用 DDD 開發(fā)業(yè)務(wù)需求;
DDD 分布式抽獎系統(tǒng),工程分布
整體系統(tǒng)架構(gòu)設(shè)計包含了6個工程:
當我們拿到產(chǎn)品的 RPD 以后,并不是直接上手開發(fā),而是需要從流程中拆解出一份面向?qū)ο笤O(shè)計的領(lǐng)域服務(wù),舉例;
DDD 分布式抽獎系統(tǒng),流程拆解

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流