《Patterns, Principles, and Pract》— chapter14 Introducing the Domain Modeling Building Blocks
在該章節(jié)里面有如下內(nèi)容:
- 從戰(zhàn)術(shù)的角度創(chuàng)建高效的面向?qū)ο蟮念I(lǐng)域模型
- 介紹value objects, entities, domain services, modules ,通過這些為domain和行為建模
- 回顧生命周期模型:aggregate, factory, repository
- 新興模式關(guān)于事件源和領(lǐng)域事件
Tactical patterns
ddd的作用是控制系統(tǒng)復(fù)雜度,確保領(lǐng)域模型簡潔。模型用來表達(dá)模型的含義,關(guān)系,邏輯。
每個用于搭建框架的模塊,都有自己單一的職責(zé);在領(lǐng)域模型里面等價于entity或value object。不受生命周期中factory,repository的干擾。
可以使用組件,創(chuàng)建domain模型。
?
Patterns to Model Your Domain
以下模式代表問題域的策略和邏輯。表達(dá)了對象,模型規(guī)則,并將分析模型的細(xì)節(jié)綁定到代碼實現(xiàn)模型。
如下介紹的是代碼中的模型元素。
Entities
entity的概念是由身份定義,而不是屬性。即使entity包含整個生命周期,它的屬性可能改變。entity的責(zé)任是負(fù)責(zé)定義跟它行為類似的類。在代碼里面,可以通過繼承來實現(xiàn)這個類。(個人感覺,entities有點類似平時用的實體,或者實體的父類,不僅僅有屬性,還有豐富的方法表示它的行為)
Value Objects
value objects為代表包含domain特性的元素或者概念;它們用來描述模型;用來描述模型里面的元素;它們不需要獨特的身份。因為value objects 在模型中,沒有概念上的認(rèn)同,它們被定義為屬性,這些屬性決定了它的行為。value objects不需要身份,因為它經(jīng)常在特定背景下跟其他的對象相關(guān)聯(lián)。舉個例子,有個order entity 使用value objects 代表order的address, items, courier information。它不需要特定的身份,它內(nèi)容直接關(guān)聯(lián)order。order的address如果不跟order關(guān)聯(lián) 起來,完全沒有意義。value objecs基于orders的屬性,就像實體自帶equal檢查。
因為value objects根據(jù)他們的特性定義,value objects被認(rèn)為一成不變的;也就是說,一旦被構(gòu)造創(chuàng)建,它們將永遠(yuǎn)不會更改它的狀態(tài)。一個好的例子就是money,不需要區(qū)分口袋里面錢的多少。不需要關(guān)注貨幣的身份,只需要關(guān)注它的值和它代表的含義。如果有人想跟你交換一個5$,事實仍舊擁有5$。當(dāng)然,在現(xiàn)實生活中,錢可以擁有獨特的身份id, 但是領(lǐng)域模型并沒有影響真實的生活。相反,它是對它的抽象,旨在滿足問題域內(nèi)用例的需求。
Domain Service
Domain services封裝domain的邏輯和概念,既不是entity,也不是value object。Domain services 既沒有身份,也沒有狀態(tài);它的職責(zé)是編排調(diào)度entity和value object的邏輯。
Modules
用它組織和封裝相關(guān)概念(entities和value objects)。用來簡化對大的domain models的理解。modules讓開發(fā)者很快閱讀,理解domain model,方便查找。(其實就是放entities和value objects的文件夾)
LifeCycle Patterns
這個模式用于創(chuàng)建,持久化 domain objects。
Aggregates
entities和value objects共同構(gòu)成domain model,并滿足不變性。在處理對象的大型互連關(guān)聯(lián)時,通常難以確保對域?qū)ο髨?zhí)行操作時的一致性和并發(fā)性。
domain driven design 通過Aggregates 確保一致性和定義事務(wù)實時性。 大的models被分割成不變的部分,以及分為實體和價值對象的集合,這些實體和價值對象被視為概念整體。
多個aggregate通過id之間互相關(guān)聯(lián),既創(chuàng)建了關(guān)聯(lián),也避免了冗余不必要的大對象。
Factories
如果創(chuàng)建entity或者value object非常復(fù)雜,需要委托給factory的構(gòu)造函數(shù)。factory確保所有的不變在domain object創(chuàng)建之前初始化完成。如果domain object很簡單,沒有什么特別的規(guī)則對于有效的構(gòu)造函數(shù),優(yōu)先采用構(gòu)造函數(shù)而不是factory。可以使用factories重復(fù)創(chuàng)建domain objects從持久存儲里面。
Repositories
領(lǐng)域模型需要需要持久化方法。因為aggregate被視為自動單元,必須持久化通過完整的aggregate來更新。repository 是底層持久存儲的抽象,允許創(chuàng)建模型,無需考慮架構(gòu)層面的東西。repository是用來糾正和持久化aggregates的機(jī)制。
Emerging Patterns
Domain Events
domain events表示業(yè)務(wù)關(guān)注的,在問題域發(fā)生的一些事情。可以通過events去記錄模型改變, 通過審計的方式。常用于aggregate root 的行為作用域aggregate root的周邊。其他的aggregates 將聽從這個events,并按照指示變化。
Event Sourcing
事件源是傳統(tǒng)的持久層快照的一種當(dāng)下流行的取代方式。替代了存儲狀態(tài)到數(shù)據(jù)庫,存儲事件能關(guān)聯(lián)到狀態(tài)。對狀態(tài)的存儲,增加了業(yè)務(wù)的可分析性。不僅僅知道當(dāng)下entity的狀態(tài),而且可以知道state在過去時候的任意狀態(tài)。storing events, not snapshots。
可以查詢在任意時刻的domain model的狀態(tài),因為可以找到相關(guān)事件發(fā)生對狀態(tài)的改變。
?
The Salient Points
總結(jié)
以上是生活随笔為你收集整理的《Patterns, Principles, and Pract》— chapter14 Introducing the Domain Modeling Building Blocks的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql in 宕机_一条SQL引起的
- 下一篇: VMS(VELO) tips[转载]