真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

[譯文]DomainDrivenDesignReference(三)——模型驅(qū)動(dòng)設(shè)計(jì)的構(gòu)建模

本書(shū)是Eric Evans對(duì)他自己寫(xiě)的《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)-軟件核心復(fù)雜性應(yīng)對(duì)之道》的一本字典式的參考書(shū),可用于快速查找《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》中的諸多概念及其簡(jiǎn)明解釋。

創(chuàng)新互聯(lián)公司為客戶提供專業(yè)的成都做網(wǎng)站、網(wǎng)站建設(shè)、程序、域名、空間一條龍服務(wù),提供基于WEB的系統(tǒng)開(kāi)發(fā). 服務(wù)項(xiàng)目涵蓋了網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站程序開(kāi)發(fā)、WEB系統(tǒng)開(kāi)發(fā)、微信二次開(kāi)發(fā)、成都手機(jī)網(wǎng)站制作等網(wǎng)站方面業(yè)務(wù)。

 

 

其它本系列其它文章地址:

[譯文]Domain Driven Design Reference(一)—— 前言

[譯文]Domain Driven Design Reference(二)—— 讓模型起作用

[譯文]Domain Driven Design Reference(三)—— 模型驅(qū)動(dòng)設(shè)計(jì)的構(gòu)建模塊

 

 

Ⅱ.模型驅(qū)動(dòng)設(shè)計(jì)的構(gòu)建模塊

這些模式根據(jù)領(lǐng)域驅(qū)動(dòng)設(shè)計(jì),廣泛地推行了面向?qū)ο笤O(shè)計(jì)的最佳實(shí)踐。他們指導(dǎo)決策來(lái)提煉模型,并使模型和實(shí)現(xiàn)保持一致,每一個(gè)都增強(qiáng)了其他的有效性。仔細(xì)制定模型元素的細(xì)節(jié)為開(kāi)發(fā)人員提供了一個(gè)穩(wěn)定的平臺(tái),從中可以探索模型并使其與實(shí)現(xiàn)保持緊密聯(lián)系。

 

分層架構(gòu)

在面向?qū)ο蟮某绦蛑?,用戶界面,?shù)據(jù)庫(kù)和其他支持代碼通常會(huì)直接寫(xiě)入業(yè)務(wù)對(duì)象。額外的業(yè)務(wù)邏輯被嵌入在UI部件和數(shù)據(jù)庫(kù)腳本的行為中。發(fā)生這種情況是因?yàn)樵诙唐趦?nèi),這樣做是最簡(jiǎn)單的方法。

當(dāng)與領(lǐng)域相關(guān)的代碼通過(guò)如此大量的其他代碼被擴(kuò)散時(shí),變得非常難以理解和推理。UI的表面變化實(shí)際上可以改變業(yè)務(wù)邏輯。要更改業(yè)務(wù)規(guī)則,可能需要仔細(xì)跟蹤UI代碼,數(shù)據(jù)庫(kù)代碼或其他程序元素。實(shí)現(xiàn)一致的、模型驅(qū)動(dòng)的對(duì)象變得不切實(shí)際。自動(dòng)化測(cè)試變得難以進(jìn)行。由于每個(gè)活動(dòng)都涉及到所有的技術(shù)和邏輯,程序必須保持非常簡(jiǎn)單,否則就無(wú)法理解。

因此:

隔離領(lǐng)域模型和業(yè)務(wù)邏輯的表達(dá)形式,并消除對(duì)基礎(chǔ)架構(gòu),用戶界面甚至非業(yè)務(wù)邏輯的應(yīng)用程序邏輯的依賴。將一個(gè)復(fù)雜的程序分成多個(gè)層。在每個(gè)層次內(nèi)開(kāi)發(fā)一個(gè)內(nèi)聚的設(shè)計(jì),并且僅依賴于下面的層。遵循標(biāo)準(zhǔn)的建筑模式,為上面的分層提供松散的耦合。將所有與領(lǐng)域模型相關(guān)的代碼集中在一個(gè)層中,并將其與用戶界面,應(yīng)用程序和基礎(chǔ)設(shè)施的代碼隔離。領(lǐng)域?qū)ο鬀](méi)有顯示自己,存儲(chǔ)自己,管理應(yīng)用程序任務(wù)等等的職責(zé),可以集中在表達(dá)領(lǐng)域模型上。這使得一個(gè)模型能夠發(fā)展到足夠豐富,足夠清晰,能夠捕獲必要的業(yè)務(wù)知識(shí)并將其付諸實(shí)踐。

這里的關(guān)鍵目標(biāo)是隔離。 諸如“六邊形架構(gòu)”之類的相關(guān)模式可以起到允許我們的領(lǐng)域模型表現(xiàn)避免依賴和引用其他系統(tǒng)問(wèn)題,甚至更好的效果。

 

實(shí)體

許多對(duì)象代表了一個(gè)連續(xù)的具有身份標(biāo)識(shí)的主線,貫穿整個(gè)生命周期,盡管其屬性可能會(huì)改變。一些對(duì)象不是主要由它們的屬性定義的。它們代表了貫穿時(shí)間并經(jīng)??缭讲煌宫F(xiàn)形式的主線的身份標(biāo)識(shí)。有時(shí)這樣的對(duì)象必須與另一個(gè)對(duì)象匹配,即使屬性不同。錯(cuò)誤的身份可能導(dǎo)致數(shù)據(jù)損壞。

因此:

當(dāng)一個(gè)對(duì)象被它的身份而不是它的屬性所區(qū)分時(shí),把它作為它在模型中定義的要點(diǎn)。保持簡(jiǎn)單的類定義,并關(guān)注生命周期的連續(xù)性和身份標(biāo)識(shí)。

  定義一個(gè)區(qū)分每個(gè)對(duì)象的方法,而不管它的形式或歷史。 對(duì)通過(guò)屬性調(diào)用匹配對(duì)象的需求保持警惕。定義一個(gè)保證為每個(gè)對(duì)象產(chǎn)生唯一結(jié)果的操作,可能通過(guò)附加一個(gè)保證唯一的符號(hào)。這種標(biāo)識(shí)手段可能來(lái)自外部,也可能是由系統(tǒng)創(chuàng)建的任意標(biāo)識(shí)符,但必須符合模型中的身份標(biāo)識(shí)區(qū)別。

  模型必須定義什么是同樣的事情。

(又稱參考對(duì)象)

 

值對(duì)象

有些對(duì)象描述或計(jì)算事物的一些特征。

許多對(duì)象沒(méi)有概念上的身份標(biāo)識(shí)。

跟蹤實(shí)體的身份標(biāo)識(shí)至關(guān)重要。但將身份標(biāo)識(shí)附加到其他對(duì)象可能會(huì)傷害系統(tǒng)性能,增加分析工作,并使所有對(duì)象看起來(lái)都一模一樣。軟件設(shè)計(jì)是一個(gè)復(fù)雜的持續(xù)戰(zhàn)斗。我們必須作出區(qū)分,以便只有在必要時(shí)才進(jìn)行特殊處理。

然而,如果我們把這種類型的對(duì)象看作是缺少身份的話,那么我們并沒(méi)有在我們的工具箱或詞匯中添加太多東西。實(shí)際上,這些對(duì)象具有自己的特點(diǎn),對(duì)模型本身也有意義。 這些是描述事物的對(duì)象。

因此:

當(dāng)您只關(guān)心模型元素的屬性和邏輯時(shí),將其歸類為值對(duì)象。使其表達(dá)它傳達(dá)的屬性的含義并賦予它相關(guān)的功能。將值對(duì)象視為不可變的。使所有操作是不依賴任何可變狀態(tài)的無(wú)副作用函數(shù)。不要給值對(duì)象任何身份標(biāo)識(shí),并避免保留實(shí)體所必需的設(shè)計(jì)復(fù)雜性。

 

領(lǐng)域事件

領(lǐng)域?qū)<谊P(guān)心的事情發(fā)生了。一個(gè)實(shí)體負(fù)責(zé)跟蹤其狀態(tài)和規(guī)定其生命周期的規(guī)則。但是,如果你需要知道狀態(tài)變化的實(shí)際原因,這通常是不明確的,并且可能很難解釋系統(tǒng)如何實(shí)現(xiàn)它。審計(jì)線索可以允許跟蹤,但通常不適合用于程序本身的邏輯。實(shí)體的變化歷史可以允許訪問(wèn)先前的狀態(tài),但忽略這些變化的含義,以便對(duì)信息的任何操作都是程序性的,并且經(jīng)常被拋出領(lǐng)域?qū)印?/p>

分布式系統(tǒng)中出現(xiàn)了一系列獨(dú)特但又相關(guān)的問(wèn)題。分布式系統(tǒng)的狀態(tài)在任何時(shí)候都不能保持完全一致。我們始終保持聚合內(nèi)部一致,而異步的進(jìn)行其他更改。當(dāng)更改在網(wǎng)絡(luò)的節(jié)點(diǎn)間傳播時(shí),可能很難解決無(wú)序或來(lái)自不同來(lái)源的多個(gè)更新。

因此:

將關(guān)于領(lǐng)域中活動(dòng)的模型信息視為一系列離散事件。將每個(gè)事件表示為一個(gè)領(lǐng)域?qū)ο?。這些不同于系統(tǒng)事件,它們反映了軟件本身的活動(dòng),雖然通常系統(tǒng)事件與領(lǐng)域事件相關(guān)聯(lián)或者作為領(lǐng)域事件的響應(yīng)的一部分,或者作為將領(lǐng)域事件的信息攜帶到系統(tǒng)中的一種方式。

  領(lǐng)域事件是領(lǐng)域模型的一個(gè)完整的部分,是領(lǐng)域中發(fā)生的事情的表示形式。忽略不相關(guān)的領(lǐng)域活動(dòng),同時(shí)明確領(lǐng)域?qū)<蚁胍櫥蛘弑煌ㄖ氖录?,或者與其他模型對(duì)象中的狀態(tài)改變相關(guān)聯(lián)的事件。

在分布式系統(tǒng)中,實(shí)體的狀態(tài)可以從特定節(jié)點(diǎn)的當(dāng)前已知的領(lǐng)域事件中推斷出來(lái),從而在沒(méi)有關(guān)于整個(gè)系統(tǒng)的完整信息的情況下得到相關(guān)的模型。

領(lǐng)域事件通常是不可變的,因?yàn)樗鼈兪沁^(guò)去的某種事物的記錄。除了對(duì)事件的描述之外,領(lǐng)域事件通常包含事件發(fā)生時(shí)間的時(shí)間戳以及事件涉及的實(shí)體的身份標(biāo)識(shí)。此外,領(lǐng)域事件通常具有單獨(dú)的時(shí)間戳,指示事件何時(shí)進(jìn)入系統(tǒng)以及使其進(jìn)入系統(tǒng)的人的身份標(biāo)識(shí)。如果有用,領(lǐng)域事件的身份標(biāo)識(shí)可以基于這些屬性的一些集合。所以,例如,如果同一個(gè)事件的兩個(gè)實(shí)例到達(dá)一個(gè)節(jié)點(diǎn),則它們可以被識(shí)別為相同的。

 

服務(wù)

有時(shí)候,這不是一回事。領(lǐng)域的一些概念由模型作為對(duì)象是不自然的。強(qiáng)制所需的領(lǐng)域功能成為實(shí)體或者值對(duì)象的職責(zé),要么篡改基于模型的對(duì)象的定義,要么添加無(wú)意義的虛擬對(duì)象。

因此:

當(dāng)領(lǐng)域中的重要流程或轉(zhuǎn)換不是實(shí)體或值對(duì)象的自然職責(zé)時(shí),添加一個(gè)操作到模型中作為一個(gè)單獨(dú)的接口同時(shí)聲明為一個(gè)服務(wù)。定義一個(gè)服務(wù)契約,一組關(guān)于與服務(wù)交互的聲明。用一個(gè)特定限界上下文的通用語(yǔ)言來(lái)陳述這些聲明。給服務(wù)一個(gè)名字,這也成為通用語(yǔ)言的一部分。

 

模塊

每個(gè)人都使用模塊,但很少將它們視為模型的完整部分。代碼被分解成各種類別,從技術(shù)架構(gòu)的各個(gè)方面到開(kāi)發(fā)人員的工作任務(wù)。即使是做了很多重構(gòu)的開(kāi)發(fā)人員也傾向于使用項(xiàng)目早期構(gòu)思的模塊。

耦合和凝聚力的解釋傾向于使它們聽(tīng)起來(lái)像是技術(shù)指標(biāo),根據(jù)關(guān)聯(lián)和相互作用的分布進(jìn)行機(jī)械的判斷。然而,這不僅僅是將代碼劃分為模塊,還包括概念。一個(gè)人一次可以思考多少事情是有限的(因此耦合度低),不連貫的想法片段很難被理解為一個(gè)無(wú)差別的想法(因此具有很高的內(nèi)聚性)。

因此:

選擇能夠講述系統(tǒng)故事的模塊,并包含一系列內(nèi)聚的概念。讓模塊名稱成為通用語(yǔ)言的一部分。模塊是模型的一部分,它們的名稱應(yīng)反映對(duì)領(lǐng)域的洞察。

這通常會(huì)導(dǎo)致模塊之間的低耦合,但是如果它不尋找一種方法來(lái)改變模型來(lái)分解概念,或者是一個(gè)被忽視的概念,它可能是一個(gè)能夠以有意義的方式將元素組合在一起的模塊的基礎(chǔ)。在可以被獨(dú)立地理解和推理的概念上尋求低耦合。根據(jù)高層領(lǐng)域概念對(duì)模型進(jìn)行細(xì)化直到它被劃分,并將相應(yīng)的代碼解耦。

 

聚合

要保證復(fù)雜關(guān)聯(lián)模型中對(duì)象變化的一致性是很困難的。他們能夠被是概念上的構(gòu)成部分的其它對(duì)象的變化所掩蓋。在多個(gè)服務(wù)器之間分發(fā)對(duì)象或設(shè)計(jì)異步事務(wù)時(shí)會(huì)出現(xiàn)類似的問(wèn)題。

因此:

將實(shí)體和值對(duì)象集中到聚合中并在周?chē)x邊界。選擇一個(gè)實(shí)體作為每個(gè)聚合的根,并允許外部對(duì)象僅保留對(duì)根的引用(對(duì)內(nèi)部成員的引用僅在一個(gè)操作中返回出去才能使用)。定義聚合的屬性和不變量作為一個(gè)整體,并將這個(gè)約束的責(zé)任賦予根【這里指的是聚合根】或某種指定的框架機(jī)制。

使用相同的聚合邊界來(lái)管理事務(wù)和分配。

在一個(gè)聚合邊界內(nèi),同步地應(yīng)用一致性規(guī)則。 跨越邊界,異步地處理更新。

在一臺(tái)服務(wù)器上共同維護(hù)一個(gè)聚合。允許不同的聚合在節(jié)點(diǎn)間分配。

如果這些設(shè)計(jì)決策沒(méi)有受到聚合邊界的良好指導(dǎo),請(qǐng)重新考慮模型。是領(lǐng)域的場(chǎng)景正在暗示著一個(gè)重要的新見(jiàn)解嗎?這種改變通常會(huì)提高模型的表現(xiàn)力和靈活性,并解決事務(wù)和分配問(wèn)題。

 

倉(cāng)儲(chǔ)

查詢通用語(yǔ)言表達(dá)的聚合。

可遍歷的關(guān)聯(lián)的擴(kuò)散只用于找到弄亂模型的東西。在成熟模型中,查詢經(jīng)常表達(dá)領(lǐng)域概念。然而查詢可能會(huì)導(dǎo)致問(wèn)題。

應(yīng)用大多數(shù)數(shù)據(jù)庫(kù)訪問(wèn)基礎(chǔ)架構(gòu)的純粹技術(shù)復(fù)雜性迅速吞噬了客戶端代碼,導(dǎo)致開(kāi)發(fā)人員陷入了領(lǐng)域?qū)?,使得模型無(wú)關(guān)緊要。

查詢框架可能會(huì)封裝大部分的技術(shù)復(fù)雜性,使開(kāi)發(fā)人員能夠以更自動(dòng)化或聲明的方式從數(shù)據(jù)庫(kù)中提取所需的確切數(shù)據(jù),但這只能解決一部分問(wèn)題。

不受約束的查詢可能會(huì)從對(duì)象中拉出特定的字段,違反封裝,或從聚合內(nèi)部實(shí)例化幾個(gè)特定的對(duì)象,讓聚合根變得充滿變數(shù)并使這些對(duì)象無(wú)法執(zhí)行領(lǐng)域模型的規(guī)則。領(lǐng)域邏輯移入查詢和應(yīng)用程序?qū)哟a,實(shí)體和值對(duì)象變成僅僅為數(shù)據(jù)容器。

因此:

對(duì)于需要全局訪問(wèn)的每種聚合類型,創(chuàng)建一個(gè)服務(wù),它可以提供所有聚合根類型的對(duì)象的在一個(gè)內(nèi)存集合中的錯(cuò)覺(jué)。通過(guò)一個(gè)大家都知道的全局接口設(shè)置訪問(wèn)。提供添加和刪除對(duì)象的方法,這將封裝實(shí)際數(shù)據(jù)往數(shù)據(jù)存儲(chǔ)中的插入或刪除。提供基于對(duì)領(lǐng)域?qū)<矣幸饬x的標(biāo)準(zhǔn)來(lái)選擇對(duì)象的方法。返回完全實(shí)例化的對(duì)象或?qū)傩灾捣蠗l件的對(duì)象集合,從而封裝實(shí)際的存儲(chǔ)和查詢技術(shù),或者返回給予以惰性的方式完全實(shí)例化的聚合的幻覺(jué)的代理。僅為實(shí)際需要直接訪問(wèn)的聚合根提供倉(cāng)儲(chǔ)。保持應(yīng)用程序邏輯專注于模型,委托所有的對(duì)象存儲(chǔ)和訪問(wèn)給倉(cāng)儲(chǔ)。

 

工廠

當(dāng)創(chuàng)建一個(gè)完整的,內(nèi)部一致的聚合或者一個(gè)大值對(duì)象變得復(fù)雜或者顯示太多的內(nèi)部結(jié)構(gòu)時(shí),工廠提供封裝。一個(gè)對(duì)象的創(chuàng)建本身可以是一個(gè)主要的操作,但是復(fù)雜的組裝操作不適合由創(chuàng)建的對(duì)象來(lái)承擔(dān)。將這些職責(zé)結(jié)合起來(lái)可能會(huì)產(chǎn)生難以理解并且難看的設(shè)計(jì)。讓客戶端直接組裝會(huì)混亂客戶端的設(shè)計(jì),破壞組裝對(duì)象或集合的封裝,并且過(guò)度地將客戶端耦合到所創(chuàng)建對(duì)象的實(shí)現(xiàn)中【舉個(gè)例子,這里的客戶端可以理解成應(yīng)用層或者UI層】。

因此:

將創(chuàng)建復(fù)雜對(duì)象和聚合實(shí)例的責(zé)任轉(zhuǎn)移到單獨(dú)的對(duì)象上,這個(gè)對(duì)象本身可能在域模型中沒(méi)有職責(zé),但仍然是領(lǐng)域設(shè)計(jì)的一部分。提供一個(gè)封裝所有復(fù)雜程序集的接口,并且不要求客戶端引用實(shí)例化對(duì)象的具體類。將創(chuàng)建一個(gè)完整的聚合作為一部分,強(qiáng)制實(shí)施它的不變性。創(chuàng)建一個(gè)復(fù)雜的值對(duì)象,可能是在將元素與構(gòu)建器組合后。

 

 

作者:Zachary_Fan
出處:http://www.cnblogs.com/Zachary-Fan/p/DDDReference3.html

 

 

如果你想及時(shí)得到個(gè)人自寫(xiě)文章的消息推送,歡迎掃描下面的二維碼~。

[譯文]Domain Driven Design Reference(三)—— 模型驅(qū)動(dòng)設(shè)計(jì)的構(gòu)建模


分享文章:[譯文]DomainDrivenDesignReference(三)——模型驅(qū)動(dòng)設(shè)計(jì)的構(gòu)建模
本文網(wǎng)址:http://weahome.cn/article/jphoio.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部