解決DDD核心的複雜性
讓我們做一個小實驗:試著向那些對此毫無頭緒的人解釋領域驅動設計的要點。這一點,特別是簡潔地說,並不容易。哎呀,我自己也在努力。有界的上下文,實體,域事件,值物件,域,聚合,儲存庫......
為了在明顯的混亂中找到順序,我想從一個相當不同尋常的角度分析DDD方法 - 將領域驅動設計應用於領域驅動設計本身。畢竟,這種方法旨在處理複雜的領域,不是嗎?
讓我們首先確定核心領域:DDD的主要競爭優勢是什麼,以及實現它的手段是什麼?
核心領域:無所不在的語言
在“領域驅動設計:解決軟體核心中的複雜性”(藍皮書)中,Eric Evans認為領域專家和軟體開發團隊之間的不良協作導致許多開發工作失敗。DDD旨在透過彌合這種協作和溝通差距來提高成功率。
為了能夠流暢地分享知識,DDD呼籲培養一種共享的,面向商業的語言:無所不在的語言。此語言應類似於業務域及其術語,實體和流程。
無處不在的語言應該在整個專案中廣泛使用。所有溝通都應該在無所不在的語言中進行。所有檔案都應在其中制定。甚至程式碼也應該“說出”無所不在的語言。
許多方法都在努力降低風險並提高軟體專案的成功率,但由於Ubiquitous Language統一語言是DDD實現它的手段,我認為它是域驅動設計的核心領域。
定義無所不在的語言並不是一件容易的事。由於軟體不能很好地應對歧義,因此每個泛在語言術語應該只具有一個含義。不幸的是,這不是人類語言的工作方式 - 通常語言在不同的語境中具有不同的含義。為克服這一障礙並支援培養嚴謹語言的過程,採用了另一種DDD模式:有界上下文。
支援子域:有界上下文
為了防止術語具有多重含義,DDD要求每種語言都具有嚴格的適用性上下文,稱為有界上下文。這種模式定義了一個邊界,在其中可以自由使用泛在語言。除此之外,語言的術語可能有不同的含義。
雖然有界上下文模式是領域驅動設計的重要組成部分,但我認為它是一個支援子域,因為它的目的是支援無處不在的語言 - 核心域的形成。
正如我之前提到的,程式碼還應該“說出”實現它的有界上下文的無處不在的語言。但是,如何在程式碼中實現業務域?實現業務領域沒有一刀切的模式。有多種選擇,這是我們的下一站。警告:神聖的奶牛即將受到傷害......
通用子域:領域實現
這些模式提供了實現業務域邏輯的不同方法:
- 事務指令碼
- 活躍記錄
- 領域模型
- 事件源領域模型
這些模式中的每一個都適合不同級別的域複雜性。您選擇的模式應該具有足夠的表現力,以便在程式碼中實現無所不在的語言。至關重要的是要指出這個決定並非一成不變。隨著業務的發展和泛在語言的複雜性的增長,實現模式可以升級為更復雜的模式。
上述四種業務領域實現模式是我目前熟悉的模式。
實際上,可能還有其他人,而不是我目前沒有意識到的。
未來可能會發明新的。
它們的實現在各種程式設計範例中有很大不同。
一些最適合某種程式設計範例,但在其他範例中實現起來很複雜。
考慮到所有這些波動性,它們是領域驅動設計的重要組成部分嗎?
由於域驅動設計方法不能涵蓋所有業務領域實現模式,因此可以而且應該從其他來源借用這些技術訣竅。例如,Martin Fowler的“企業應用程式架構模式”一書中描述了事務指令碼,活動記錄甚至域模型。根據定義,依賴“現成”解決方案的能力使它們成為通用子域。是的,甚至是領域模型模式。
領域驅動設計與戰術建模模式的分離可能對DDD的可訪問性和採用率產生積極而深遠的影響。我想詳細說明其中的三個:降低DDD的複雜性,擴大其適用性,以及透過跳過微服務的潮流獲得大量吸引力的能力。
1.降低複雜性
DDD與戰術建模模式的脫鉤將防止許多新人經歷的許多誤解和困難 ,一旦DDD與戰術建模模式分離,它就不再需要任何程式碼樣本。它是一種純系統建模方法,可應用於任何技術堆疊和任何軟體範例。
2.更廣泛的適用性
我非常不同意領域驅動設計應該只應用於複雜專案的觀點。這一概念是由DDD與領域模型模式的強耦合驅動的。一旦我們打破這種耦合,就會開啟一個全新的可能性世界。
溝通:
無論業務領域多麼簡單,如果團隊成員對相同的工件使用不同的術語,遲早他們會發現自己處於意外複雜的境界。無所不在的語言模式阻止了這種情況,並在所有團隊成員之間產生了清晰的溝通媒介。
業務增長:
領域的複雜性增加的頻率高於其複雜性降低的領域。對於所謂的非複雜專案,這種增加的可能性最高。一旦發生這種情況,應重新考慮實施模式決策並使其適應新的複雜性級別。
3.微服務
如今,微服務炙手可熱。擴充套件DDD對更多專案型別的適用性將允許許多基於微服務的解決方案利用寶貴的DDD工具。有界上下文模式提供了一種將系統劃分為一組獨立服務的業務驅動方式,而結構對映是對映服務的拓撲和它們之間的互動模式的好方法。
“你瘋了嗎?”
我不認為我的命題 - 從DDD中取出戰術模式 - 就像它最初聽起來一樣瘋狂。回到了歐洲DDD會議2016年,Eric Evans的自己說,在藍皮書中描述的是一種領域模型實現的方式,但許多誤以為它是領域驅動設計的實現方式。
看,戰術建模模式從來沒有打算成為DDD的唯一方式,但很多人都認為它們是這樣的。它們會產生外來噪音,並使注意力從最重要且獨特的DDD特點上移開。
此外,您不能說領域驅動設計方法處於完美狀態,並且沒有理由改變。不幸的是,它的低採用率不言自明。DDD值得更多關注。藍皮書十多年前就出版了,從那時起,這種方法幾乎沒有改變。我相信它應該改變。不是因為它很糟糕 - 恰恰相反,因為它很棒。但它具有比目前實現的更多,更多的潛力。
最後的想法
我決不打算詆譭戰術建模的重要性。恰恰相反:這個主題值得關注得多。但在它自己的背景下。除了領域模型之外,還有更多的模式,以及更多的方法來實現它們,而不是適合單個DDD書籍。而且,即使在非DDD專案中也可以實現這些模式,即使專案中沒有單一的聚合,專案也可以遵循DDD原則。
相關文章
- ddd-crew/core-domain-charts:幫助查詢DDD核心子域的複雜性分析工具集AI
- DDD之理解複雜度、尊重複雜度、掌控複雜度複雜度
- 六邊形架構:管理複雜性的解決方案架構
- 降低程式碼的圈複雜度——複雜程式碼的解決之道複雜度
- DDD函式程式設計案例:戰勝軟體開發的複雜性! 戰勝方式本身有點複雜哦!函式程式設計
- 現代化配置管理以解決網路複雜性
- 複雜人像背景分割解決方案
- Istio的複雜性揭祕
- 複雜性Complex與複雜Complicated區別 - Sonja
- 如何降低軟體的複雜性?
- DDD中簡單模型比複雜模型更危險模型
- 直面不確定性與非線性的複雜現實:邁向複雜性經濟 - Cilliers
- 害怕軟體的複雜嗎?其實複雜性是必須存在的 - ferd
- 狀態機解決複雜邏輯及使用
- formily-面向中後臺場景的複雜解決方案ORM
- 面向複雜場景的高效能表單解決方案
- 資料複雜性和簡單
- 什麼是 幾何複雜性
- 複雜性是心智殺手 - PhilipK
- 高複雜性下的藍芽安全危機藍芽
- 如何開始複雜性科學的研究? - systemsinnovation
- 外觀模式-簡化子系統的複雜性模式
- 軟體的複雜性正在殺死我們
- 《領域驅動設計:軟體核心複雜性應對之道》讀書筆記筆記
- 張馳諮詢:企業如何利用六西格瑪綠帶培訓解決長期困擾組織的重複性和複雜性問題
- 122 演算法的時間複雜度和空間複雜度詳解演算法時間複雜度
- 科學論文的可複製性、被引用量和創新性的複雜關係
- 學習《領域驅動設計-軟體核心複雜性應對之道》的過程隨筆
- 關於管理軟體複雜性的最佳書籍?
- 複雜性系統的戰略分析要點 -Dave
- 談談Bug引起的複雜性“Bug-O” — OverreactedReact
- Kubernetes會不會被自身的複雜性壓垮?
- 時間複雜度(詳解)時間複雜度
- 圖解時間複雜度圖解時間複雜度
- Slime 2022 展望:把 Istio 的複雜性塞入智慧的黑盒
- Hibernate中不支援複雜子查詢from (select ……)解決方案
- 使用ajax請求傳送複雜的json資料型別,並解決fastjson解析複雜的json資料型別的問題JSON資料型別AST
- 那些年忽略的知識:時間複雜度和空間複雜度詳解時間複雜度