領域驅動設計(DDD)

【注】本文譯自: https://www.geeksforgeeks.org...

  領域驅動設計(Domain-Driven Design)是程序員 Eric Evans 於 2004 在他的《 領域驅動設計:解決軟件核心中的複雜性》一書中提出的一個概念。
  這是一種自頂向下的軟件設計方法。首先,讓咱們嘗試重點介紹一下在這種狀況下領域的含義。程序員

什麼是領域?

  在軟件開發的上下文中,「域」指的是業務。在應用程序開發過程當中,一般使用術語域邏輯或業務邏輯。基本上,業務邏輯是應用程序邏輯所圍繞的知識領域。 應用程序的業務邏輯是一組規則和指導原則,用於解釋業務對象應如何相互交互以處理建模數據。
注意:
  軟件工程領域的領域是要在其上構建應用程序的業務。編程

領域驅動設計:

  假設咱們的軟件已經使用了全部最新技術堆棧和基礎設施,這樣的軟件設計架構很是棒,可是當咱們在市場上發佈這個軟件時,最終仍是要由最終用戶來決定咱們的系統是否優秀。另外,若是系統不能解決業務需求,對任何人都沒有用處;無論它看起來有多漂亮,或者它的基礎設施有多好。根據 Eric Evans 的說法,當咱們在開發軟件時,咱們的重點不該該主要放在技術上,而應該主要放在業務上。記住:設計模式

「客戶的工做不是知道他們想要什麼「---史蒂夫·喬布斯

  領域驅動設計涉及兩種設計工具,一種是戰略設計工具,另外一種是戰術設計工具。程序員或開發人員一般處理戰術設計工具,但若是咱們有戰略設計工具的知識和良好的理解,它將幫助咱們構建好的軟件。
  Spring 數據家族下的大多數框架都是根據領域驅動的設計方法構建的。架構

戰略設計:

  戰略設計工具幫助咱們解決全部與軟件建模相關的問題。它是一種相似於面向對象設計的設計方法,在面向對象設計中,咱們被迫從對象的角度思考問題。在戰略設計方面,咱們被迫從環境的角度來思考。框架

上下文(Context):

  咱們能夠把這個詞看做是一個英語單詞,它指的是某一事件、事件、陳述或想法的狀況,它的意思能夠根據這些狀況來肯定。
  除了上下文以外,戰略設計還討論了模型、泛在語言和邊界語境。這些是領域驅動設計的戰略設計中經常使用的術語。讓咱們逐一理解。dom

  • 模型:
      充當核心邏輯並描述領域的選定方面。它用於解決與該業務有關的問題。
  • 通用語言:
      全部團隊成員使用的一種公共語言,用於鏈接團隊圍繞領域模型的全部活動。與領域專家和團隊成員交談時,能夠將其視爲對類、方法、服務和對象使用通用動詞和名詞。
  • 邊界上下文:
      指的是上下文的邊界條件。它是對邊界的描述,並充當一個閾值,在這個閾值中定義並適用於特定的域模型。工具

    戰術設計:

      戰術設計討論實現細節,即建模領域。它一般會處理有界上下文中的組件。咱們可能據說過或使用過諸如服務、實體、存儲庫和工廠之類的東西。它們都是經過域驅動設計創造並流行的。戰術設計過程發生在產品開發階段。
      讓咱們討論一些重要的戰術設計工具。 這些工具是高級概念,可用於建立和修改域模型。spa

  • 實體:
      基於面向對象原則工做的程序員可能知道類和對象的概念。在這裏,實體是具備某些屬性的類。這些類的實例具備全局標識,而且在整個生命週期中都保持相同的標識。請記住,屬性狀態可能會發生變化,但身份永遠不會改變。簡而言之,實體能夠實現一些業務邏輯,而且可使用 ID 進行惟一標識。在編程的上下文中,它一般在 DB 中做爲行持久保存,而且由值對象組成。
  • 值對象:
      它是不可變的輕量級對象,沒有任何標識。值對象經過執行復雜的計算,將繁重的計算邏輯與實體隔離開來,從而下降了複雜性。

      在上圖中,User 是一個實體,Address 是一個值對象,地址能夠更改不少次,但用戶的身份證號永遠不會更改。每當地址更改時,都會實例化一個新地址並將其分配給用戶。
  • 服務:
      服務是無狀態的類,能夠適合實體或值對象之外的其餘地方。簡而言之,服務是一種功能,存在於實體和值對象之間的某個位置,但它既不與實體相關,也不與值對象相關。
  • 聚合:
      當咱們有更大的項目時,對象圖也變得更大,更大的對象圖更難維護。聚合是位於單個事務邊界下的實體和值的集合。基本上是聚合,控制變化,有一個根實體叫作聚合根。根實體以聚合的方式管理其餘實體的生命週期。

      在上面的示例中,若是根實體 UserOrder 被刪除,則與該根實體關聯的其餘實體將毫無用處,而且該關聯的信息也將被刪除。這意味着聚合在本質上老是一致的,這是在域事件的幫助下完成的。生成域事件是爲了確保最終的一致性。
      在上面的例子中,若是用戶的地址已經改變,那麼它必須一樣反映在訂單上。爲此,咱們能夠觸發一個從 User 到 Order 的域事件,以便 Order 更新地址,這樣咱們就有了最終的一致性,Order 也將最終一致。
      聚合和聚合根的其餘例子能夠是對帖子的評論、問答細節、銀行事務細節等。ORM 工具如 hibernate 在建立一對多或多對一關係時使用了大量聚合。
  • 工廠和存儲庫:
      工廠和存儲庫用於處理聚合。工廠幫助管理聚合生命週期的開始,而存儲庫幫助管理聚合生命週期的中間和末端。工廠幫助建立聚合,而存儲庫幫助持久化聚合。咱們應該老是爲每一個聚合根建立存儲庫,而不是爲全部實體建立存儲庫。
      工廠是 GoF 的設計模式,工廠是有用的,但在聚合規則的上下文中不是強制性的。hibernate

    領域驅動設計的優勢:

  • 提升了咱們的技藝
  • 提供了靈活性
  • 更傾向於域而不是接口
  • 經過通用語言減小了團隊之間的溝通差距設計

    領域驅動設計的缺點:

  • 須要一個具備很強領域專業知識的專業人員
  • 鼓勵團隊遵循迭代實踐
相關文章
相關標籤/搜索