從0開發(fā)3D引擎(補(bǔ)充):介紹領(lǐng)域驅(qū)動設(shè)計(jì)
我們使用領(lǐng)域驅(qū)動設(shè)計(jì)(英文縮寫為DDD)的方法來設(shè)計(jì)引擎,在引擎開發(fā)的過程中,領(lǐng)域模型會不斷地演化。
本文介紹本系列使用的領(lǐng)域驅(qū)動設(shè)計(jì)思想的相關(guān)概念和知識點(diǎn),給出了相關(guān)的資料。
上一篇博文
從0開發(fā)3D引擎(七):學(xué)習(xí)Reason語言
下一篇博文
從0開發(fā)3D引擎(八):準(zhǔn)備“搭建引擎雛形”
概覽
下面的資料粗略地介紹了DDD的相關(guān)知識點(diǎn):
領(lǐng)域驅(qū)動設(shè)計(jì)學(xué)習(xí)輸出
領(lǐng)域驅(qū)動設(shè)計(jì)(DDD)部分核心概念的個人理解
系統(tǒng)學(xué)習(xí)資料
相關(guān)資料為:
DDD理論學(xué)習(xí)系列
為什么用DDD
參考領(lǐng)域驅(qū)動設(shè)計(jì)學(xué)習(xí)輸出:
- DDD 幫助解決微服務(wù)拆分困境
- DDD 幫助應(yīng)對系統(tǒng)復(fù)雜性
- DDD 幫助統(tǒng)一語言
相關(guān)概念
領(lǐng)域模型
領(lǐng)域模型包括領(lǐng)域服務(wù)、實(shí)體、值對象
相關(guān)資料為:
領(lǐng)域驅(qū)動設(shè)計(jì)之實(shí)體、值對象、領(lǐng)域服務(wù)
DDD 領(lǐng)域驅(qū)動設(shè)計(jì)學(xué)習(xí)(五)- 實(shí)體/值對象/領(lǐng)域服務(wù)
領(lǐng)域模型的分類
可分為四類:
- 失血模型
- 貧血模型
- 充血模型
- 脹血模型
相關(guān)資料為:
關(guān)于領(lǐng)域模型(貧血模型,充血模型)
架構(gòu)
DDD主要有分層、六邊形、洋蔥這幾種架構(gòu)。其中,六邊形和洋蔥架構(gòu)都運(yùn)用了依賴倒置,比較類似。
架構(gòu)資料:
DDD 領(lǐng)域驅(qū)動設(shè)計(jì)學(xué)習(xí)(四)- 架構(gòu)(分層/六邊形/RESTful)
分層架構(gòu)資料:
DDD分層架構(gòu)的三種模式
洋蔥架構(gòu)資料:
The Onion Architecture
數(shù)據(jù)
相關(guān)概念參考領(lǐng)域驅(qū)動設(shè)計(jì)系列(2)淺析VO、DTO、DO、PO的概念、區(qū)別和用處:
VO(View Object):視圖對象,用于展示層,它的作用是把某個指定頁面(或組件)的所有數(shù)據(jù)封裝起來。
DTO(Data Transfer Object):數(shù)據(jù)傳輸對象,這個概念來源于J2EE的設(shè)計(jì)模式,原來的目的是為了EJB的分布式應(yīng)用提供粗粒度的數(shù)據(jù)實(shí)體,以減少分布式調(diào)用的次數(shù),從而提高分布式調(diào)用的性能和降低網(wǎng)絡(luò)負(fù)載,但在這里,我泛指用于展示層與服務(wù)層之間的數(shù)據(jù)傳輸對象。
DO(Domain Object):領(lǐng)域?qū)ο螅褪菑默F(xiàn)實(shí)世界中抽象出來的有形或無形的業(yè)務(wù)實(shí)體。
PO(Persistent Object):持久化對象,它跟持久層(通常是關(guān)系型數(shù)據(jù)庫)的數(shù)據(jù)結(jié)構(gòu)形成一一對應(yīng)的映射關(guān)系,如果持久層是關(guān)系型數(shù)據(jù)庫,那么,數(shù)據(jù)表中的每個字段(或若干個)就對應(yīng)PO的一個(或若干個)屬性。
相關(guān)資料為:
領(lǐng)域驅(qū)動設(shè)計(jì)系列(2)淺析VO、DTO、DO、PO的概念、區(qū)別和用處
通用語言,又叫統(tǒng)一語言
相關(guān)資料為:
DDD 領(lǐng)域驅(qū)動設(shè)計(jì)學(xué)習(xí)(一)- 領(lǐng)域模型和統(tǒng)一語言
重讀領(lǐng)域驅(qū)動設(shè)計(jì)——如何說好一門通用語言
事件風(fēng)暴
我們使用事件風(fēng)暴作為DDD的開始,得到通用語言。
相關(guān)資料為:
領(lǐng)域驅(qū)動設(shè)計(jì): 服務(wù)邊界劃分
使用事件風(fēng)暴探索業(yè)務(wù)全景
領(lǐng)域和子域
相關(guān)資料為:
DDD理論學(xué)習(xí)系列(2)-- 領(lǐng)域
限界上下文
相關(guān)資料為:
DDD理論學(xué)習(xí)系列(3)-- 限界上下文
上下文映射圖
參考DDD—上下文映射圖,上下文之間有下面的關(guān)系:
- 合作關(guān)系(PS):如果兩個限界上下文的團(tuán)隊(duì)要么一起成功,要么一起失敗,此時他們需要建立起一種合作關(guān)系。他們需要協(xié)調(diào)開發(fā)計(jì)劃和集成管理。
- 共享內(nèi)核(SK):對模型和代碼的共享將產(chǎn)生一種緊密的依賴性,對于設(shè)計(jì)來說,這種依賴性可好可壞。我們需要為共享的部分模型指定一個顯式的邊界,并保持共享內(nèi)核的小型化。共享內(nèi)核具有特殊的狀態(tài),在沒有與另一個團(tuán)隊(duì)協(xié)商的情況下,這種狀態(tài)是不能改變的。我們應(yīng)該引入一種持續(xù)集成過程來保證共享內(nèi)核與通用語言的一致性。
- 客戶方——供應(yīng)方開發(fā)(CSD):當(dāng)兩個團(tuán)隊(duì)處于一種上游-下游關(guān)系時,上游團(tuán)隊(duì)可能獨(dú)立于下游團(tuán)隊(duì)完成開發(fā),此時下游團(tuán)隊(duì)開發(fā)可能會受到影響。因此,在上游團(tuán)隊(duì)的計(jì)劃中,我們應(yīng)該顧及到下游團(tuán)隊(duì)的需求。
- 遵奉者(C):在存在上游-下游關(guān)系時,如果上游團(tuán)隊(duì)已經(jīng)沒有動力提供下游團(tuán)隊(duì)之所需,下游團(tuán)隊(duì)便孤軍無助了。只能盲目地使用上游團(tuán)隊(duì)的模型。
- 防腐層(ACL):在集成兩個良好的限界上下文時,翻譯層可能很簡單,甚至可以很優(yōu)雅地實(shí)現(xiàn)。但是,當(dāng)共享內(nèi)核、合作關(guān)系或客戶方-供應(yīng)方關(guān)系無法順利實(shí)現(xiàn)時,此時的翻譯將變得復(fù)雜。對于下游客戶來說,你需要根據(jù)自己的領(lǐng)域模型創(chuàng)建一個單獨(dú)的層,該層作為上游系統(tǒng)的委派向你的系統(tǒng)提供功能。防腐層通過已有的接口與其他系統(tǒng)交互,而其他系統(tǒng)只需要做很小的修改,甚至無須修改。在防腐層內(nèi)部,它在你自己的模型和他方模型之間進(jìn)行翻譯轉(zhuǎn)化。
- 開放主機(jī)服務(wù)(OHS):定義一種協(xié)議,讓你的子系統(tǒng)通過該協(xié)議來訪問你的服務(wù)。你需要將該協(xié)議公開,這樣任何與你集成的人都可以使用該協(xié)議。在有新的集成需求時,你應(yīng)該對協(xié)議進(jìn)行改進(jìn)或者擴(kuò)展。對于一些特殊的需求,你可以采用一次性的翻譯予以處理,這樣可以保持協(xié)議的簡單性和連貫性。
- 發(fā)布語言(PL):在兩個限界上下文之間翻譯模型需要一種公用的語言。此時你應(yīng)該使用一種發(fā)布出來的共享語言來完成集成交流。發(fā)布語言通常與開放主機(jī)一起使用。
- 另謀他路(S):在確定需求時,我們應(yīng)該做到堅(jiān)持到底。如果兩套功能沒有顯著的關(guān)系,那么它們也可以被完全解耦的。聲明兩個限界上下文之間不存在任何關(guān)系,這樣使得開發(fā)者去尋找簡單的、專門的方法來解決問題。
相關(guān)資料為:
看看上下文映射的清晰視圖
DDD—上下文映射圖
聚合
聚合Aggregate就是一組相關(guān)對象的集合,我們把它作為數(shù)據(jù)修改和訪問的單元。一個聚合包含聚合根、實(shí)體和值對象。
相關(guān)資料為:
領(lǐng)域模型:聚合、聚合根
領(lǐng)域驅(qū)動設(shè)計(jì)-聚合
在UML中,需要區(qū)分聚合關(guān)系和組合關(guān)系,詳見:
淺談UML中的聚合與組合
服務(wù)
服務(wù)包括應(yīng)用服務(wù)、領(lǐng)域服務(wù)、基礎(chǔ)服務(wù)。
基礎(chǔ)服務(wù)是指基礎(chǔ)設(shè)施中提供的服務(wù),通常用于操作外部,如發(fā)送email等。
應(yīng)用服務(wù)和領(lǐng)域服務(wù)的相關(guān)資料為:
如何分辨應(yīng)用服務(wù)與領(lǐng)域服務(wù)
領(lǐng)域驅(qū)動設(shè)計(jì)DDD之領(lǐng)域服務(wù)
倉庫
我們使用倉庫來操作PO。
相關(guān)資料為:
DDD理論學(xué)習(xí)系列(12)-- 倉儲
DDD應(yīng)用示例
相關(guān)示例為:
領(lǐng)域驅(qū)動設(shè)計(jì)在互聯(lián)網(wǎng)業(yè)務(wù)開發(fā)中的實(shí)踐
基于 DDD 的微服務(wù)設(shè)計(jì)和開發(fā)實(shí)戰(zhàn)
浙公網(wǎng)安備 33010602011771號