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