領(lǐng)域驅(qū)動設(shè)計真的好嗎?
領(lǐng)域驅(qū)動是一個相對抽象的概念,如果仍然從抽象的角度來解釋的話可能會更讓人迷惑。
從事多年的領(lǐng)域驅(qū)動開發(fā),我想從一些細節(jié)處出發(fā),來講講領(lǐng)域驅(qū)動為什么好,好在哪里,是如何被總結(jié)提煉出來的。
1、傳統(tǒng)三層與領(lǐng)域驅(qū)動的區(qū)別。
傳統(tǒng)三層架構(gòu)及其衍生出的多層架構(gòu)是現(xiàn)有大部分程序員甚至好多工作十年以上的程序唯一使用和認可的模式。這種編程認識和習(xí)慣同時也是DDD實踐的最大的阻礙。因為每個人在學(xué)習(xí)過程中都系統(tǒng)學(xué)習(xí)過三層架構(gòu), 對數(shù)據(jù)層、業(yè)務(wù)層、表現(xiàn)層的三者分離,有一種直覺。
我并沒有說這個不好。只是偏執(zhí)的理解和使用三層,很容易形成一葉障目的情況。在三層里,我們的模型層是用來與數(shù)據(jù)庫一一對應(yīng),而這個對象的行為分布到了業(yè)務(wù)層,有的甚至通過存儲過程放在了數(shù)據(jù)庫和數(shù)據(jù)層。
這是一個非常不好的現(xiàn)象,就是這里的對象是貧血模型(只有屬性沒有行為)。另一種類,在業(yè)務(wù)層和數(shù)據(jù)層的方法同樣也是貧血模型(只有行為沒有屬性),造成了一種認知上的局限性,本身就不符合我們對面向?qū)ο蟮幕菊J知,也必然導(dǎo)致有問題的調(diào)序。
另外,因為所有的都變成了數(shù)據(jù)庫操作,很容易讓人產(chǎn)生一種慣性思維,就是業(yè)務(wù)系統(tǒng)就是數(shù)據(jù)庫的增刪改查,這種被很多程序認為自己看透了所謂程序的本質(zhì)的人。他們在設(shè)計一個系統(tǒng)時,就是從數(shù)據(jù)庫開始設(shè)計,并且把所有的業(yè)務(wù)映射到數(shù)據(jù)庫的操作上去。讓程序變得僵化,也讓自己的思想變得僵化。試問如果要你開發(fā)一個視頻解碼程序你怎么開發(fā),那要是開發(fā)一個播放器,一個BT下載端,一個數(shù)據(jù)庫,一個web服務(wù)器,一個IM通訊你如何做,他們似乎并不是面向?qū)?shù)據(jù)的,那你怎么處理呢?
所以從這點上DDD提倡充血模型,把視角轉(zhuǎn)換到對具體業(yè)務(wù)的理解上,開發(fā)的程序跟現(xiàn)實中人的理解,跟具體的業(yè)務(wù)一一對應(yīng)。比如一個老師類就是自己的姓名、年齡、所帶科目,同時有上課,教學(xué),批改作業(yè)這樣的方法。
這是一個活生生的概念,一個充血模型。一旦邁出了這一步,你突然發(fā)現(xiàn),原來你學(xué)過的UML繪圖,你學(xué)過的設(shè)計模式,全部用得上了。可謂思路一變,大路通天。
2、DDD是不斷提煉,不斷深化,不斷標準化的過程中提出來的。
以三層為例,三層為什么會被提出來,而且被廣大程序員廣泛接受,就是因為開始寫程序的時候,大家需要有一種共同認可,約定俗成的規(guī)范,這樣大家就能保證項目里參與的人寫出來的代碼更容易別其它人理解和修改。這個就是標準化的力量,當(dāng)大家認可同一種模式后,就能非常和諧的協(xié)同起來。
比如在實際工作中,我不提倡大家去畫非常精準嚴格的UML圖,我們只使用里面最通俗易懂的一些圖,一些標識,一些符號來表達我們的概念。UML是幫助我們疏理思維的工具,用我們大家都能直觀認識,能快速達成統(tǒng)一的東西來進行處理。這個就成了我們事實上的標準,是我們在用UML,不是UML在用我們。
DDD也一樣,里面包含了很多前人總結(jié)的各種經(jīng)驗。采用時從大家共同理解,容易接受的部分開始,隨著實踐的展開,會有越來越多的概念進入視野,然后一步一步的使用起來。所以我們說DDD是別人總結(jié)出來的標準,是讓大家共同認可才有價值的。從這個點上來說,對于執(zhí)行DDD很到位的團隊,DDD絕對是真的好的。但是對于你完全不具備DDD的思維方式,而強行寫DDD的人是真的不好。
3、DDD并不是銀彈,你曾經(jīng)解決不了的技術(shù)問題,可能同樣還是解決不了。
他只是提出了一種更接近人的思維方式的一種模式,并且抽象出了一系列的對象和工具,讓你更容易的去分解你的業(yè)務(wù)模型和概念。幫助你快速的建立領(lǐng)域模型和分層架構(gòu)。在需求發(fā)生變化的時候,他更容易響應(yīng),因為跟業(yè)務(wù)一致,所以他也更容易開始,而不是先設(shè)計數(shù)據(jù)庫,一旦數(shù)據(jù)庫發(fā)生變更,會發(fā)生重大的修改,有些甚至是傷筋動骨的調(diào)整。當(dāng)你有一點點業(yè)務(wù)概念的時候,你就可以開始寫代碼進行驗證了。可能說在大型項目里,他是有很大的用武之地的。
我認為DDD是道,三層只是術(shù)。
至于適不適合你,還取決于你是否想深入的了解和應(yīng)用DDD。