為什么要DDD

一、傳統(tǒng)架構(gòu)的劣勢

  • 0、面向數(shù)據(jù)庫建模,更加關(guān)注數(shù)據(jù)、關(guān)注有哪些表哪些列,只要數(shù)據(jù)最終落庫,中間邏輯可以采取任何形式。忽略了業(yè)務(wù)中非常重要的“行為\動作\業(yè)務(wù)邏輯” 的建模,導(dǎo)致中間層要么臃腫、要么流水賬、要么邏輯分散,沒有真正“面向?qū)ο蟆?。最終導(dǎo)致系統(tǒng)被數(shù)據(jù)庫“綁架”,業(yè)務(wù)走向復(fù)雜。
  • 1、傳統(tǒng)controller、service、dao三層架構(gòu)的業(yè)務(wù)邏輯分散到多個地方、如一部分邏輯在sql中、一部分在service中、甚至有的直接在controller中,導(dǎo)致更換開發(fā)人員后代碼不易維護
  • 2、傳統(tǒng)三層架構(gòu)面向數(shù)據(jù)庫編程,本質(zhì)上是數(shù)據(jù)庫的事務(wù)腳本,service里充斥著過程代碼、膠水代碼,多人維護過程中會不斷修改、添加service中的邏輯,service會隨著開發(fā)時間越來越臃腫,當(dāng)然,為了避免臃腫也會有諸如策略模式等設(shè)計模式的引入,但不能改變膠水代碼本質(zhì),比如service代碼中即可能有redisTemplate又可能有mapper和kafkaTemplate等,最終導(dǎo)致service代碼因為不同原因而改變,不符合單一職責(zé)原則
  • 3、傳統(tǒng)三層架構(gòu)雖然在形式上分為三層,但是并沒有在編譯器級別對代碼有約束,實現(xiàn)分層全靠程序員自己的意識,這種代碼并沒有充分利用到編程語言提供的封裝性質(zhì),最后輕則service之間形成網(wǎng)狀結(jié)構(gòu)調(diào)用,重則service層調(diào)用controller層反向調(diào)用,導(dǎo)致代碼邏輯混亂
  • 4、wiki是知識的墳?zāi)乖趥鹘y(tǒng)三層架構(gòu)中體現(xiàn)的淋漓盡致,文檔不易維護,并且隨著時間推移舊知識將逐漸被代碼的爆發(fā)式發(fā)展拋棄,最后新人過來不知所云,找不到一個關(guān)于業(yè)務(wù)的完整知識,出現(xiàn)面對老代碼不敢改,怕改后出現(xiàn)問題,怕改不全等問題

注:上述描述的問題可以通過架構(gòu)手段和其他技術(shù)手段來規(guī)避或者避免,但可能會失去這種分層架構(gòu)帶來的簡單性。

二、DDD的優(yōu)勢

  • 0、面向領(lǐng)域建模,不被某項存儲技術(shù)綁架
  • 1、領(lǐng)域邏輯高內(nèi)聚,真正的面向?qū)ο缶幊獭?/li>
  • 2、不需要wiki維護,業(yè)務(wù)代碼自解釋,后來人員好接手
  • 3、技術(shù)細節(jié)變更如數(shù)據(jù)庫、緩存、定時器等的變更對業(yè)務(wù)邏輯影響比較小,非常適合插件式架構(gòu)。本條實際上是ddd和整潔架構(gòu)綜合帶來的優(yōu)勢。
  • 4、程序員的代碼更加可讀、更加清晰、更加貼合業(yè)務(wù),離客戶更近。代碼即業(yè)務(wù)\設(shè)計、業(yè)務(wù)\設(shè)計即代碼,直接映射。

三、DDD的收益

  • 1、思想帶來的收益,代碼直接映射現(xiàn)實世界概念
  • 2、整潔架構(gòu)帶來的收益,底層技術(shù)如框架、數(shù)據(jù)庫、緩存、kafka等變更不會對核心業(yè)務(wù)邏輯造成影響
  • 3、整潔架構(gòu)帶來的收益,代碼可維護性更強,對后續(xù)擴展、移植等支持更好,分層更加科學(xué)
  • 4、思想帶來的收益,程序員通過DDD對業(yè)務(wù)理解更加透徹,寫的代碼可以更好的傳達客戶的業(yè)務(wù)訴求
  • 5、思想帶來的收益,解耦業(yè)務(wù)、為服務(wù)化提供指導(dǎo)思想。架構(gòu)更加清晰

四、DDD劣勢

  • 1、學(xué)習(xí)曲線陡峭,落地?zé)o框架支持
  • 2、前期相比傳統(tǒng)架構(gòu)代碼量更多,主要集中在DTO等數(shù)據(jù)對象
  • 3、開發(fā)人員前期投入要更多,如事件風(fēng)暴、聚合劃分、事務(wù)處理等,工作量更多

五、建議

  • 1、可以確定的小且簡單的、沒有后續(xù)增長的項目建議使用crud,簡單快速
  • 2、如果有過DDD實踐經(jīng)驗的可以在任何時期進行DDD
  • 3、對于業(yè)務(wù)邏輯復(fù)雜,或者可預(yù)見的會從簡單變復(fù)雜的項目,建議DDD
  • 4、不要為了ddd而ddd,不要空談理論沒有實踐,不要在一個新項目中引入太多需要學(xué)習(xí)的概念或者技術(shù)。
最后編輯于
?著作權(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)容

  • 在本人的前一篇文章《不要把微服務(wù)做成小單體》中,現(xiàn)在很多的微服務(wù)開發(fā)團隊在設(shè)計和實現(xiàn)微服務(wù)的時候覺得只要把原來的單...
    和堅閱讀 14,925評論 2 77
  • 1.從傳統(tǒng)三層架構(gòu)與DDD分層架構(gòu)的編程演變其實是思想的演變。 傳統(tǒng)三層架構(gòu),即用戶界面層UI、業(yè)務(wù)邏輯層BAL、...
    咖啡電視閱讀 8,637評論 0 6
  • DDD,中文名為領(lǐng)域驅(qū)動設(shè)計,為業(yè)務(wù)開發(fā)中必不可少的指導(dǎo)方法論,本文以業(yè)務(wù)開發(fā)中戰(zhàn)略設(shè)計和戰(zhàn)術(shù)設(shè)計為例,將普通開發(fā)...
    RobynnD閱讀 1,139評論 0 2
  • 架構(gòu)這個詞源于英文里的“Architecture“,源頭是土木工程里的“建筑”和“結(jié)構(gòu)”,而架構(gòu)里的”架“同時又包...
    張晨輝Allen閱讀 1,375評論 1 3
  • 前言 領(lǐng)域驅(qū)動設(shè)計(Domain Drive Design)簡稱DDD,是2004年Eric Evans提出...
    lyflying閱讀 2,299評論 1 2

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