原文地址:http://www.cnblogs.com/idior/archive/2005/07/04/186086.html
近日?有關o/r?m的討論突然多了起來.?在這里覺得有必要澄清一些概念,?免的大家討論來討論去,?才發現最根本的理解有問題.
1.?何謂實體?
實體(類似于j2ee中的Entity?Bean)通常指一個承載數據的對象,?但是注意它也是可以有行為的!?只不過它的行為一般只操作自身的數據.?比如下面這個例子:
class?Person
{
??string?firstName;
??string?lastName;
??public?void?GetName()
??{
?????return??lastName+firstName;
??}???
}
GetName就是它的一個行為.
2?何謂對象?
對象最重要的特性在于它擁有行為.?僅僅擁有數據,你可以稱它為對象,?但是它卻失去它最重要的靈魂.?
class?Person
{
??string?firstName;
??string?lastName;
??Role?role;
??int?baseWage;
??public?void?GetSalary()
??{
?????return?baseWage*role.GetFactory();
??}???
}
這樣需要和別的對象(不是Value?Object)打交道的對象,我就不再稱其為實體.?領域模型就是指由這些具有業務邏輯的對象構成的模型.
3.?E/R?M?or?O/R?M?!!
仔細想想我們為什么需要o/r?m,無非是想利用oo的多態來處理復雜的業務邏輯,?而不是靠一堆的if?else.?
而現在在很多人的手上o/r?m全變成了e/r?m.他們不考慮對象的行為,?而全關注于如何保存數據.這樣也難怪他們會產生將CRUD這些操作放入對象中的念頭.?如果你不能深刻理解oo,?那么我不推薦你使用o/r?m,?Table?Gateway,?Row?Gateway才是你想要的東西.
作為一個O/R?M框架,很重要的一點就是實現映射的透明性(Transparent),比較顯著的特點就是在代碼中我們是看不到SQL語句的(框架自動生成了)。這里所指的O/R?M就是類似于此的框架,
4.?POEAA中的相關概念
??很多次發現有人錯用其中的概念,?這里順便總結一下:
??1.?Table?Gateway
????以表為單位的實體,基本沒有行為,只有CRUD操作.
??2.?Row?Gateway
????以行為單位的實體,基本沒有行為,只有CRUD操作.
??3.?Active?Record
????以行為單位的實體,擁有一些基本的操作自身數據的行為(如上例中的GetName),同時包含有CRUD操作.
其實Active?Record最符合某些簡單的需求,?接近于E/R?m.
通常也有很多人把它當作O/R?m.不過需要注意的是Active?Record中是充滿了SQL語句的(不像orm的SQL透明),?所以有人想起來利用O/R?m來實現"Active?Record",?雖然在他們眼里看起來很方便,?其實根本就是返祖.
用CodeGenerator來實現Active?Record也許是一個比較好的方法.
??4.?Data?Mapper
這才是真正的O/R?m,Hibernate等等工具的目標.
5.O/R?M需要關注的地方?(希望大家幫忙完善一下)
?1.?關聯,?O/R?M是如何管理類之間的關聯.當然這不僅于o/r?m有關與設計者的設計水平也有很大關系.
?2.?O/R?M對繼承關系的處理.
?3.?O/R?M對事務的支持.
?4.?O/R?M對查詢的支持.
?
以上觀點僅屬個人意見,?不過在大家討論有關O/R?m之前,?希望先就一些基本概念達成共識,?不然討論下去會越離越遠.?
(建議:?如果對oo以及dp沒有一定程度的了解,?最好別使用o/r?m,?dataset?加上codesmith或許是更好的選擇)