简单声明一下。
在http://www.cnblogs.com/progame/archive/2004/06/27/19062.aspx的帖子中,反駁了我的觀點(diǎn),無可厚非,各人的觀點(diǎn)不同嘛。不過,我想說明一點(diǎn):我是搞快速開發(fā)的,是在保證工程質(zhì)量前提下進(jìn)行盡量的快速開發(fā),所以有一些觀點(diǎn)是涉及到一些技巧的,但也這些技巧與觀點(diǎn)均建立在面向?qū)ο蟮乃枷胫稀?br /> 對于 progame的txtName.Text = Employee.Name & “”寫法,我沒有任何反對意見,這倒是一個不錯的寫法。
不過,從純對象角度來說,“NULL并不表示這個屬性沒有,而是說這個屬性暫時“未知”,比如說員工表的出生日期字段,用default?1900-01-01?還是1990-01-01? 難道這種默認(rèn)值就不需要前臺程序判斷?”,如果是這樣理解屬性為空的概念也未嘗不可,但是這樣,在進(jìn)行業(yè)務(wù)建模時,就應(yīng)該將有Null值的屬性列采用虛類進(jìn)行描述,可以參考一下對象/關(guān)系映射--繼承模式中指出的One Inheritance Path One Table模式,在這里模式中,虛類是不能映射到表的,原因就是我們用的是關(guān)系型數(shù)據(jù)庫,而不是對象型數(shù)據(jù)庫,在關(guān)系型數(shù)據(jù)庫中,一般不會出現(xiàn)可變化的虛表,當(dāng)然也可以從其它手段進(jìn)行模擬,不過,這如同用C來寫對象化的編程一樣,畢竟要麻煩一些。
上面說的員工表的出生日期字段,用1900-01-01還是1990-01-01,我認(rèn)為既然站在了對象的角度來看,就不應(yīng)該考慮作為對象的“員工的出生日期”的是1900-01-01還是1990-01-01,屬性本身是不應(yīng)有指定的數(shù)據(jù)格式,因?yàn)閷傩灾皇且粋€描述,像1990-01-01這類格式字段,本身也是作為“出生日期”的屬性信息而存儲于數(shù)據(jù)庫之中的。而且,默認(rèn)值似乎也不會影響到實(shí)際應(yīng)用程序中的操作,可能 progame老兄習(xí)慣于使用數(shù)據(jù)綁定操作進(jìn)行數(shù)據(jù)庫的操作,所以會遇到默認(rèn)值選擇什么比較好的問題。但請稍注意一下,屬性的默認(rèn)值,不一定是直接用于數(shù)據(jù)呈現(xiàn)而用的,它的作用是填充數(shù)據(jù)庫中屬性里殘缺的部分,在關(guān)系型數(shù)據(jù)庫與外部程序連接時,如果少了數(shù)據(jù)庫的默認(rèn)值,它在直接訪問時的邏輯上更大的情況不是表示出了不存在,而表示出了未知。
eg. 在員工表中,假設(shè),家庭住址為空,那么在此情況,如果應(yīng)用程序請求員工的家庭住址的值時,數(shù)據(jù)庫直接返回一個空標(biāo)識,這時,在應(yīng)用程序中,如果有一個對象接收到此空標(biāo)識時,這個空標(biāo)識作為object時,是null值,對象引用為空值,表達(dá)的直接邏輯就是不存在,而不應(yīng)該是未知。按我的思想,一般的情況下,你不應(yīng)該能夠進(jìn)行如下形式的聲明(偽代碼說明):
string str = null;
object o = (object)str;
上面的代碼對一個string類型的對象進(jìn)行裝箱操作,但實(shí)際上,對于object本身來說是一個引用型,當(dāng)對str進(jìn)行裝箱后,它實(shí)際上是對一個null進(jìn)行了裝箱操作,所以這是不應(yīng)該能夠?qū)崿F(xiàn)的代碼,但在.net的C#代碼中,為什么編譯能夠通過?
在CLR中,是如下的操作:
? .maxstack? 1
? .locals init ([0] string str,
?????????? [1] object o)
? IL_0000:? ldnull
? IL_0001:? stloc.0
? IL_0002:? ldloc.0
? IL_0003:? stloc.1
??????? 請注意上面的顏色標(biāo)識部分,([0] string str, [1] object o)發(fā)現(xiàn)了什么?對,[0]string str,0長度大小的string,這是CLR的自動轉(zhuǎn)換,并且,還可以看到[1] object o,這是外部進(jìn)行的裝箱,也就是說,這里并不是類型轉(zhuǎn)換,而是外部的一個包裝而已。這樣,應(yīng)用程序中實(shí)際執(zhí)行的代碼與數(shù)據(jù)庫中提交過來的數(shù)據(jù),實(shí)際上已經(jīng)被“污染”過了,這是無法實(shí)現(xiàn)高效的O/R映射的。因?yàn)樵陉P(guān)系數(shù)據(jù)庫中有數(shù)據(jù)類型的概念,其中分開了空值與0長度大小的概念,就關(guān)系型數(shù)據(jù)而言,空值確實(shí)是表示不存在,因?yàn)樗祷氐牟皇且粋€string的數(shù)據(jù)類型的空值,而返回的就是一個Null值。
??????? 在必要的情況下,如果非得進(jìn)行空值操作,建議對數(shù)據(jù)庫的返回的空值,進(jìn)行泛型改造。
在數(shù)據(jù)庫中,我覺得應(yīng)該設(shè)定默認(rèn)值的問題,并不是誰說了就誰是對了,當(dāng)然,我的觀點(diǎn)或理論上的理解也可能是錯誤的,如果能夠指正,我當(dāng)然也很高興,畢竟這也是一種進(jìn)步。
轉(zhuǎn)載于:https://www.cnblogs.com/William_Fire/archive/2004/06/28/19072.html
總結(jié)
- 上一篇: 兰波生平
- 下一篇: A free SSH client -