領域驅動設計和Clean架構之間的區別? - stackexchange

banq發表於2020-04-13

問題:我一直在研究Robert C. Martin的clean Architecture(CA),發現它對於促進大型應用程式的架構標準非常有用。透過實施案例研究,我對如何使用它來幫助構建更靈活,健壯和可擴充套件的應用程式有一些經驗。最後,我還解決了它的潛在缺點(在回答中概述了其中的許多缺點)。
不過,我的問題是Eric Evans提出的域驅動設計(DDD)與“乾淨架構”有何關係。儘管對DDD不太熟悉,但我注意到DDD和CA之間有許多相似之處。所以這是我的問題:
  1. CA和DDD之間有什麼區別(除了它們的命名方案之外)?
  2. 是應該同時使用它們,還是從兩者中汲取見識,還是應該在另一個之上使用它們?

從研究中,我唯一能找到的就是CA“從此處獲取了對業務物件使用更高階別的抽象” 。

回答:兩者都集中於將域程式碼與應用程式和基礎結構程式碼分開。但這就是相似之處結束的地方。
在Clean/Hexagonal/Onion(或簡稱CHO,分別代表乾淨架構、六邊形架構和洋蔥架構)架構中,這種脫鉤的目標是可測試性和模組化,其預期效果是可以將我們軟體的“核心”與世界其他地區隔離開來。
在DDD中,主要目標是與業務專家建立通用語言。域與其餘應用程式程式碼的分離只是此主要目標的副作用。關於將類設計為實體和聚合也有一些發言權,但這僅在域本身內。關於域程式碼之外的設計,它無話可說。
在實踐中,您可能會發現您同時使用兩者。您使用CHO體系結構來設計系統的整個結構,而“域核心”則被隔離在單獨的模組中。然後,您可以使用DDD與領域專家協作,並可能使用諸如實體和集合之類的DDD概念來設計此領域核心。

其他回答:DDD是一種嘗試透過應用某些策略和策略來幫助您決定如何開發某些軟體的範例。理解域並在您的程式碼中建立一個模型是基礎部分,該程式碼使用領域術語來實現域邏輯。這樣,以領域為中心的設計可以幫助實現和開發您的領域邏輯。
作為以域為中心的架構的一個示例,乾淨的架構是一種結構化程式碼以在演化過程中實現某些屬性的特定方法。特別地,域層可以用於實現如上所述的域邏輯。CA會告訴您域層在軟體設計中的位置,以及依存關係應如何跨層流動。
DDD僅宣告您應該在程式碼中反映您的域模型,而DDD卻沒有告訴您如何像CA一樣將其與其餘程式碼分層組織。CA並沒有告訴您如何像DDD那樣使用戰略或戰術模式來使其與領域保持一致。如果一起使用,CA會定義域層是其中一部分的程式碼的整體結構,而DDD會告訴您如何查詢域層的詳細資訊。

banq回答:Clean架構是DDD的實現落地到軟體的手段,DDD是從業務需求抽象出實體領域模型(類似代表資料庫表模型的實體物件,但區別於它們的是有業務行為,充血模型與失血模型的區別),而CHO則是幫助這些業務實體模型生長在軟體技術環境中,DDD是一棵植物或種子,CHO是土壤花盆,當然CHO是一種特殊的土壤和花盆,能夠有利於植物生根,不會對植物生長有侵入干擾,好的技術架構不應該汙染或侵入業務模型,這是它們兩個的統一宗旨和共識。
 

相關文章