一文搞懂企業(yè)架構(gòu)與DDD的融合
在當今數(shù)字化時代,企業(yè)架構(gòu)(EA)和領(lǐng)域驅(qū)動設(shè)計(DDD)成為了構(gòu)建高效、靈活且可擴展軟件系統(tǒng)的關(guān)鍵方法論。本文將深入探討企業(yè)架構(gòu)TOGAF框架與DDD的融合之道,分析如何通過這種結(jié)合實現(xiàn)從業(yè)務(wù)戰(zhàn)略到技術(shù)實現(xiàn)的無縫對接。
今天聊聊企業(yè)架構(gòu)與DDD如何進行融合。
一、企業(yè)架構(gòu)TOGAF
什么是企業(yè)架構(gòu)TOGAF?
TOGAF(The Open Group Architecture Framework)是一個廣泛采用的企業(yè)架構(gòu)(Enterprise Architecture, EA)框架,由開放組(The Open Group)開發(fā)和維護。
它為組織設(shè)計、規(guī)劃、實施和治理企業(yè)信息架構(gòu)提供了系統(tǒng)化的方法和工具。TOGAF旨在幫助企業(yè)通過高效的架構(gòu)管理,實現(xiàn)業(yè)務(wù)目標、優(yōu)化資源利用和增強靈活性。
TOGAF發(fā)展歷程
如圖展示了從1970年代至2012,企業(yè)架構(gòu)框架和相關(guān)標準的演進歷程,其中包括:
- C4ISR (Command, Control, Communications, Computers, Intelligence, Surveillance and Reconnaissance)
- TAFIM (Technical Architecture Framework for Information Management)
- Zachman Framework
- TOGAF (The Open Group Architecture Framework)
- FEAF (Federal Enterprise Architecture Framework)
- DoDAF (Department of Defense Architecture Framework)以及ArchiMate
在此歷程中,美國各組織和政府部門陸續(xù)制定并優(yōu)化了各自的企業(yè)架構(gòu)方法論和標準,攜手推動了企業(yè)架構(gòu)領(lǐng)域的蓬勃發(fā)展。
1970年啟動的C4ISR計劃為軍事和政府架構(gòu)提供了架構(gòu)理論基礎(chǔ)。
1986年開始研發(fā)的TAFIM和1987年提出的Zachman框架,標志著企業(yè)架構(gòu)實踐開始走向系統(tǒng)化。
1993年,The Open Group成立并著手制定系統(tǒng)標準,隨后在1995年發(fā)布TOGAF 1.0,為商業(yè)領(lǐng)域提供了通用的企業(yè)架構(gòu)開發(fā)框架。
1996年,美國聯(lián)邦政府頒布了里程碑式的克林格·科恩法案,要求政府機構(gòu)(特別是國防部和財政部)采用企業(yè)架構(gòu)理論構(gòu)建IT系統(tǒng)。這項法案為政府機構(gòu)的數(shù)字化轉(zhuǎn)型注入強勁動力,顯著提升了其信息化水平。
1997年,C4ISR升級為AF 2.0版本。1999年,聯(lián)邦企業(yè)架構(gòu)FEAF問世,為政府跨部門整合提供了方法論支持。
進入2000年,TOGAF相繼發(fā)布7.0版本(2001年)和8.0版本(2002年),持續(xù)完善其架構(gòu)開發(fā)方法。同期,政府部門推出DoDAF(2003年發(fā)布1.0版)和FEA相關(guān)方法(2002年起持續(xù)更新),兩者形成了良性互動。
2006至2008年間,F(xiàn)EA-PMO陸續(xù)發(fā)布FTF、EAAF3.0等成果,DoDAF也更新至1.5版。
2009年,The Open Group發(fā)布TOGAF 9,為企業(yè)架構(gòu)領(lǐng)域帶來更系統(tǒng)、更靈活的方法體系。同期,DoDAF在2010年更新至2.02版。
2011年,TOGAF 9.1的發(fā)布進一步優(yōu)化了框架內(nèi)容,使架構(gòu)師能更順暢地應(yīng)用這一方法論。
為滿足日益增長的架構(gòu)可視化和建模需求,The Open Group于2008年接管ArchiMate的研發(fā)工作,并在2012年發(fā)布ArchiMate 2.0,為企業(yè)架構(gòu)的表達和溝通提供了統(tǒng)一的建模語言。
在2022年,TOGAF正式發(fā)布了10版本,這是一次重大更新。TOGAF 10在保持核心框架穩(wěn)定的同時,增強了靈活性和適應(yīng)性,更好地支持數(shù)字化轉(zhuǎn)型和敏捷開發(fā)等現(xiàn)代企業(yè)需求。
TOGAF通過吸收政府機構(gòu)在企業(yè)架構(gòu)實踐中積累的豐富經(jīng)驗,不斷完善和沉淀,最終發(fā)展成為一套通用且系統(tǒng)化的企業(yè)架構(gòu)方法論。
這套方法論不僅適用于政府機構(gòu),還能廣泛應(yīng)用于各類企業(yè)和組織。目前,福布斯前50強企業(yè)中有80%采用TOGAF理論,美國500強企業(yè)中有60%使用這一方法論來優(yōu)化和改進其IT架構(gòu)。
這些數(shù)據(jù)有力地證明了TOGAF在企業(yè)架構(gòu)領(lǐng)域的權(quán)威性和實用價值,同時也凸顯了企業(yè)架構(gòu)理論在現(xiàn)代組織管理和IT治理中的重要地位。
在TOGAF理論中,有四種核心視圖:業(yè)務(wù)架構(gòu)、應(yīng)用架構(gòu)、數(shù)據(jù)架構(gòu)和技術(shù)架構(gòu)。
這四個架構(gòu)視圖構(gòu)成了企業(yè)整體架構(gòu)的核心。雖然各視圖關(guān)注點不同,但它們相互聯(lián)系、相互支撐,共同構(gòu)建了完整的企業(yè)架構(gòu)體系。如圖2-3所示。
業(yè)務(wù)架構(gòu)
業(yè)務(wù)架構(gòu)定義了企業(yè)如何將其業(yè)務(wù)戰(zhàn)略轉(zhuǎn)化為結(jié)構(gòu)化的、全面的、多維度的抽象模型。這些模型包括價值流、業(yè)務(wù)能力、業(yè)務(wù)流程、業(yè)務(wù)對象和組織架構(gòu),同時描述了它們與企業(yè)戰(zhàn)略、產(chǎn)品、策略、項目執(zhí)行以及利益相關(guān)者之間的關(guān)系。
應(yīng)用架構(gòu)
應(yīng)用架構(gòu)描述了企業(yè)內(nèi)應(yīng)用系統(tǒng)的結(jié)構(gòu)、行為和相互關(guān)系,以及這些系統(tǒng)如何支持業(yè)務(wù)流程。它既關(guān)注單個應(yīng)用的架構(gòu)設(shè)計,也注重應(yīng)用系統(tǒng)間的協(xié)作方式,確保所有系統(tǒng)能夠協(xié)同運作,有效支撐企業(yè)目標。
數(shù)據(jù)架構(gòu)
數(shù)據(jù)架構(gòu)明確定義企業(yè)的數(shù)據(jù)管理方式,包括數(shù)據(jù)的收集、存儲、管理和使用。它包括數(shù)據(jù)模型設(shè)計、數(shù)據(jù)庫技術(shù)選型,以及數(shù)據(jù)治理機制的建立與實施。
技術(shù)架構(gòu)
技術(shù)架構(gòu)描述了支撐企業(yè)業(yè)務(wù)、數(shù)據(jù)和應(yīng)用服務(wù)所需的IT基礎(chǔ)設(shè)施和技術(shù)組件結(jié)構(gòu),包括硬件設(shè)施、軟件包、網(wǎng)絡(luò)系統(tǒng)、技術(shù)中間件、通信設(shè)備和計算資源等。
二、企業(yè)架構(gòu)與DDD融合
在前文中,我們已經(jīng)了解了TOGAF企業(yè)架構(gòu)的四大視圖,它們共同構(gòu)成了一個完整的企業(yè)架構(gòu)框架。
接下來,我們將深入探討領(lǐng)域驅(qū)動設(shè)計(DDD)這一重要方法論,以及它如何與企業(yè)架構(gòu)協(xié)同工作來解決復(fù)雜的業(yè)務(wù)問題。
通過了解DDD的核心概念和應(yīng)用方式,我們將看到它如何幫助組織更有效地實現(xiàn)從業(yè)務(wù)戰(zhàn)略到技術(shù)實現(xiàn)的轉(zhuǎn)化。
1. DDD是什么
大多數(shù)人初次接觸領(lǐng)域驅(qū)動設(shè)計(DDD)時,通常會閱讀Eric Evans的《領(lǐng)域驅(qū)動設(shè)計》。這本書被譽為DDD的”圣經(jīng)”,但許多讀者看完后往往感到困惑,覺得內(nèi)容深奧難懂。
DDD旨在實現(xiàn)軟件系統(tǒng)與業(yè)務(wù)的緊密對接,提高開發(fā)效率和質(zhì)量,同時更好地應(yīng)對復(fù)雜性和變化。它將業(yè)務(wù)置于核心地位,通過深入把握領(lǐng)域知識并建立有效的領(lǐng)域模型,來指導軟件設(shè)計和開發(fā)過程。
具體而言,DDD的核心理論包括:
- 分治思想:DDD應(yīng)對復(fù)雜性的核心理念是”分而治之”。它將復(fù)雜的業(yè)務(wù)領(lǐng)域劃分為較小的子域,并在每個子域中明確上下文邊界和核心實體等要素。通過這種系統(tǒng)化的分解、分類和推導過程,最終形成最優(yōu)解決方案。
- 領(lǐng)域建模:DDD的核心在于將業(yè)務(wù)流程抽象化,通過定義領(lǐng)域?qū)嶓w、領(lǐng)域服務(wù)和領(lǐng)域事件等要素來滿足業(yè)務(wù)需求。作為貫穿整個軟件生命周期的方法論,領(lǐng)域模型讓開發(fā)人員、產(chǎn)品經(jīng)理和架構(gòu)師能夠基于統(tǒng)一的模型進行設(shè)計和討論,確保項目始終保持正確方向。
- 架構(gòu)分層:DDD采用清晰的分層架構(gòu),將應(yīng)用程序分為用戶接口層、應(yīng)用層、領(lǐng)域?qū)雍突A(chǔ)設(shè)施層四個主要層次。每一層都具有明確的職責和功能定位。這種分層架構(gòu)使業(yè)務(wù)領(lǐng)域的結(jié)構(gòu)更加清晰、有序。
- 事件驅(qū)動:領(lǐng)域事件是一種跨領(lǐng)域的交互機制,負責在不同模塊之間傳遞信息。通過事件的發(fā)布與訂閱機制,不僅使領(lǐng)域模型更加簡潔,還實現(xiàn)了系統(tǒng)間的低耦合。
2. DDD與架構(gòu)視圖
在4大架構(gòu)視圖(業(yè)務(wù)架構(gòu)、應(yīng)用架構(gòu)、數(shù)據(jù)架構(gòu)、技術(shù)架構(gòu))和DDD的落地過程中,存在2個問題:
- 1. 在業(yè)務(wù)領(lǐng)域劃分環(huán)節(jié),DDD 未提供明確的領(lǐng)域劃分指導,如何進行合理的領(lǐng)域劃分?
- 2. 如何基于業(yè)務(wù)架構(gòu)合理劃分應(yīng)用系統(tǒng)結(jié)構(gòu)和抽象數(shù)據(jù)模型?
業(yè)務(wù)架構(gòu)與DDD方法論的融合能有效解決這兩個問題。
端到端的業(yè)務(wù)流程包含多個業(yè)務(wù)場景,每個場景都需要依賴不同的業(yè)務(wù)能力。通過對業(yè)務(wù)能力進行分層抽象,我們可以識別出各個層次的業(yè)務(wù)能力,這為領(lǐng)域和子域的劃分提供了重要依據(jù)。
在應(yīng)用架構(gòu)設(shè)計階段,需要對應(yīng)用系統(tǒng)結(jié)構(gòu)進行劃分。應(yīng)用是一個可獨立發(fā)布和部署的單元,可提供一個或多個應(yīng)用服務(wù)。在這一過程中,DDD中的限界上下文為劃分應(yīng)用結(jié)構(gòu)提供了有效依據(jù):
- 當業(yè)務(wù)復(fù)雜度高、用戶規(guī)模大且團隊規(guī)模大時,應(yīng)用系統(tǒng)需要拆分為微服務(wù),以實現(xiàn)獨立部署和維護。這種情況下,通常一個限界上下文對應(yīng)一個微服務(wù)。
- 相比之下,當應(yīng)用系統(tǒng)面向企業(yè)內(nèi)部用戶時,由于用戶規(guī)模較小,通常不需要分布式架構(gòu)。這類應(yīng)用宜采用較大顆粒度劃分,將多個相關(guān)的限界上下文整合在一個應(yīng)用中,以減少系統(tǒng)調(diào)用并降低部署復(fù)雜性。
在數(shù)據(jù)模型設(shè)計過程中,DDD的核心概念為數(shù)據(jù)建模提供了重要指導:
- 聚合根定義了數(shù)據(jù)訪問的邊界,作為一組相關(guān)對象的統(tǒng)一入口。
- 領(lǐng)域?qū)嶓w是具有唯一標識的業(yè)務(wù)對象,體現(xiàn)了核心業(yè)務(wù)概念。
- 值對象則是通過其屬性來定義的對象,它不需要概念上的唯一標識。
這些模型元素共同構(gòu)成了一個豐富的業(yè)務(wù)概念框架,指導數(shù)據(jù)模型的設(shè)計,確保數(shù)據(jù)模型能準確反映業(yè)務(wù)領(lǐng)域的復(fù)雜性和內(nèi)在邏輯。通過將這些概念應(yīng)用到數(shù)據(jù)建模中,我們可以創(chuàng)建出更貼合業(yè)務(wù)需求、結(jié)構(gòu)清晰、易于維護的數(shù)據(jù)模型。
3. DDD帶來的價值
DDD為企業(yè)帶來多方面價值,包括提升團隊協(xié)作效率、沉淀業(yè)務(wù)能力和優(yōu)化技術(shù)實現(xiàn)。讓我們從以下關(guān)鍵方面深入了解DDD在實踐中的具體價值與優(yōu)勢:
1、統(tǒng)一語言
業(yè)務(wù)、產(chǎn)品、設(shè)計和技術(shù)團隊使用統(tǒng)一的業(yè)務(wù)術(shù)語進行溝通。無論是日常交流、設(shè)計討論、文檔編寫、圖表繪制還是代碼開發(fā),都采用同一套標準化語言,大幅提升了工作效率。
2、團隊協(xié)作高效
通過系統(tǒng)化地識別和分類需求,將其劃分為清晰的領(lǐng)域、子域和限界上下文,能有效指導團隊分工協(xié)作,避免職責混亂。這種劃分可以防止任務(wù)錯配,例如將原本屬于技術(shù)團隊A的任務(wù),錯誤分配給團隊B。也能避免兩個團隊重復(fù)開發(fā)同一功能,造成資源浪費。
3、領(lǐng)域能力沉淀
業(yè)務(wù)能力的可復(fù)用性是衡量軟件架構(gòu)設(shè)計質(zhì)量的關(guān)鍵指標。通過建立業(yè)務(wù)知識與模型之間的統(tǒng)一映射關(guān)系,并持續(xù)驗證和優(yōu)化這些模型,我們能確保它們準確反映當前業(yè)務(wù)狀況。這種方式讓業(yè)務(wù)知識能夠通過模型得到有效傳承,讓團隊新成員能夠準確理解業(yè)務(wù)邏輯。
4、業(yè)務(wù)與技術(shù)有效融合
傳統(tǒng)開發(fā)方式過分注重數(shù)據(jù)庫表結(jié)構(gòu)設(shè)計,卻忽略了業(yè)務(wù)模型。DDD則采用相反的策略——先抽象業(yè)務(wù)領(lǐng)域模型,再據(jù)此設(shè)計數(shù)據(jù)庫結(jié)構(gòu)。這種方法讓業(yè)務(wù)與技術(shù)真正融合,克服了傳統(tǒng)開發(fā)中只關(guān)注數(shù)據(jù)層和接口層的局限性。
4. DDD的缺點
盡管DDD在構(gòu)建復(fù)雜軟件模型方面具有顯著優(yōu)勢,但這套方法論也存在一些明顯的局限性。
1.學習曲線陡峭
DDD包含了限界上下文、實體、值對象、聚合和領(lǐng)域事件等一系列復(fù)雜概念和實踐。掌握這些概念需要投入大量時間和精力,對初學者或習慣簡單開發(fā)模式的團隊來說尤其具有挑戰(zhàn)性。
2.過度設(shè)計的風險
團隊在運用DDD概念時,容易陷入過度設(shè)計的陷阱。為了完美實現(xiàn)領(lǐng)域模型,可能會構(gòu)建過于復(fù)雜的層次結(jié)構(gòu)和關(guān)系,導致”充血模型”泛濫,甚至演變成”高血壓模型”。這不僅增加了項目的復(fù)雜度,還會顯著提高開發(fā)和維護成本。
3.實施成本和時間
DDD的正確實施需要投入大量時間和資源進行領(lǐng)域建模,同時要求與業(yè)務(wù)方保持密切溝通。這種特性在項目初期可能會放慢開發(fā)進度,特別是對需要快速交付的短期項目來說,會帶來較大壓力。
4.不適用于所有項目
DDD主要適用于業(yè)務(wù)邏輯復(fù)雜、需要長期發(fā)展和維護的大型軟件項目。對于業(yè)務(wù)簡單或生命周期較短的項目,使用DDD反而會帶來不必要的復(fù)雜性和額外投入,因此并不適合。
5. DDD的核心概念
為DDD的完整設(shè)計流程,DDD的核心理念由兩個關(guān)鍵部分構(gòu)成:戰(zhàn)略設(shè)計和戰(zhàn)術(shù)設(shè)計。
戰(zhàn)略設(shè)計專注于宏觀層面的領(lǐng)域分析和邊界劃分,而戰(zhàn)術(shù)設(shè)計則著重于微觀層面的領(lǐng)域模型實現(xiàn)。
領(lǐng)域和子域
領(lǐng)域指的是特定的業(yè)務(wù)范圍或問題域。在運用DDD解決業(yè)務(wù)問題時,會將業(yè)務(wù)領(lǐng)域細分,并將問題限定在特定邊界內(nèi)。在這個邊界內(nèi),DDD建立領(lǐng)域模型,并通過代碼實現(xiàn)這些模型來解決相應(yīng)的業(yè)務(wù)問題。這種方法的核心思想是”分而治之”。
領(lǐng)域可以進一步劃分為子域,每個子域?qū)?yīng)一個更小的問題域或業(yè)務(wù)范圍。DDD本質(zhì)上是一種處理復(fù)雜領(lǐng)域的設(shè)計方法,它通過持續(xù)細分將復(fù)雜的業(yè)務(wù)簡化,使其更易理解和實現(xiàn)。
這種方法類似于公司的組織結(jié)構(gòu)。以一家互聯(lián)網(wǎng)創(chuàng)業(yè)公司為例,它包含產(chǎn)品研發(fā)部、市場營銷部、客戶服務(wù)部等部門。領(lǐng)域就像公司的一個大部門,比如產(chǎn)品研發(fā)部,負責產(chǎn)品的設(shè)計與研發(fā),主導公司的產(chǎn)品方向和策略。
子域則類似于大部門下的小團隊。例如,產(chǎn)品研發(fā)部門下設(shè)有產(chǎn)品團隊、前端團隊、后端團隊和測試團隊。每個子域團隊專注于具體職能任務(wù),共同支撐上級部門的目標。這種分層確保每個部門、團隊和小組都有明確的職責,讓公司運作更加有序高效。
同理,在DDD中,通過劃分領(lǐng)域和子域,軟件研發(fā)團隊能更好地理解和處理復(fù)雜的業(yè)務(wù)需求。各個層級雖關(guān)注不同細節(jié),但通過協(xié)作完成整個系統(tǒng)的開發(fā)。
核心域、通用域和支撐域
在領(lǐng)域劃分過程中,子域可根據(jù)其重要性和功能屬性分為核心域、通用域和支撐域。
核心域決定產(chǎn)品和公司的核心競爭力,通用域是多個子域共用的功能域,支撐域則負責支持業(yè)務(wù)運轉(zhuǎn),但既不直接影響核心競爭力,也不包含通用功能。
劃分這三類域的主要目標是聚焦關(guān)鍵事項。通過這種劃分,公司能夠清晰區(qū)分不同子域的重要性,從而更有效地分配資源和關(guān)注度,在激烈的市場競爭中保持優(yōu)勢。
以電商領(lǐng)域為例,主要子域包括商品、訂單、用戶、支付、物流、客服和數(shù)據(jù)分析。
在電商領(lǐng)域中,核心域直接關(guān)系到業(yè)務(wù)的核心價值和主要收入,主要包括:
- 商品子域:負責管理商品信息,包括展示、分類、搜索和推薦等功能,構(gòu)成電商平臺的基礎(chǔ)。
- 訂單子域:負責訂單的創(chuàng)建、修改、查詢和狀態(tài)管理等,是交易流程的關(guān)鍵環(huán)節(jié)。
- 支付子域:負責支付交易處理,包括支付方式管理、狀態(tài)跟蹤和渠道對接等,是完成交易的核心環(huán)節(jié)。
- 物流子域:負責商品配送管理,包括物流公司對接和配送狀態(tài)跟蹤等,確保商品準確送達消費者。
- 客服子域:提供客戶支持服務(wù),包括咨詢和投訴處理等,解決用戶使用過程中的問題。
通用域支持多個業(yè)務(wù)領(lǐng)域的運作:
- 用戶子域:負責用戶信息管理,包括注冊、登錄和資料編輯等。雖然用戶管理在多個系統(tǒng)中都很重要,但在電商系統(tǒng)中主要是支持核心業(yè)務(wù)流程。
支撐域為核心域提供支持,主要涉及決策分析支撐:
- 數(shù)據(jù)分析子域:負責業(yè)務(wù)數(shù)據(jù)分析,包括用戶行為和銷售數(shù)據(jù)分析等,為決策制定和業(yè)務(wù)優(yōu)化提供支持。
限界上下文
在DDD中,限界上下文(Bounded Context)是對一個特定業(yè)務(wù)邊界內(nèi)的概念和規(guī)則進行統(tǒng)一管理的范圍。它將領(lǐng)域模型的適用范圍、業(yè)務(wù)語言以及規(guī)則約束都界定在一個相對獨立的“上下文”中,以避免概念在不同業(yè)務(wù)場景間的混用或沖突。
在一個復(fù)雜系統(tǒng)里,不同業(yè)務(wù)子域可能對同一個名詞或?qū)嶓w有各自的含義和處理邏輯。若不加區(qū)分,容易出現(xiàn)命名混亂、邏輯沖突等問題。通過劃分限界上下文,可以讓團隊在各自的上下文內(nèi)部使用統(tǒng)一的“業(yè)務(wù)語言”,保持模型的一致性與完整性。
在限界上下文之間,通常還需要定義清晰的協(xié)作關(guān)系和數(shù)據(jù)交換方式。例如通過上下文映射(Context Map)來確定上下文之間的接口、依賴以及團隊之間的協(xié)同策略。這樣可以最大程度減少跨上下文溝通帶來的復(fù)雜度,也讓每個上下文能獨立演進。
例如在電商平臺中,“訂單”一詞在“支付”上下文和“倉儲”上下文可能包含不同的信息和規(guī)則。支付上下文關(guān)注付款狀態(tài)、交易金額等,倉儲上下文關(guān)注庫存、物流等。把它們劃分到不同的限界上下文,可以讓每個上下文的“訂單”實體都針對自己需要的領(lǐng)域規(guī)則進行優(yōu)化,避免混淆。
實體
實體是具有唯一標識的對象。即使實體的其他屬性發(fā)生變化,只要其標識(如ID)保持不變,它就仍被視為同一個實體。實體在系統(tǒng)中代表持續(xù)存在的業(yè)務(wù)對象。實體具有以下關(guān)鍵特征:
- 標識性:每個實體都有唯一標識,通常通過ID或編碼實現(xiàn)。
- 連續(xù)性:實體在其生命周期內(nèi)可能經(jīng)歷多種狀態(tài)變化,但標識始終保持不變。
- 區(qū)分性:即使兩個實體的所有非標識屬性完全相同,只要標識不同,它們就是不同的實體。
以電商平臺的訂單系統(tǒng)為例,每個訂單實體都有唯一的訂單號。即使訂單的屬性(如商品、數(shù)量)或狀態(tài)(如已付款、已發(fā)貨)發(fā)生變化,只要訂單號相同,它就仍然是同一個訂單。
值對象
值對象是描述事物狀態(tài)或?qū)傩缘膶ο?,它沒有唯一標識,且通常不可變。值對象用于表示對象的某個特征,無需獨立身份,僅為更完整地描述實體。值對象的關(guān)鍵特征包括:
- 無標識:值對象沒有唯一標識。它們通過屬性值定義,通常作為實體的一部分存在。
- 不可變性:一旦創(chuàng)建,值對象的屬性就不應(yīng)被修改。若需改變,應(yīng)創(chuàng)建新的值對象。
- 替換性:由于沒有唯一標識,值對象可被具有相同屬性的另一個值對象完全替代。
舉例來說,訂單中的收貨地址(包含省、市、街道和郵編)是值對象,因為它沒有獨立標識,僅描述了一個地理位置。
同樣,訂單的支付金額(包括數(shù)字和貨幣單位)也是值對象,因為它只描述了價值的數(shù)量,本身不需要獨立存在。
聚合與聚合根
在DDD中,聚合是一個核心概念,它幫助開發(fā)者管理復(fù)雜度,尤其是在處理大量相關(guān)對象時。聚合由緊密關(guān)聯(lián)的實體和值對象組成,是修改和保存數(shù)據(jù)的基本單位。每個聚合都有一個倉庫,用于保存其數(shù)據(jù)。
聚合包含一個聚合根和上下文邊界。邊界根據(jù)業(yè)務(wù)需求和內(nèi)聚原則,定義了聚合應(yīng)包含的實體和值對象。聚合之間保持松耦合,這種設(shè)計自然地實現(xiàn)了微服務(wù)的高內(nèi)聚、低耦合特性。
在DDD分層架構(gòu)中,聚合是領(lǐng)域?qū)拥囊徊糠?。領(lǐng)域?qū)涌砂鄠€聚合,共同實現(xiàn)核心業(yè)務(wù)邏輯。實體在聚合內(nèi)采用充血模型實現(xiàn)業(yè)務(wù)能力,確保業(yè)務(wù)邏輯的高內(nèi)聚。
跨多個實體的業(yè)務(wù)邏輯通過領(lǐng)域服務(wù)實現(xiàn),而跨多個聚合的業(yè)務(wù)邏輯則通過應(yīng)用服務(wù)來實現(xiàn)。
聚合根可以類比為部門負責人,既是實體,也是聚合”部門”的管理者。作為實體,它擁有自身的屬性和業(yè)務(wù)行為,執(zhí)行特定的業(yè)務(wù)邏輯。作為管理者,它在聚合內(nèi)部會協(xié)調(diào)實體和值對象,完成業(yè)務(wù)邏輯。
而在聚合間的協(xié)作中,聚合根充當對外接口人。它通過自身ID關(guān)聯(lián)其他聚合,接收外部請求。訪問聚合內(nèi)其他實體時,必須先經(jīng)過聚合根,再導航至內(nèi)部實體,外部對象無法直接訪問聚合內(nèi)的實體。
領(lǐng)域服務(wù)
領(lǐng)域服務(wù)用于處理實體、值對象或聚合無法獨立完成的業(yè)務(wù)邏輯。它專門封裝跨實體或跨聚合的復(fù)雜邏輯。領(lǐng)域服務(wù)僅包含純業(yè)務(wù)邏輯,不直接涉及數(shù)據(jù)庫操作、消息隊列等具體技術(shù)實現(xiàn)。
需要將領(lǐng)域服務(wù)與應(yīng)用服務(wù)區(qū)分開來。應(yīng)用服務(wù)位于應(yīng)用層,主要負責調(diào)用外部系統(tǒng)和協(xié)調(diào)多個領(lǐng)域?qū)ο蟮牧鞒?。而領(lǐng)域服務(wù)則專注于領(lǐng)域內(nèi)部的業(yè)務(wù)規(guī)則計算。領(lǐng)域服務(wù)具有以下特征:
- 跨聚合或跨實體邏輯:當業(yè)務(wù)邏輯需要使用多個聚合的數(shù)據(jù)或操作,適合將其放在獨立的領(lǐng)域服務(wù)中。
- 聚焦業(yè)務(wù)邏輯:理想情況下,領(lǐng)域服務(wù)應(yīng)只依賴領(lǐng)域模型中的接口或抽象模型,而不關(guān)注具體的數(shù)據(jù)庫、網(wǎng)絡(luò)調(diào)用等基礎(chǔ)設(shè)施細節(jié)。這樣可以保持領(lǐng)域邏輯的純凈性和可測試性。
領(lǐng)域事件
在DDD中,領(lǐng)域事件(Domain Event)是一個核心概念。它表示業(yè)務(wù)領(lǐng)域中發(fā)生的重要事件,這些事件由具體業(yè)務(wù)行為觸發(fā),例如用戶注冊、訂單生成或支付完成。領(lǐng)域事件反映了業(yè)務(wù)流程中的關(guān)鍵狀態(tài)變更,對流程的進展具有重大影響。
領(lǐng)域事件在軟件開發(fā)中發(fā)揮著關(guān)鍵作用,其重要性主要體現(xiàn)在以下幾個方面:
1)微服務(wù)解耦
領(lǐng)域事件是微服務(wù)架構(gòu)中實現(xiàn)服務(wù)解耦的有效工具。通過將直接調(diào)用轉(zhuǎn)換為異步消息傳遞,它降低了服務(wù)間的緊密依賴,提高了系統(tǒng)的靈活性和可維護性。
2)數(shù)據(jù)一致性保障
在分布式系統(tǒng)中,數(shù)據(jù)一致性維護是一項重大挑戰(zhàn)。領(lǐng)域事件通過記錄業(yè)務(wù)操作,使系統(tǒng)即使在發(fā)生故障時也能通過重放事件來恢復(fù)狀態(tài),從而增強了系統(tǒng)的容錯能力。
3)系統(tǒng)可追溯性
領(lǐng)域事件為系統(tǒng)提供了完整的歷史變更記錄。通過存儲和追蹤這些事件,我們能夠清晰地了解系統(tǒng)狀態(tài)的演變過程,這對故障排查、系統(tǒng)優(yōu)化和業(yè)務(wù)分析都具有重要價值。
4)促進業(yè)務(wù)理解
作為領(lǐng)域模型的重要組成部分,領(lǐng)域事件反映了業(yè)務(wù)領(lǐng)域中的關(guān)鍵變化。通過識別和捕獲這些事件,開發(fā)者能夠更深入地理解業(yè)務(wù)規(guī)則和邏輯,同時加強研發(fā)人員與業(yè)務(wù)人員之間的有效溝通與協(xié)作。
6. DDD分層架構(gòu)
DDD分層架構(gòu)是對傳統(tǒng)三層架構(gòu)的優(yōu)化升級,形成了四層結(jié)構(gòu)。如圖2-6所示,這四層從上到下分別是:用戶接口層、應(yīng)用層、領(lǐng)域?qū)雍突A(chǔ)設(shè)施層。
1、用戶接口層
負責管理系統(tǒng)與用戶的交互。它接收用戶輸入(如表單數(shù)據(jù)或操作),并將應(yīng)用層的處理結(jié)果通過Web頁面或移動應(yīng)用界面呈現(xiàn)給用戶。
2、應(yīng)用層
應(yīng)用層處理業(yè)務(wù)用例和流程相關(guān)的操作,理論上不應(yīng)包含業(yè)務(wù)規(guī)則或邏輯。它位于領(lǐng)域?qū)又希撠焻f(xié)調(diào)多個聚合的服務(wù)和領(lǐng)域?qū)ο?,完成服?wù)的編排與組合。
應(yīng)用層需保持簡潔,開發(fā)時應(yīng)避免在此放置領(lǐng)域?qū)拥臉I(yè)務(wù)邏輯。若應(yīng)用層過于復(fù)雜,可能導致領(lǐng)域模型失焦,使微服務(wù)退化為傳統(tǒng)三層架構(gòu),致使業(yè)務(wù)邏輯混亂。
3、領(lǐng)域?qū)?/strong>
領(lǐng)域?qū)邮窍到y(tǒng)的核心,負責封裝業(yè)務(wù)概念、邏輯和規(guī)則。它執(zhí)行核心業(yè)務(wù)邏輯,并通過各種校驗確保業(yè)務(wù)的準確性。領(lǐng)域?qū)影酆细?、實體、值對象和領(lǐng)域服務(wù)等領(lǐng)域模型對象。
4、基礎(chǔ)設(shè)施層
基礎(chǔ)設(shè)施層為其他層提供技術(shù)支持和基礎(chǔ)服務(wù),包括數(shù)據(jù)庫、文件系統(tǒng)、消息中間件和緩存等。
本文由人人都是產(chǎn)品經(jīng)理作者【湯師爺】,微信公眾號:【架構(gòu)師湯師爺】,原創(chuàng)/授權(quán) 發(fā)布于人人都是產(chǎn)品經(jīng)理,未經(jīng)許可,禁止轉(zhuǎn)載。
題圖來自Unsplash,基于 CC0 協(xié)議。
- 目前還沒評論,等你發(fā)揮!
