(轉(zhuǎn))領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(DDD:Domain-Driven Design)

Eric Evans的“Domain-Driven Design領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)”簡(jiǎn)稱DDD,Evans DDD是一套綜合軟件系統(tǒng)分析和設(shè)計(jì)的面向?qū)ο蠼7椒?,本站Jdon.com是國(guó)內(nèi)公開(kāi)最早討論DDD網(wǎng)站之一,可訂閱DDD專題。初學(xué)者學(xué)習(xí)DDD可從研究本站Jdon框架的DDD應(yīng)用源碼開(kāi)始,戳這里開(kāi)始

過(guò)去系統(tǒng)分析和系統(tǒng)設(shè)計(jì)都是分離的,正如我們國(guó)家“系統(tǒng)分析師” 和“系統(tǒng)設(shè)計(jì)師” 兩種職稱考試一樣,這樣割裂的結(jié)果導(dǎo)致,需求分析的結(jié)果無(wú)法直接進(jìn)行設(shè)計(jì)編程,而能夠進(jìn)行編程運(yùn)行的代碼卻扭曲需求,導(dǎo)致客戶運(yùn)行軟件后才發(fā)現(xiàn)很多功能不是自己想要的,而且軟件不能快速跟隨需求變化。

DDD則打破了這種隔閡,提出了領(lǐng)域模型概念,統(tǒng)一了分析和設(shè)計(jì)編程,使得軟件能夠更靈活快速跟隨需求變化。見(jiàn)下面DDD與傳統(tǒng)CRUD或過(guò)程腳本或者面向數(shù)據(jù)表等在開(kāi)發(fā)效率上比較:


23142654.png

服務(wù)器后端發(fā)展三個(gè)階段:

  1. UI+DataBase的兩層架構(gòu),這種面向數(shù)據(jù)庫(kù)的架構(gòu)(上圖table module )沒(méi)有靈活性。
  2. UI+Service+DataBase的多層SOA架構(gòu),這種服務(wù)+表模型的架構(gòu)易使服務(wù)變得囊腫,難于維護(hù)拓展,伸縮性能差,見(jiàn)這里討論Spring Web 應(yīng)用的最大敗筆.
  3. DDD+SOA的事件驅(qū)動(dòng)的CQRS讀寫分離架構(gòu),應(yīng)付復(fù)雜業(yè)務(wù)邏輯,以聚合模型替代數(shù)據(jù)表模型,以并發(fā)的事件驅(qū)動(dòng)替代串聯(lián)的消息驅(qū)動(dòng)。真正實(shí)現(xiàn)以業(yè)務(wù)實(shí)體為核心的靈活拓展。

DDD革命性在于:領(lǐng)域模型準(zhǔn)確反映了業(yè)務(wù)語(yǔ)言,而傳統(tǒng)J2EE或Spring+Hibernate等事務(wù)性編程模型只關(guān)心數(shù)據(jù),這些數(shù)據(jù)對(duì)象除了簡(jiǎn)單setter/getter方法外,沒(méi)有任何業(yè)務(wù)方法,被比喻成失血模型,那么領(lǐng)域模型這種帶有業(yè)務(wù)方法的充血模型到底好在哪里?

比賽Match為案例,比賽有“開(kāi)始”和“結(jié)束”等業(yè)務(wù)行為,但是傳統(tǒng)經(jīng)典的方式是將“開(kāi)始”和“結(jié)束”行為放在比賽的服務(wù)Service中,而不是放在比賽對(duì)象本身之中。我們不能因?yàn)橛昧擞?jì)算機(jī),用了數(shù)據(jù)庫(kù),用了框架,業(yè)務(wù)模型反而被技術(shù)框架給綁架,就像人雖然是由母親生的,但是人的吃喝拉撒母親不能替代,更不能以母愛(ài)名義肢解人的正常職責(zé)行為,如果是這樣,這個(gè)人就是被母愛(ài)綁架了。

提倡充血模型,實(shí)際就是讓過(guò)去被肢解被黑crack的業(yè)務(wù)模型回歸正常,當(dāng)然這也會(huì)被一些先入為主或被洗過(guò)腦的程序員看成反而不正常,這更是極大可悲之處。看到領(lǐng)域模型代碼,就看到業(yè)務(wù)需求,沒(méi)有翻譯沒(méi)有轉(zhuǎn)換,保證軟件真正實(shí)現(xiàn)“拷貝不走樣”。

DDD最大的好處是:接觸到需求第一步就是考慮領(lǐng)域模型,而不是將其切割成數(shù)據(jù)和行為,然后數(shù)據(jù)用數(shù)據(jù)庫(kù)實(shí)現(xiàn),行為使用服務(wù)實(shí)現(xiàn),最后造成需求的首肢分離。DDD讓你首先考慮的是業(yè)務(wù)語(yǔ)言,而不是數(shù)據(jù)。重點(diǎn)不同導(dǎo)致編程世界觀不同。

DDD是解決復(fù)雜中大型軟件的一套行之有效方式,在國(guó)外已經(jīng)成為主流。DDD認(rèn)為很多原因造成軟件的復(fù)雜性,我們不可能避免這些復(fù)雜性,能做的是對(duì)復(fù)雜的問(wèn)題進(jìn)行控制。而一個(gè)好的領(lǐng)域模型是控制復(fù)雜問(wèn)題的關(guān)鍵。領(lǐng)域模型的價(jià)值在于提供一種通用的語(yǔ)言,使得領(lǐng)域?qū)<液蛙浖夹g(shù)人員聯(lián)系在一起,溝通無(wú)歧義。

DDD在軟件生產(chǎn)流程中定位i如下圖,DDD落地實(shí)現(xiàn)離不開(kāi)in-memory緩存、 CQRS、 DCI、 EDAEvent Source幾大大相關(guān)領(lǐng)域。

23142654.png

  2012年Eric Evans關(guān)于技術(shù)如何影響DDD的會(huì)話

領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)參考

  領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)簡(jiǎn)介 PDF

  聚合與一致性和有界上下文

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

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

  • 有位朋友最近在為企業(yè)做領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(Domain Driven Design)內(nèi)訓(xùn)時(shí),遇到一位資深學(xué)員向他抱怨該技...
    MagicBowen閱讀 18,943評(píng)論 8 66
  • 前言 這篇文章假設(shè)你已經(jīng)初步了解過(guò)領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(DDD)的基本概念(聚合根、實(shí)體、值對(duì)象、領(lǐng)域服務(wù)、領(lǐng)域事件、資源...
    放飛的馬閱讀 54,157評(píng)論 20 117
  • 題目 以下代碼的輸出什么? 分析與解答 答案是: Thread.join方法是將指定線程加入當(dāng)前線程,將兩個(gè)交替執(zhí)...
    DeppWang閱讀 3,292評(píng)論 0 3
  • 十六個(gè)夏天,五個(gè)人的青春成長(zhǎng)歷程。 暗戀、迷茫、相愛(ài)、婚變、失業(yè)、離世…… 人生難免經(jīng)歷苦痛,有隔閡,有怨恨,但幸...
    燏兒閱讀 624評(píng)論 0 0

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