戰(zhàn)術(shù)模式簡(jiǎn)介

戰(zhàn)術(shù)模式包含若干構(gòu)造塊模式,以便能夠構(gòu)建有效的領(lǐng)域模型。

戰(zhàn)術(shù)模式嚴(yán)重依賴于領(lǐng)域模型和通用語(yǔ)言,通過(guò)技術(shù)模式將領(lǐng)域模型和通用語(yǔ)言中的概念映射到代碼實(shí)現(xiàn)中。隨著模型的進(jìn)化,代碼實(shí)現(xiàn)也會(huì)進(jìn)行重構(gòu),以更好的體現(xiàn)模型概念。

當(dāng)然,從技術(shù)重構(gòu)角度也會(huì)發(fā)現(xiàn)一些隱含領(lǐng)域知識(shí)(概念),這些新的發(fā)現(xiàn)也會(huì)對(duì)領(lǐng)域模型產(chǎn)生影響。

戰(zhàn)術(shù)模式和通用語(yǔ)言一樣,都工作在特定限界上下文內(nèi),其應(yīng)用邊界受限界上下文的保護(hù)。

1 戰(zhàn)術(shù)模式


戰(zhàn)術(shù)模式的作用是管理復(fù)雜性并確保領(lǐng)域模型中行為的清晰明確??梢允褂眠@些模式來(lái)捕獲和傳遞領(lǐng)域中的概念、關(guān)系、規(guī)則。

每個(gè)構(gòu)造塊模式都具有單一職責(zé):

1. 代表領(lǐng)域中的概念。如實(shí)體、值對(duì)象、領(lǐng)域服務(wù)、領(lǐng)域事件、模塊等;

2. 用于管理對(duì)象的生命周期。如聚合、工廠、倉(cāng)庫(kù)等;

3. 用于集成或跟蹤。領(lǐng)域事件、事件溯源等。

1.1 領(lǐng)域建模模式

他們表述實(shí)現(xiàn)與模型間的關(guān)系,將分析模型綁定到代碼實(shí)現(xiàn)模型。主要用于在代碼中表述模型元素的模式。

1.1.1 實(shí)體

實(shí)體表述的是領(lǐng)域中的概念,它是由身份而不是屬性來(lái)定義的。

實(shí)體的身份標(biāo)識(shí)在生命周期中保持不變,但其屬性會(huì)發(fā)生變化。實(shí)體以身份標(biāo)識(shí)作為唯一憑證,沿著時(shí)間軸,記錄了實(shí)體所有變更事件。

實(shí)體的一個(gè)實(shí)例是產(chǎn)品,一旦產(chǎn)品被生成好,其唯一身份就不會(huì)發(fā)生變化,但是其描述信息、價(jià)格等可以被多次修改。

1.1.2 值對(duì)象

值對(duì)象代表僅通過(guò)數(shù)據(jù)區(qū)分的領(lǐng)域元素和概念。用作模型中元素的描述,它不具有唯一標(biāo)識(shí)。

值對(duì)象不需要唯一標(biāo)識(shí),是因?yàn)樗偸桥c另一個(gè)對(duì)象相關(guān)聯(lián),是在一個(gè)特定上下文中被解析的。通常,其生命周期會(huì)依附于它的關(guān)聯(lián)對(duì)象(在這里,主要是實(shí)體對(duì)象)。

值對(duì)象會(huì)當(dāng)做不變對(duì)象來(lái)設(shè)計(jì),在完成創(chuàng)建后,其狀態(tài)就不能改變了。

值對(duì)象比較好的例子就是現(xiàn)金,你無(wú)需關(guān)系貨幣的身份,只關(guān)心它的價(jià)值。如果有人用一張五美元鈔票交換你的五張一美元鈔票,也不會(huì)改變五美元本身。

1.1.3 領(lǐng)域服務(wù)

在模型中,領(lǐng)域服務(wù)封裝了不能自然建模為值對(duì)象和實(shí)體的邏輯、流程和概念。

它本身不具有身份和狀態(tài)。它的職責(zé)是使用實(shí)體和值對(duì)象編排業(yè)務(wù)邏輯。

領(lǐng)域服務(wù)的一個(gè)好例子是運(yùn)輸成本計(jì)算器,只要給出一組拖運(yùn)貨物和重量,它就能計(jì)算運(yùn)輸成本。

1.1.4 模塊

模塊主要用于組織和封裝相關(guān)概念(實(shí)體、值對(duì)象、領(lǐng)域服務(wù)、領(lǐng)域事件等),這樣可以簡(jiǎn)化對(duì)較大模型的理解。

應(yīng)用模塊可以在領(lǐng)域模型中促成低耦合和搞內(nèi)聚的設(shè)計(jì)。

模塊作用于單個(gè)領(lǐng)域,用于分解模型規(guī)模。子域用于限定領(lǐng)域模型適用范圍(有界上下文)。

1.2 對(duì)象生命周期模式

相對(duì)來(lái)說(shuō),之前提到的模式重點(diǎn)在于表達(dá)領(lǐng)域概念。而對(duì)象生命周期模式,有點(diǎn)側(cè)重于技術(shù),用于表示領(lǐng)域?qū)ο蟮膭?chuàng)建和持久化。

1.2.1 聚合

實(shí)體和值對(duì)象會(huì)相互協(xié)作,形成復(fù)雜的關(guān)聯(lián)關(guān)系。我們需要在滿足不變條件的前提下,將其拆分為一個(gè)個(gè)概念上的整體。

通常,面對(duì)復(fù)雜的對(duì)象關(guān)系,在執(zhí)行領(lǐng)域?qū)ο蟛僮鲿r(shí),難以保證一致性和并發(fā)性。

領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)由聚合模式來(lái)確保操作的一致性和事務(wù)的并發(fā)邊界。大模型會(huì)通過(guò)不變性條件來(lái)劃分,并組成概念化整體的實(shí)體和對(duì)象組,這個(gè)概念化整體便是聚合。

聚合根之間的關(guān)系應(yīng)該通過(guò)保持對(duì)另一個(gè)聚合根 ID 的引用,而非對(duì)對(duì)象本身的引用來(lái)實(shí)現(xiàn)。這一原則有助于保持聚合之間的邊界并避免加載不必要的對(duì)象。

不變性,是在領(lǐng)域模型中強(qiáng)制實(shí)現(xiàn)一致性的規(guī)則。無(wú)論何時(shí)對(duì)實(shí)體或聚合進(jìn)行變更都要應(yīng)用該業(yè)務(wù)規(guī)則。

聚合外部的對(duì)象只能引用另一個(gè)聚合的聚合根,聚合中對(duì)象的任何變更都需要通過(guò)聚合根來(lái)完成。聚合根封裝聚合數(shù)據(jù)并公開(kāi)行為以對(duì)其進(jìn)行修改。

1.2.2 工廠

如果實(shí)體或值對(duì)象的創(chuàng)建過(guò)程非常復(fù)雜,可以將其委托給工廠。工廠會(huì)確保在領(lǐng)域?qū)ο笫褂弥熬蜐M足所有的不變條件。

如果領(lǐng)域?qū)ο蠛芎?jiǎn)單并且不具有特殊的不變條件,可以使用構(gòu)造函數(shù)代替工廠。當(dāng)從持久化存儲(chǔ)中重建領(lǐng)域?qū)ο髸r(shí),也可以使用工廠。

1.2.3 倉(cāng)庫(kù)

倉(cāng)庫(kù)主要用于持久化一個(gè)聚合。將聚合作為原子單元進(jìn)行處理,因此,倉(cāng)庫(kù)操作的最小單元就是聚合,每個(gè)聚合會(huì)對(duì)應(yīng)一個(gè)倉(cāng)庫(kù)。

倉(cāng)庫(kù)是用來(lái)檢索和存儲(chǔ)聚合的機(jī)制,是對(duì)基礎(chǔ)框架的一種抽象。

1.3 其他模式

1.3.1 領(lǐng)域事件

領(lǐng)域事件表示問(wèn)題空間中發(fā)生了一些業(yè)務(wù)人員關(guān)心的事情。主要用于表示領(lǐng)域概念。

使用領(lǐng)域事件主要有以下兩種場(chǎng)景:

記錄模型的變更歷史;

作為跨聚合通信方式。

1.3.2 事件溯源

傳統(tǒng)的僅快照式持久化的一個(gè)替代項(xiàng)便是事件溯源。作為實(shí)體狀態(tài)存儲(chǔ)的替代,可以存儲(chǔ)引發(fā)該狀態(tài)的系列事件。

存儲(chǔ)所有的事件會(huì)提高業(yè)務(wù)的分析能力,不僅可以得知實(shí)體當(dāng)前狀態(tài),還可以得知過(guò)去任意時(shí)點(diǎn)的狀態(tài)。

1.4 總結(jié)

實(shí)體

1. 由唯一標(biāo)識(shí)符定義

2. 標(biāo)識(shí)符在整個(gè)生命周期保存不變

3. 基于標(biāo)識(shí)符進(jìn)行相等性檢查

4. 通過(guò)方法對(duì)屬性進(jìn)行更新

值對(duì)象

1. 描述問(wèn)題域中的概念和特征

2. 不具備身份

3. 不變對(duì)象

領(lǐng)域服務(wù)

1. 處理無(wú)法放置在實(shí)體或值對(duì)象中的領(lǐng)域邏輯

2. 無(wú)唯一標(biāo)識(shí)

3. 無(wú)狀態(tài)服務(wù)

模塊

1. 分解、組織和提高領(lǐng)域模型的可讀性

2. 命名空間,降低耦合,提供模型高內(nèi)聚性

3. 定義領(lǐng)域?qū)ο蠼M間的邊界

4. 封裝比較獨(dú)立的概念,是比聚合、實(shí)體等更高層次的抽象

聚合

1. 將大對(duì)象圖分解成小的領(lǐng)域?qū)ο笕?,降低技術(shù)實(shí)現(xiàn)的復(fù)雜性

2. 表示領(lǐng)域概念,不僅僅是領(lǐng)域?qū)ο蠹?/p>

3. 確定領(lǐng)域一致性邊界,確保領(lǐng)域的可靠性

4. 控制并發(fā)邊界

工廠

1. 將對(duì)象的使用和構(gòu)造分離

2. 封裝復(fù)雜實(shí)體和值對(duì)象的創(chuàng)建邏輯

3. 保障復(fù)雜實(shí)體和值對(duì)象的業(yè)務(wù)完整性

倉(cāng)庫(kù)

1. 是聚合根在內(nèi)存中的集合接口

2. 提供聚合根的檢索和持久化需求

3. 將領(lǐng)域?qū)优c基礎(chǔ)實(shí)施層解耦

4. 通常不用于報(bào)告需求

領(lǐng)域事件

1. 業(yè)務(wù)人員所關(guān)心的事件,是通用語(yǔ)言的一部分

2. 記錄聚合根的所有變更

3. 處理跨聚合的通信需求

事件溯源

1. 使用歷史事件記錄替換快照存儲(chǔ)

2. 提供對(duì)歷史狀態(tài)的查詢

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容