一、傳統(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ù)。