基於DDD+微服務的開發實戰(1)
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語句放在哪裡的學問。