<<Domain Driven Design>> 和<< Patterns of Enterprise Application Architecture >>,令Domain 這個詞很火,也引起了廣泛爭論。我這里也亂談一把。

什么是領域模型(Domain Model )
   我以為Domain分兩個含義:Domain Object和Domain Service。那么什么樣的系統是面向Domain的系統,一個Domain Object和普通的符合OO原則的對象有什么區別;一個Domain Service和普通的Facade或者Manager對象有什么區別。
概念上,一個Domain Object和普通的符合OO原則的對象有聲明區別:Domain Object是業務意義上,承載了業務數據(我據此認為所有Domain Object是有狀態對象),從本質上說它直接來源于現實世界,沒有技術層次上的考慮,“符合OO原則的對象”是用OO方法分析得到的,是基于計算機領域技術的(這樣的對象可以是無狀態的);但反過來,符合OO的對象不一定反應DOMAIN 的OBJECT。

技術上,Domain Object是指那些包含需要被透明持久化的屬性,以及相關業務邏輯(體現在Use Case中)POJO。仔細觀察舊的系統,發現Transaction Script還是Table Module操作都的是來自數據庫(或者其它持久化通道)的數據,Transaction的業務邏輯是零星片斷。而Table Module其操作的是同一類業務數據集合,包含明顯的數據庫痕跡。而一個Domain Object包含了這些需要被持久化的業務數據,同時還包含了與之相關所有業務操作,并且有自己的繼承體系。Martin Fowler認為有了這些就可以稱為是一個Domain Object,因此在其PoEAA中的ORM包含了一些不透明的持久化方案。我認為一個真正的Domain Object需要一個透明持久化。

Domain Service包含的商業邏輯包含了兩部分:流程邏輯和控制邏輯。
1. 業務領域的流程邏輯(Business Process)。指一系列的業務行為,包括Domain Object的屬性更新;Dao的創建、更新和刪除操作以及對Domain Service中的包括Mail,網絡等方法的訪問。
2. 業務領域的控制邏輯(Business Rule)。A rule is a declarative statement that applies logic or computation to information values。Business Rule 1. 產生一些控制信息,限制或者觸發某些行為的執行;2. 產生一些狀態信息,提供給業務人員參考操作。A rule results either in the discovery of new information or a decision about taking action.。

而Facade或者Manager是完全從技術上考慮的,尤其是Facade,通常處理如下邏輯:1. 與表現層通信工作,把表現層的平面數據(VO)轉換為相關聯的Domain對象,把Domain對象計算的結果轉換成平面數據(VO)返回給表現層;2. 根據Use Case完成商業邏輯(面向事務)的調度,包括其業務關聯的Domain Object和Domain Service調度,其可能調度了多個Domain Service。在簡化的情況下,Facade有時和service可以等同。

如果把一個系統看作是一個Mechanical組件的話,那么Domain Object就是其Structure,相當于人的骨架;而流程邏輯就是Power,相當于骨架上的肌肉;那么控制邏輯就是Control,相當于肌肉中的神經。

Domain應用的可能 
JavaBean方案,采用SQL mapping,只映射字段,不支持關聯關系的映射,沒有多態。但隨著ORM框架的發展,如hibernate,提供支持關聯關系,繼承多態的能力,Domain Object成為可能。

Cooperation Object:Domain Model之外
Domain Model描述了一個面向問題領域的對象組織結構,和行為邏輯。而同時系統還需要另一些稱為協作對象的,來幫助我們處理特定的技術問題。

應用domain 的體系結構

      Domain Service  |           Cooperation Object
      Domain Object   | (包括了Dao在內的處理技術問題的輔助對象)

其它
Domain Model存在于系統的各個地方,不過在不同地方有不同的映射實現。在通常的開發過程中,該映射存在于文檔和開發人員的腦海中的。當要向客戶展示時,就面臨一個映射的關系。比如要允許客戶可以在線編輯頁面呈現的顯示元素,在規則定義里使用對象系統時。
另外Domain在不同視圖下導致不同的內容。比如一個代理人Agent對象,在party的視圖下只擁有基本屬性,而在Sale channel視圖下就保存了一些額外信息如:考核記錄,優秀率等。