<<Domain Driven Design>> 和<< Patterns of Enterprise Application Architecture >>,令Domain 這個(gè)詞很火,也引起了廣泛爭(zhēng)論。我這里也亂談一把。
什么是領(lǐng)域模型(Domain Model ) 我以為Domain分兩個(gè)含義:Domain Object和Domain Service。那么什么樣的系統(tǒng)是面向Domain的系統(tǒng),一個(gè)Domain Object和普通的符合OO原則的對(duì)象有什么區(qū)別;一個(gè)Domain Service和普通的Facade或者M(jìn)anager對(duì)象有什么區(qū)別。
概念上,一個(gè)Domain Object和普通的符合OO原則的對(duì)象有聲明區(qū)別:Domain Object是業(yè)務(wù)意義上,承載了業(yè)務(wù)數(shù)據(jù)(我據(jù)此認(rèn)為所有Domain Object是有狀態(tài)對(duì)象),從本質(zhì)上說(shuō)它直接來(lái)源于現(xiàn)實(shí)世界,沒(méi)有技術(shù)層次上的考慮,“符合OO原則的對(duì)象”是用OO方法分析得到的,是基于計(jì)算機(jī)領(lǐng)域技術(shù)的(這樣的對(duì)象可以是無(wú)狀態(tài)的);但反過(guò)來(lái),符合OO的對(duì)象不一定反應(yīng)DOMAIN 的OBJECT。
技術(shù)上,Domain Object是指那些包含需要被透明持久化的屬性,以及相關(guān)業(yè)務(wù)邏輯(體現(xiàn)在Use Case中)的POJO。仔細(xì)觀察舊的系統(tǒng),發(fā)現(xiàn)Transaction Script還是Table Module操作都的是來(lái)自數(shù)據(jù)庫(kù)(或者其它持久化通道)的數(shù)據(jù),Transaction的業(yè)務(wù)邏輯是零星片斷。而Table Module其操作的是同一類業(yè)務(wù)數(shù)據(jù)集合,包含明顯的數(shù)據(jù)庫(kù)痕跡。而一個(gè)Domain Object包含了這些需要被持久化的業(yè)務(wù)數(shù)據(jù),同時(shí)還包含了與之相關(guān)所有業(yè)務(wù)操作,并且有自己的繼承體系。Martin Fowler認(rèn)為有了這些就可以稱為是一個(gè)Domain Object,因此在其PoEAA中的ORM包含了一些不透明的持久化方案。我認(rèn)為一個(gè)真正的Domain Object需要一個(gè)透明持久化。
Domain Service包含的商業(yè)邏輯包含了兩部分:流程邏輯和控制邏輯。
1. 業(yè)務(wù)領(lǐng)域的流程邏輯(Business Process)。指一系列的業(yè)務(wù)行為,包括Domain Object的屬性更新;Dao的創(chuàng)建、更新和刪除操作以及對(duì)Domain Service中的包括Mail,網(wǎng)絡(luò)等方法的訪問(wèn)。
2. 業(yè)務(wù)領(lǐng)域的控制邏輯(Business Rule)。A rule is a declarative statement that applies logic or computation to information values。Business Rule 1. 產(chǎn)生一些控制信息,限制或者觸發(fā)某些行為的執(zhí)行;2. 產(chǎn)生一些狀態(tài)信息,提供給業(yè)務(wù)人員參考操作。A rule results either in the discovery of new information or a decision about taking action.。
而Facade或者M(jìn)anager是完全從技術(shù)上考慮的,尤其是Facade,通常處理如下邏輯:1. 與表現(xiàn)層通信工作,把表現(xiàn)層的平面數(shù)據(jù)(VO)轉(zhuǎn)換為相關(guān)聯(lián)的Domain對(duì)象,把Domain對(duì)象計(jì)算的結(jié)果轉(zhuǎn)換成平面數(shù)據(jù)(VO)返回給表現(xiàn)層;2. 根據(jù)Use Case完成商業(yè)邏輯(面向事務(wù))的調(diào)度,包括其業(yè)務(wù)關(guān)聯(lián)的Domain Object和Domain Service調(diào)度,其可能調(diào)度了多個(gè)Domain Service。在簡(jiǎn)化的情況下,F(xiàn)acade有時(shí)和service可以等同。
如果把一個(gè)系統(tǒng)看作是一個(gè)Mechanical組件的話,那么Domain Object就是其Structure,相當(dāng)于人的骨架;而流程邏輯就是Power,相當(dāng)于骨架上的肌肉;那么控制邏輯就是Control,相當(dāng)于肌肉中的神經(jīng)。
Domain應(yīng)用的可能
JavaBean方案,采用SQL mapping,只映射字段,不支持關(guān)聯(lián)關(guān)系的映射,沒(méi)有多態(tài)。但隨著ORM框架的發(fā)展,如hibernate,提供支持關(guān)聯(lián)關(guān)系,繼承多態(tài)的能力,Domain Object成為可能。
Cooperation Object:Domain Model之外
Domain Model描述了一個(gè)面向問(wèn)題領(lǐng)域的對(duì)象組織結(jié)構(gòu),和行為邏輯。而同時(shí)系統(tǒng)還需要另一些稱為協(xié)作對(duì)象的,來(lái)幫助我們處理特定的技術(shù)問(wèn)題。
應(yīng)用domain 的體系結(jié)構(gòu)
Domain Service | Cooperation Object
Domain Object | (包括了Dao在內(nèi)的處理技術(shù)問(wèn)題的輔助對(duì)象)
其它
Domain Model存在于系統(tǒng)的各個(gè)地方,不過(guò)在不同地方有不同的映射實(shí)現(xiàn)。在通常的開發(fā)過(guò)程中,該映射存在于文檔和開發(fā)人員的腦海中的。當(dāng)要向客戶展示時(shí),就面臨一個(gè)映射的關(guān)系。比如要允許客戶可以在線編輯頁(yè)面呈現(xiàn)的顯示元素,在規(guī)則定義里使用對(duì)象系統(tǒng)時(shí)。
另外Domain在不同視圖下導(dǎo)致不同的內(nèi)容。比如一個(gè)代理人Agent對(duì)象,在party的視圖下只擁有基本屬性,而在Sale channel視圖下就保存了一些額外信息如:考核記錄,優(yōu)秀率等。