四虎精品视频-四虎精品成人免费网站-四虎黄色网-四虎国产视频-国产免费91-国产蜜臀97一区二区三区

我對(duì)NHibernate的感受(2):何必到處都virtual

  上一篇文章主要是在夸NHibernate實(shí)現(xiàn)的好,而這篇就完全是來(lái)抱怨的了。NHiberante有個(gè)毛病,就是如果是和數(shù)據(jù)庫(kù)產(chǎn)生映射的類,就要求所有的public成員和protected成員必須是virtual的。請(qǐng)注意這里的要求有兩個(gè)細(xì)節(jié):

  • 即使是方法,也必須標(biāo)記為virtual
  • 即時(shí)是不和數(shù)據(jù)庫(kù)有映射關(guān)系的屬性,也必須標(biāo)記為virtual

  這就讓我覺(jué)得無(wú)厘頭了,為什么沒(méi)有任何關(guān)系的東西也要受到限制?我知道NHiberante要求將屬性標(biāo)記為virtual是為了延遲加載,因?yàn)橹挥羞@樣它才能生成如上一篇文章中那樣的延遲代理類,這樣就可以實(shí)現(xiàn)只在第一次訪問(wèn)屬性的時(shí)候才進(jìn)行“加載”操作,從而訪問(wèn)數(shù)據(jù)庫(kù)并獲得數(shù)據(jù),再填充字段。不過(guò)我認(rèn)為這也不是合適的理由,因?yàn)檫@又關(guān)沒(méi)有映射的屬性,甚至方法什么事情呢?我在很長(zhǎng)一段時(shí)間內(nèi)一直沒(méi)有想明白這個(gè)問(wèn)題。

  直到看了NHibernate開(kāi)發(fā)團(tuán)隊(duì)成員Davy Brion的文章《Must Everything be Virtual with NHiberante?》之后,我才了解了他們的設(shè)計(jì)思路——雖然我還是不認(rèn)同。我真的不喜歡到處virtual

  要求類中所有的公開(kāi)成員(public/protected)都是virtual,是因?yàn)镹Hibernate想要保證在“訪問(wèn)任何公開(kāi)成員”之前,數(shù)據(jù)已經(jīng)被加載了。也就是說(shuō),無(wú)論您是想調(diào)用它的ToString方法,還是您自己寫(xiě)的輔助方法/屬性,在真正進(jìn)入您自定義的邏輯之前,數(shù)據(jù)肯定已經(jīng)存在了——例如,存在于私有的域字段中:

public class Article{    private string m_tagNames    public virtual string TagNames    {        get        {            return this.m_tagName;        }        set        {            this.m_tagNames = value;        }    }    public void DoSomethingWithTagNames()    {         Console.WriteLine(this.m_tagNames);    }}

  雖然NHibernate可以在TagNames屬性第一次訪問(wèn)時(shí)加載數(shù)據(jù),但是如果我們的DoSomethingWithTagNames方法直接訪問(wèn)m_tagNames字段,數(shù)據(jù)自然無(wú)法加載了。因此,NHibernate必須確保有能力在代理類中覆蓋DoSomethingWithTagNames方法才行。這就是virtual方法的由來(lái)。

  但是在我看來(lái),我們真的有多少情況會(huì)去訪問(wèn)私有字段呢?事實(shí)上對(duì)于大部分情況,我們會(huì)使用C#中“自動(dòng)屬性”特性來(lái)定義屬性,這樣自然只有屬性,沒(méi)有字段。即使我們使用了自定義的私有字段來(lái)保存屬性的值,NHibernate也可以“叮囑”我們應(yīng)該訪問(wèn)屬性,而不要直接訪問(wèn)私有字段——其實(shí)在編程上兩者并沒(méi)有差別。現(xiàn)在這樣被強(qiáng)迫的感覺(jué)不好。

  不過(guò)昨天我忽然想到,這似乎也是可以理解NHibernate這么做的原因:因?yàn)镠ibernate要照顧到Java語(yǔ)言開(kāi)發(fā)人員的使用感受——請(qǐng)注意是Hibernate,沒(méi)有N。不管怎么說(shuō),NHibernate是從Hibernate移植過(guò)來(lái)的。NHiberante的主力開(kāi)發(fā)人員Oren Eini曾在博客中寫(xiě)道(可惜一時(shí)沒(méi)找到),NHiberante刻意與Hibernate的實(shí)現(xiàn)保持同步,這樣容易進(jìn)行雙向的同步,例如Hibernate解決了一些bug或性能問(wèn)題,也可以較為輕易地在NHibernate上修補(bǔ)。

  不過(guò)這還是沒(méi)有解釋為什么Hibernate要一切都是virutal的原因啊。其實(shí)您只要看一下這段Java代碼就應(yīng)該明白了:

public class Product{    private String m_tagNames;    public String getTagNames()    {        return this.m_tagNames;    }    public String setTagNames(String value)    {        this.m_tagNames = value;    }}

  這是上面C#中Product的等價(jià)Java代碼。由于Java里沒(méi)有“屬性”概念,因此Java語(yǔ)言自身一直有一個(gè)“約定”:getXxx和setXxx兩個(gè)方法即為一個(gè)屬性。這個(gè)約定用在很多地方,如IDE就會(huì)把它當(dāng)作是一個(gè)屬性方便設(shè)置及導(dǎo)航,框架在進(jìn)行序列化時(shí)候也知道哪些東西是“屬性”。這“約定”本沒(méi)有問(wèn)題,但是這就給Java開(kāi)發(fā)人員造成了一定困擾:使用起來(lái)實(shí)在是太麻煩了。例如,Product有個(gè)屬性叫做ViewCount,我們想要把它加1,在C#中我們可以寫(xiě):

this.ViewCount++;

  而在Java中則必須是:

this.setViewCount(this.getViewCount() + 1);

  因此,如果是你的話,在寫(xiě)Java代碼的時(shí)候,是愿意使用getXxx()這樣的方法,還是直接訪問(wèn)類中的私有字段?因此我認(rèn)為,是Java語(yǔ)言的特性,導(dǎo)致Java開(kāi)發(fā)人員傾向于直接訪問(wèn)類中的私有字段,從而導(dǎo)致Hibernate需要避免未加載的私有字段,進(jìn)一步導(dǎo)致Hibernate的代理類會(huì)去覆蓋所有的公開(kāi)方法(只有方法,因?yàn)?a href=/itjie/Javajishu/ target=_blank class=infotextkey>Java語(yǔ)言沒(méi)有“屬性”)——最終,由于NHibernate在“統(tǒng)一大業(yè)”上的策略,使得我們.NET開(kāi)發(fā)人員也必須把所有成員標(biāo)記為virtual,無(wú)論是方法還是屬性。

  您可能會(huì)說(shuō),但也沒(méi)見(jiàn)Java程序員嚷嚷啊。沒(méi)錯(cuò),因?yàn)樵?a href=/itjie/Javajishu/ target=_blank class=infotextkey>Java語(yǔ)言中,默認(rèn)情況下所有的成員都是virtual的。而在.NET平臺(tái)下情況正好相反。因此在我看來(lái),我們這里必須到處標(biāo)記virtual所造成的不便,和Java語(yǔ)言本身有著非常大聯(lián)系——我們需承受Java語(yǔ)言所帶來(lái)的痛苦。

  雖然我理解NHibernate,但這又怎能讓我滿意呢?

  哦,對(duì)了。在未來(lái)的Java 7中,我們可歌可泣的Java語(yǔ)言終于有了a –> property這樣的屬性訪問(wèn)語(yǔ)法了。

  可惜,遲了。

NET技術(shù)我對(duì)NHibernate的感受(2):何必到處都virtual,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 内蒙古电视台雷蒙| 含羞草传媒2024| dearestblue动漫免费观看| 永远的紫荆花简谱| baekhyun| 三浦亚沙妃| 小头儿子大头爸爸| 用药错误应急预案演练脚本| 欧美日韩欧美| 她的伪装 电视剧| 金装维尔梅| 六年级上册英语书电子版翻译| 男同性恋者| 学校急招水电工一名| 野性的呼唤国语| 五年级上册学法大视野答案| 家庭琐事电影| 五年级字谜| 洞房艳谈| 莫恭明| 吉泽明步电影| 女村长| 杨贵妃1992版电影完整| 公交车上的那些事| 眼睛胬肉手术多久恢复| 好像也没那么热血沸腾电影免费观看 | 特级做a爰片毛片免费看| 潜行在线观看| 男人不可以穷演员表| 草刈正雄| 信我者无需多言,不信我者| 追捕演员表| 龚婉怡| 恐龙图片大全大图| 血色樱花| 草刈正雄| 泰星mike| 变形金刚6免费观看高清完整版| 女人扒男生裤子摸j视频| 花样厨神 电影| 亚洲狠狠爱|