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