聚合(根)、实体、值对象精炼思考总结
1.??????聚合根、實(shí)體、值對(duì)象的區(qū)別?
從標(biāo)識(shí)的角度:
聚合根具有全局的唯一標(biāo)識(shí),而實(shí)體只有在聚合內(nèi)部有唯一的本地標(biāo)識(shí),值對(duì)象沒(méi)有唯一標(biāo)識(shí),不存在這個(gè)值對(duì)象或那個(gè)值對(duì)象的說(shuō)法;
從是否只讀的角度:
聚合根除了唯一標(biāo)識(shí)外,其他所有狀態(tài)信息都理論上可變;實(shí)體是可變的;值對(duì)象是只讀的;
從生命周期的角度:
聚合根有獨(dú)立的生命周期,實(shí)體的生命周期從屬于其所屬的聚合,實(shí)體完全由其所屬的聚合根負(fù)責(zé)管理維護(hù);值對(duì)象無(wú)生命周期可言,因?yàn)橹皇且粋€(gè)值;
2.??????聚合根、實(shí)體、值對(duì)象對(duì)象之間如何建立關(guān)聯(lián)?
聚合根到聚合根:通過(guò)ID關(guān)聯(lián);
聚合根到其內(nèi)部的實(shí)體,直接對(duì)象引用;
聚合根到值對(duì)象,直接對(duì)象引用;
實(shí)體對(duì)其他對(duì)象的引用規(guī)則:1)能引用其所屬聚合內(nèi)的聚合根、實(shí)體、值對(duì)象;2)能引用外部聚合根,但推薦以ID的方式關(guān)聯(lián),另外也可以關(guān)聯(lián)某個(gè)外部聚合內(nèi)的實(shí)體,但必須是ID關(guān)聯(lián),否則就出現(xiàn)同一個(gè)實(shí)體的引用被兩個(gè)聚合根持有,這是不允許的,一個(gè)實(shí)體的引用只能被其所屬的聚合根持有;
值對(duì)象對(duì)其他對(duì)象的引用規(guī)則:只需確保值對(duì)象是只讀的即可,推薦值對(duì)象的所有屬性都盡量是值對(duì)象;
3.??????如何識(shí)別聚合與聚合根?
明確含義:一個(gè)Bounded Context(界定的上下文)可能包含多個(gè)聚合,每個(gè)聚合都有一個(gè)根實(shí)體,叫做聚合根;
識(shí)別順序:先找出哪些實(shí)體可能是聚合根,再逐個(gè)分析每個(gè)聚合根的邊界,即該聚合根應(yīng)該聚合哪些實(shí)體或值對(duì)象;最后再劃分Bounded Context;
聚合邊界確定法則:根據(jù)不變性約束規(guī)則(Invariant)。不變性規(guī)則有兩類:1)聚合邊界內(nèi)必須具有哪些信息,如果沒(méi)有這些信息就不能稱為一個(gè)有效的聚合;2)聚合內(nèi)的某些對(duì)象的狀態(tài)必須滿足某個(gè)業(yè)務(wù)規(guī)則;
例子分析1:訂單模型
Order(一?個(gè)訂單)必須有對(duì)應(yīng)的客戶信息,否則就不能稱為一個(gè)有效的Order;同理,Order對(duì)OrderLineItem有不變性約束,Order也必須至少有一個(gè)OrderLineItem(一條訂單明細(xì)),否則就不能稱為一個(gè)有效的Order;另外,Order中的任何OrderLineItem的數(shù)量都不能為0,否則認(rèn)為該OrderLineItem是無(wú)效?的,同時(shí)可以推理出Order也可能是無(wú)效的。因?yàn)槿绻试S一個(gè)OrderLineItem的數(shù)量為0的話,就意味著可能會(huì)出現(xiàn)所有?OrderLineItem的數(shù)量都為0,這就導(dǎo)致整個(gè)Order的總價(jià)為0,這是沒(méi)有任何意義的,是不允許的,從而導(dǎo)致Order無(wú)效;所以,必須要求?Order中所有的OrderLineItem的數(shù)量都不能為0;那么現(xiàn)在可以確定的是Order必須包含一些OrderLineItem,那么應(yīng)該是通?過(guò)引用的方式還是ID關(guān)聯(lián)的方式來(lái)表達(dá)這種包含關(guān)系呢?這就需要引出另外一個(gè)問(wèn)題,那就是先要分析出是OrderLineItem是否是一個(gè)獨(dú)立的聚合?根。回答了這個(gè)問(wèn)題,那么根據(jù)上面的規(guī)則就知道應(yīng)該用對(duì)象引用還是用ID關(guān)聯(lián)了。那么OrderLineItem是否是一個(gè)獨(dú)立的聚合根呢?因?yàn)榫酆细?味著是某個(gè)聚合的根,而聚合有代表著某個(gè)上下文邊界,而一個(gè)上下文邊界又代表著某個(gè)獨(dú)立的業(yè)務(wù)場(chǎng)景,這個(gè)業(yè)務(wù)場(chǎng)景操作的唯一對(duì)象總是該上下文邊界內(nèi)的聚合?根。想到這里,我們就可以想想,有沒(méi)有什么場(chǎng)景是會(huì)繞開(kāi)訂單直接對(duì)某個(gè)訂單明細(xì)進(jìn)行操作的。也就是在這種情況下,我們?是以O(shè)rderLineItem為主體,完全是在面向OrderLineItem在做業(yè)務(wù)操作。有這種業(yè)務(wù)場(chǎng)景嗎?沒(méi)有,我們對(duì)?OrderLineItem的所有的操作都是以O(shè)rder為出發(fā)點(diǎn),我們總是會(huì)面向整個(gè)Order在做業(yè)務(wù)操作,比如向Order中增加明細(xì),修改?Order的某個(gè)明細(xì)對(duì)應(yīng)的商品的購(gòu)買(mǎi)數(shù)量,從Order中移除某個(gè)明細(xì),等等類似操作,我們從來(lái)不會(huì)從OrderlineItem為出發(fā)點(diǎn)去執(zhí)行一些業(yè)?務(wù)操作;另外,從生命周期的角度去理解,那么OrderLineItem離開(kāi)Order沒(méi)有任何存在的意義,也就是說(shuō)OrderLineItem的生命周?期是從屬于Order的。所以,我們可以很確信的回答,OrderLineItem是一個(gè)實(shí)體。
例子分析2:帖子與回復(fù)的模型,做個(gè)對(duì)比,以便更好地理解。
不?變性分析:帖子和回復(fù)之間有不變性規(guī)則嗎?似乎我們只知道一點(diǎn)是肯定的,那就是帖子和回復(fù)之間的關(guān)系,1:N的關(guān)系;除了這個(gè)之外,我們看不到任何其他的?不變性規(guī)則。那么這個(gè)1:N的對(duì)象關(guān)系是一種不變性規(guī)則嗎?不是!首先,一個(gè)帖子可以沒(méi)有任何回復(fù),帖子也不對(duì)它的回復(fù)有任何規(guī)則約束,它甚至都不知道自?己有多少個(gè)回復(fù);再次,發(fā)表了一個(gè)回復(fù)和帖子也沒(méi)有任何關(guān)系;其次,發(fā)表回復(fù)對(duì)帖子沒(méi)有任何改變;從業(yè)務(wù)場(chǎng)景的角度去分析,我們有發(fā)表帖子的場(chǎng)景,有發(fā)表?回復(fù)的場(chǎng)景。當(dāng)在發(fā)表回復(fù)的時(shí)候,是以回復(fù)為主體的,帖子只是這個(gè)回復(fù)里所包含的必要信息,用于說(shuō)明這個(gè)回復(fù)是對(duì)哪個(gè)帖子的回復(fù)。這些都說(shuō)明帖子和回復(fù)之?間找不出任何不變性約束的規(guī)則;因?yàn)樘雍突貜?fù)都有各自獨(dú)立的業(yè)務(wù)場(chǎng)景的需要,所以可以很容易理解它們都是獨(dú)立的聚合根;那也很容易知道該如何建立他們之?間的關(guān)聯(lián)了,但是我們要盡量減少關(guān)聯(lián),所以只保留回復(fù)對(duì)帖子的關(guān)聯(lián)即可;帖子沒(méi)有任何必要去保存一個(gè)回復(fù)的ID的列表;那么你可能會(huì)說(shuō),當(dāng)我刪除一個(gè)帖子?后,回復(fù)應(yīng)該是沒(méi)有存在的意義的呀?不對(duì),不是沒(méi)有存在的意義,而是刪除了帖子后導(dǎo)致了回復(fù)對(duì)帖子的關(guān)聯(lián)信息的缺失,導(dǎo)致數(shù)據(jù)不一致。這是因?yàn)樘雍突貜?fù)?之間有一種必然的聯(lián)系(1:N),回復(fù)一定會(huì)有一個(gè)對(duì)應(yīng)的帖子;但是回復(fù)有其自己的生命周期,不應(yīng)該隨著帖子的刪除而級(jí)聯(lián)刪除。這種情況下,如果你刪除了?帖子,就導(dǎo)致回復(fù)也成為了一條無(wú)效的數(shù)據(jù);所以,我們絕對(duì)不允許刪除任何聚合根,因?yàn)橐坏┠銊h除了聚合根,那就意味著與該聚合根相關(guān)的其他任何聚合根都會(huì)?有外鍵引用缺失的問(wèn)題,會(huì)導(dǎo)致整個(gè)領(lǐng)域模型數(shù)據(jù)的不一致;所以,永遠(yuǎn)都不要?jiǎng)h除聚合根;
總結(jié)
以上是生活随笔為你收集整理的聚合(根)、实体、值对象精炼思考总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 过年家里摆供都买和摆什么水果
- 下一篇: 领域驱动设计之聚合与聚合根实例一