1 DDD是什么?
DDD是領域驅動設計,是Eric Evans於2003年提出的,離現在有17年。
2 為什么需要DDD
當軟件越來越復雜,實際開發中,大量的業務邏輯堆積在一個巨型類中的例子屢見不鮮,代碼的復用性和擴展性無法得到保證。為了解決這樣的問題,DDD提出了清晰的分層架構和領域對象的概念,讓面向對象的分析和設計進入了一個新的階段,對企業級軟件開發起到了巨大的推動作用。
2.1 POP,OOP,DDD是如何解決問題
面向過程編程(POP),接觸到需求第一步考慮把需求自頂向下分解成一個一個函數。並且在這個過程中考慮分層,模塊化等具體的組織方式,從而分解軟件的復雜度。當軟件的復雜度不是很大,POP也能得到很好的效果。
面向對象編程(OOP),接觸到需求第一步考慮把需求分解成一個一個對象,然后每個對象添加一個一個方法和屬性,程序通過各種對象之間的調用以及協作,從而實現計算機軟件的功能。跟很多工程方法一樣,OOP的初衷就是一種處理軟件復雜度的設計方法。
領域驅動設計(DDD),接觸到需求第一步考慮把需求分解成一個一個問題域,然后再把每個問題域分解成一個一個對象,程序通過各種問題域之間的調用以及協作,從而實現計算機軟件的功能。DDD是解決復雜中大型軟件的一套行之有效方式,現已成為主流。
2.2 POP,OOP,DDD的特點
POP,無邊界,軟件復雜度小適用,例如“蓋房子”。
OOP,以“對象”為邊界,軟件復雜度中適用,例如“蓋小區”。
DDD,以“問題域”為邊界,軟件復雜度大適用,例如“蓋城市”。
3 DDD的分層架構和構成要素
3.1 分層架構
整個架構分為四層,其核心就是領域層(Domain),所有的業務邏輯應該在領域層實現,具體描述如下:
用戶界面/展現層,負責向用戶展現信息以及解釋用戶命令。
應用層,很薄的一層,用來協調應用的活動。它不包含業務邏輯。它不保留業務對象的狀態,但它保有應用任務的進度狀態。
領域層,本層包含關於領域的信息。這是業務軟件的核心所在。在這里保留業務對象的狀態,對業務對象和它們狀態的持久化被委托給了基礎設施層。
基礎設施層,本層作為其他層的支撐庫存在。它提供了層間的通信,實現對業務對象的持久化,包含對用戶界面層的支撐庫等作用。
3.2 構成要素
實體(Entity),具備唯一ID,能夠被持久化,具備業務邏輯,對應現實世界業務對象。
值對象(Value Object),不具有唯一ID,由對象的屬性描述,一般為內存中的臨時對象,可以用來傳遞參數或對實體進行補充描述。
領域服務(Domain Service),為上層建築提供可操作的接口,負責對領域對象進行調度和封裝,同時可以對外提供各種形式的服務。
聚合根(Aggregate Root),聚合根屬於實體對象,聚合根具有全局唯一ID,而實體只有在聚合內部有唯一的本地ID,值對象沒有唯一ID
工廠(Factories),主要用來創建聚合根,目前架構實踐中一般采用IOC容器來實現工廠的功能。
倉儲(Repository),封裝了基礎設施來提供查詢和持久化聚合操作。
4 小結
通過本文介紹,我們了解DDD是為解決軟件復雜性而誕生,與OOP最大的區別就是划分邊界的方式不一樣,所以DDD本身掌握起來並不會感覺復雜,DDD其實是研究將包含業務邏輯的ifelse語句放在哪里的學問。