如何理解領(lǐng)域驅(qū)動(dòng)設(shè)計(jì) DDD
本文章的中獎(jiǎng)名單《數(shù)據(jù)庫排名:MySQL跳出“同期跌幅榜”,拿下“漲幅榜冠軍”》 文末公布
DDD(領(lǐng)域驅(qū)動(dòng)設(shè)計(jì))是軟件開發(fā)中的一個(gè)非常重要的設(shè)計(jì)方式,它被譽(yù)為面向?qū)ο箝_發(fā)的正確使用方式。它可以保證軟件開發(fā)到后期不會(huì)變成“屎山”。軟件項(xiàng)目復(fù)雜度隨時(shí)間推移如圖所示:

0x01:DDD是什么
首先,DDD是什么呢,DDD就是一個(gè)抽象的概念,DDD只在軟件的架構(gòu)設(shè)計(jì)階段出現(xiàn),它就是軟件模塊職責(zé)的劃分,比如我們需要設(shè)計(jì)一個(gè)圖書館書籍借閱系統(tǒng),我們?cè)诓莞寮埳袭嫵鲇脩裟K(包含注冊(cè)登錄借閱還書等)、圖書模塊(增刪改查等)、管理員模塊(錄入注銷統(tǒng)計(jì)分析報(bào)表等)、日志模塊等等,然后畫出它們之間的交互方式等等……,恭喜,你已經(jīng)設(shè)計(jì)出了非常棒的DDD架構(gòu)。你也許會(huì)疑惑,領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)這么簡單?對(duì)的,它就是這么簡單。
DDD同時(shí)又是一個(gè)非常容易被誤解的概念,同時(shí)網(wǎng)上90%的領(lǐng)域模型教程、領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)方式文章都是錯(cuò)誤的打開方式,它們會(huì)使得這個(gè)概念更加讓人摸不著頭腦。就拿abp來說,它是一個(gè)基于DDD的框架,但同時(shí),因這類DDD框架的存在,使得DDD更加讓人摸不著頭腦。
DDD教程很多會(huì)說到貧血模型、充血模型、建立領(lǐng)域知識(shí)、和領(lǐng)域?qū)<疑钊虢涣魃渡渡兜模@些統(tǒng)統(tǒng)不用管。下面我將詳細(xì)說說DDD如何學(xué),如何用。
0x02:DDD如何學(xué)
然后我說說領(lǐng)域驅(qū)動(dòng)如何學(xué)。你需要知道的是,DDD是非常混亂的概念,首先它只存在于軟件設(shè)計(jì)階段,沒有DDD框架之說。DDD只是一種軟件的設(shè)計(jì)方式,怎樣讓軟件做到高內(nèi)聚低耦合,怎樣讓項(xiàng)目的可維護(hù)性始終處于最佳狀態(tài)。
比如abp,雖然對(duì)外宣稱它是基于DDD的軟件開發(fā)框架,但這么說同時(shí)也是非常容易讓新手誤會(huì)的點(diǎn),認(rèn)為學(xué)DDD就是用框架,用框架就等于用了DDD的思想。這是非常錯(cuò)誤的想法。DDD的存在的目的是,告訴開發(fā)者,應(yīng)該怎樣設(shè)計(jì)軟件,怎樣使得項(xiàng)目最終不會(huì)變成屎山。
就拿abp來說,它是具體實(shí)施的框架,強(qiáng)行把抽象概念用在實(shí)際編碼上。具體用起來,很多概念就和現(xiàn)有框架很相似,大多數(shù)場(chǎng)合下就只是換了一個(gè)名字,比如實(shí)體(Entity)就是MVC/MVVM的數(shù)據(jù)庫對(duì)象模型(Model),聚合跟(AggregateRoot)就是MVVM中的ViewModel,服務(wù)(Service)就是MVC中的Controller。
abp框架就是把握住了DDD噱頭,故意將軟件架構(gòu)設(shè)計(jì)的思考方式與軟件開發(fā)的具體實(shí)施混為一談,在不懂DDD本質(zhì)的程序員中廣泛傳播,似乎用了這個(gè)框架就等于用了高級(jí)的DDD,實(shí)際上在架構(gòu)師看來,abp和其他MVC/MVVM框架沒有任何本質(zhì)區(qū)別。
我們從第一步開始,給你一個(gè)軟件項(xiàng)目,你先不寫代碼,先分析分析,這個(gè)軟件需要提供哪些功能,按照功能類型劃分為多個(gè)模塊,然后再獨(dú)立出外部模塊與內(nèi)部模塊,比如用戶模塊維護(hù)用戶數(shù)據(jù),始終與用戶做交互,那么就是對(duì)外模塊;日志模塊的任何數(shù)據(jù)都不展示給用戶,也不直接與用戶做交互,那么就是對(duì)內(nèi)模塊。模塊劃分完成后,按照使用者的思維方式來設(shè)計(jì)接口,比如用戶模塊有注冊(cè)接口、登錄接口、圖書模塊有查詢借閱等等接口等等……,這樣就完成了非常出色的DDD領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)。
0x03:DDD如何用
接下來就說說如何用。有了上面的領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)文檔,程序猿就開始開發(fā)軟件了,選擇自己喜歡的MVVM框架,主流的數(shù)據(jù)庫等等……
但通常情況下,軟件開發(fā)的一團(tuán)糟。比如你們可能也會(huì)遇到過這樣的情況:設(shè)計(jì)軟件各模塊、各架構(gòu)設(shè)計(jì)文檔里寫的井井有條,頭頭是道,寫軟件時(shí)就寫成了一坨屎,有個(gè)幾年的屎山就完全沒法繼續(xù)開發(fā),只能重構(gòu)了。究其原因,不是是說DDD只能用DDD框架來開發(fā),比如abp,根本原因在于DDD落地方式不對(duì)。通常軟件最開始按照設(shè)計(jì)文檔開發(fā),寫著寫著就放飛自我了,最終成品中幾乎看不出模塊的劃分;或者是整個(gè)軟件嚴(yán)格按照設(shè)計(jì)文檔開發(fā)出了成品,后面招新人加入項(xiàng)目后,新人為了完成任務(wù)放飛自我,這兒添一點(diǎn)那兒改一點(diǎn),最終就脫離出了最開始的設(shè)計(jì)。
那么問題點(diǎn)出在哪呢?看過網(wǎng)上的其他的DDD的文章后,就會(huì)看到很多這樣的概念:領(lǐng)域、值對(duì)象、界限上下文、聚合、聚合跟、DTO等等。那么我就告訴你,這些東西存在的目的就是,限制你的開發(fā)方式,使得你無法放飛自我,只能按照這種開發(fā)方式來開發(fā)軟件,最終的結(jié)果就是,不論軟件項(xiàng)目組經(jīng)過多少人的加入及退出,只要沒人故意搗亂,那么這個(gè)軟件始終就是最科學(xué)的組織方式,永遠(yuǎn)不會(huì)變成屎山。
DDD的正確使用方式當(dāng)然不是用DDD框架。正確使用方式是,按照DDD設(shè)計(jì)思路的約束,邏輯代碼不要放到數(shù)據(jù)層,A模塊的代碼不要放到B模塊層等等……理解了這一點(diǎn),那么你就懂得了DDD的正確使用方式了。
中獎(jiǎng)名單:數(shù)據(jù)庫排名:MySQL跳出“同期跌幅榜”,拿下“漲幅榜冠軍” 文章里任選一本

source: http://www.fawdlstty.com/archives/670.html

喜歡,在看
