??最近在看一本書碌燕,看到了AGGREGATE(聚合)恒水,AGGREGATE root(聚合根)咒劲。下面解釋下這兩個(gè)的意思顷蟆。
??在具有復(fù)雜關(guān)聯(lián)的模型中诫隅,要想保證對(duì)象更改的一致性是很困難的。不僅互不關(guān)聯(lián)的對(duì)象需要遵守一些固定規(guī)則帐偎,而且緊密關(guān)聯(lián)的各組對(duì)象也要遵守一些固定規(guī)則逐纬。然而,過于謹(jǐn)慎的鎖定機(jī)制又會(huì)導(dǎo)致多個(gè)用戶之間毫無意義地互相干擾削樊,從而使系統(tǒng)不可用[1]豁生。
??借用書上的例子打個(gè)比方,汽車漫贞。汽車由發(fā)動(dòng)機(jī)沛硅、車輪、引擎等組成绕辖。那么我們?cè)趯?shí)際開車等場景中摇肌,人去開車,我們?cè)趺磥斫⑦@個(gè)模型仪际。這個(gè)時(shí)候就用到來一個(gè)聚合的schema围小。也就是說我們需要用一個(gè)抽象來封裝模型中的引用。 就是這個(gè)一組相關(guān)對(duì)象的集合树碱,我們把他稱為數(shù)據(jù)修改的單元肯适。
??每個(gè)AGGREGATE都有一個(gè)根(root)和一個(gè)邊界(boundary)。邊界定義了AGGREGATE的內(nèi)部都有什么成榜。根則是AGGREGATE所包含的一個(gè)特定ENTITY框舔。對(duì)AGGREGATE而言,外部對(duì)象只可以引用根赎婚,而邊界內(nèi)部的對(duì)象之間則可以互相引用刘绣。除根以外的其他ENTITY都有本地標(biāo)識(shí),但這些標(biāo)識(shí)只在AGGREGATE內(nèi)部才需要加以區(qū)別挣输,因?yàn)橥獠繉?duì)象除了根ENTITY之外看不到其他對(duì)象纬凤。
??汽車是一個(gè)具有全局標(biāo)識(shí)的ENTITY:我們需要將這部汽車與世界上所有“其他汽車區(qū)分開(即使是一些非常相似的汽車)。我們可以使用車輛識(shí)別號(hào)來進(jìn)行區(qū)分撩嚼,車輛識(shí)別號(hào)是為每輛新汽車分配的唯一標(biāo)識(shí)符停士。我們可能想通過4個(gè)輪子的位臵跟蹤輪胎的轉(zhuǎn)動(dòng)歷史。我們可能想知道每個(gè)輪胎的里程數(shù)和磨損度完丽。要想知道哪個(gè)輪胎在哪兒恋技,必須將輪胎標(biāo)識(shí)為ENTITY。當(dāng)脫離這輛車的上下文后逻族,我們很可能就不再關(guān)心這些輪胎的標(biāo)識(shí)了蜻底。如果更換了輪胎并將舊輪胎送到回收廠,那么軟件將不再需要跟蹤它們瓷耙,它們會(huì)成為一堆廢舊輪胎中的一部分朱躺。沒有人會(huì)關(guān)心它們的轉(zhuǎn)動(dòng)歷史。更重要的是搁痛,即使輪胎被安在汽車上长搀,也不會(huì)有人通過系統(tǒng)查詢特定的輪胎,然后看看這個(gè)輪胎在哪輛汽車上鸡典。人們只會(huì)在數(shù)據(jù)庫中查找汽車源请,然后臨時(shí)查看一下這部汽車的輪胎情況。因此彻况,汽車是AGGREGATE的根ENTITY谁尸,而輪胎處于這個(gè)AGGREGATE的邊界之內(nèi)。另一方面纽甘,發(fā)動(dòng)機(jī)組上面都刻有序列號(hào)良蛮,而且有時(shí)是獨(dú)立于汽車被跟蹤的。在一些應(yīng)用程序中悍赢,發(fā)動(dòng)機(jī)可以是自己的AGGREGATE的根决瞳。
??通俗異議的理解,就是我們?cè)谠O(shè)計(jì)模型的時(shí)候左权,肯定是引用汽車這個(gè)entity皮胡。而非引用車輪和引擎等,所以car就是一個(gè)聚合根的概念赏迟。而和car相關(guān)的組件屡贺,組成了一個(gè)聚合的概念。
[1]: [美] 埃里克 埃文斯(Eric Evans). “領(lǐng)域驅(qū)動(dòng)設(shè)計(jì) 軟件核心復(fù)雜性應(yīng)對(duì)之道 修訂版.”