最近在javaEye上看到有關(guān)Domain Driving Model Design的激烈討論,讓我對DOMAIN MODEL的理解更深刻了不少,趁現(xiàn)在意猶未盡之際,結(jié)合我在項目中的實際經(jīng)驗將討論中的一些結(jié)論摘錄并總結(jié)出來:
首先引用說明一下Domain Model 的定義:
Domain Model : An object model of the domain that incorporates both behavior and data.
Domain Model 分兩種:
1 Simple Domain Model (Active Record)
它的特點(diǎn)是POJO和TABLE STRUCTURE一一對應(yīng),建模基于數(shù)據(jù)庫設(shè)計。Hibernate走的就是這個路子,說它貧血,意思就是指它只有data,沒有behavior。(但我們實際可以通過HBM文件的定義和映射,在PO中適當(dāng)?shù)募尤胍恍┗镜臉I(yè)務(wù)邏輯的。)
在這種模式下,POJO自己的CRUD操作都應(yīng)該放在自己的類里面。其他復(fù)雜的業(yè)務(wù)邏輯會放到外面的Service layer。
2 Rich Domain Model (Data Mapper)
它的特點(diǎn)是POJO和TABLE STRUCTURE并不一一對應(yīng),建模天馬行空,完全取決于業(yè)務(wù)邏輯。domain object和table之間的mapping,由Data Mapper完成,domain object不用管數(shù)據(jù)表是何等結(jié)構(gòu),甚至不用管Data Mapper怎么操作。
1.識別某種業(yè)務(wù)行為的一個很確定的原則:
domain logic只應(yīng)該和這一個domain object的實例狀態(tài)(并非“持久”狀態(tài))有關(guān),而不應(yīng)該和一批domain object的狀態(tài)有關(guān).
進(jìn)一步的說:主要看logic是否只和這個object(注:指自身)的狀態(tài)有關(guān),如果只和這個object(注:指自身)有關(guān),就是domain logic;如果logic是和一批domain object(注:指同類型的實體)的狀態(tài)有關(guān),就不是domain logic,而是business logic。
2.Domain Model 與 Hibernate PO 的區(qū)別:
領(lǐng)域模型的代碼實現(xiàn)需要用一組互相協(xié)作的類來完成,每一個或者一組類承擔(dān)這個領(lǐng)域模型的某個特征。而Hibernate的實體類只不過是其中的一組類,它承擔(dān)的職責(zé)就是保持領(lǐng)域模型的狀態(tài)的。
3.基于Domain Model 分析與設(shè)計的方法規(guī)則:
應(yīng)該由領(lǐng)域模型來驅(qū)動你的軟件內(nèi)在規(guī)則,由需求驅(qū)動你的軟件外在交互.
最后,我想補(bǔ)充的是:根據(jù)目前的O/R Mapping技術(shù),我們在實際項目開發(fā)中,能真正做到 富領(lǐng)域模型 還不現(xiàn)實(因為我們還要考慮諸如性能、目前O/R持久化特性等等問題),更何況,我們的MODEL DATA最終需要被持久化,因此,我比較反對在DOMAIN MODEL 中直接通過任何方式做任何持久化操作,因為這會讓你所設(shè)計的MODEL無法獨(dú)立化,難以單元測試,并且與加入了一些外界無關(guān)的東西,這不符合對象的本質(zhì)(對象本身是不能持久化的)。雖然我們做不到完整意義上的Domain Driving Model Development,但我們可以在項目實際開發(fā)中因為性能、結(jié)構(gòu)簡化等等上面得到補(bǔ)償,這已經(jīng)值得欣慰了。
posted on 2005-04-07 09:44
狂人思維·成都 閱讀(1838)
評論(5) 編輯 收藏 所屬分類:
JAVA技術(shù) 、
J2EE應(yīng)用