天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

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

  上一篇文章主要是在夸NHibernate實現的好,而這篇就完全是來抱怨的了。NHiberante有個毛病,就是如果是和數據庫產生映射的類,就要求所有的public成員和protected成員必須是virtual的。請注意這里的要求有兩個細節:

  • 即使是方法,也必須標記為virtual
  • 即時是不和數據庫有映射關系的屬性,也必須標記為virtual

  這就讓我覺得無厘頭了,為什么沒有任何關系的東西也要受到限制?我知道NHiberante要求將屬性標記為virtual是為了延遲加載,因為只有這樣它才能生成如上一篇文章中那樣的延遲代理類,這樣就可以實現只在第一次訪問屬性的時候才進行“加載”操作,從而訪問數據庫并獲得數據,再填充字段。不過我認為這也不是合適的理由,因為這又關沒有映射的屬性,甚至方法什么事情呢?我在很長一段時間內一直沒有想明白這個問題。

  直到看了NHibernate開發團隊成員Davy Brion的文章《Must Everything be Virtual with NHiberante?》之后,我才了解了他們的設計思路——雖然我還是不認同。我真的不喜歡到處virtual

  要求類中所有的公開成員(public/protected)都是virtual,是因為NHibernate想要保證在“訪問任何公開成員”之前,數據已經被加載了。也就是說,無論您是想調用它的ToString方法,還是您自己寫的輔助方法/屬性,在真正進入您自定義的邏輯之前,數據肯定已經存在了——例如,存在于私有的域字段中:

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屬性第一次訪問時加載數據,但是如果我們的DoSomethingWithTagNames方法直接訪問m_tagNames字段,數據自然無法加載了。因此,NHibernate必須確保有能力在代理類中覆蓋DoSomethingWithTagNames方法才行。這就是virtual方法的由來。

  但是在我看來,我們真的有多少情況會去訪問私有字段呢?事實上對于大部分情況,我們會使用C#中“自動屬性”特性來定義屬性,這樣自然只有屬性,沒有字段。即使我們使用了自定義的私有字段來保存屬性的值,NHibernate也可以“叮囑”我們應該訪問屬性,而不要直接訪問私有字段——其實在編程上兩者并沒有差別。現在這樣被強迫的感覺不好。

  不過昨天我忽然想到,這似乎也是可以理解NHibernate這么做的原因:因為Hibernate要照顧到Java語言開發人員的使用感受——請注意是Hibernate,沒有N。不管怎么說,NHibernate是從Hibernate移植過來的。NHiberante的主力開發人員Oren Eini曾在博客中寫道(可惜一時沒找到),NHiberante刻意與Hibernate的實現保持同步,這樣容易進行雙向的同步,例如Hibernate解決了一些bug或性能問題,也可以較為輕易地在NHibernate上修補。

  不過這還是沒有解釋為什么Hibernate要一切都是virutal的原因啊。其實您只要看一下這段Java代碼就應該明白了:

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的等價Java代碼。由于Java里沒有“屬性”概念,因此Java語言自身一直有一個“約定”:getXxx和setXxx兩個方法即為一個屬性。這個約定用在很多地方,如IDE就會把它當作是一個屬性方便設置及導航,框架在進行序列化時候也知道哪些東西是“屬性”。這“約定”本沒有問題,但是這就給Java開發人員造成了一定困擾:使用起來實在是太麻煩了。例如,Product有個屬性叫做ViewCount,我們想要把它加1,在C#中我們可以寫:

this.ViewCount++;

  而在Java中則必須是:

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

  因此,如果是你的話,在寫Java代碼的時候,是愿意使用getXxx()這樣的方法,還是直接訪問類中的私有字段?因此我認為,是Java語言的特性,導致Java開發人員傾向于直接訪問類中的私有字段,從而導致Hibernate需要避免未加載的私有字段,進一步導致Hibernate的代理類會去覆蓋所有的公開方法(只有方法,因為Java語言沒有“屬性”)——最終,由于NHibernate在“統一大業”上的策略,使得我們.NET開發人員也必須把所有成員標記為virtual,無論是方法還是屬性。

  您可能會說,但也沒見Java程序員嚷嚷啊。沒錯,因為在Java語言中,默認情況下所有的成員都是virtual的。而在.NET平臺下情況正好相反。因此在我看來,我們這里必須到處標記virtual所造成的不便,和Java語言本身有著非常大聯系——我們需承受Java語言所帶來的痛苦。

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

  哦,對了。在未來的Java 7中,我們可歌可泣的Java語言終于有了a –> property這樣的屬性訪問語法了。

  可惜,遲了。

NET技術我對NHibernate的感受(2):何必到處都virtual,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 老外的好大c的我好爽 | 好男人好资源在线观看 | 99精品久久久久久久 | 成人亚洲精品 | 被老师按在办公桌吸奶头 | 又大又硬又爽免费视频 | 国产精品视频第一区二区三区 | 久久橹 | 免费毛片网站在线观看 | 暖暖 免费 高清 日本视频大全 | 37pao成人国产永久免费视频 | 黄色片软件大全 | 无限资源在线观看播放 | 精品少妇爆AV无码专区 | 成人毛片免费观看视频大全 | 亚洲热在线视频 | 久久免费看少妇高潮A片2012 | 韩国污动漫无遮掩无删减电脑版 | 久久中文字幕综合不卡一二区 | 成人在免费视频手机观看网站 | 男助理憋尿PLAY灌尿BL出去 | 人人啪日日观看在线 | 国产h视频在线观看网站免费 | 亚洲精品乱码8久久久久久日本 | 久久大香萑太香蕉av | 亚洲欧洲日本天天堂在线观看 | 日本人六九视频 | 偷拍 拍自 欧美色区 | 欧美性色生活片天天看99顶级 | 欧美熟妇互舔20p | 亚洲欧洲日韩国产一区二区三区 | 果冻传媒9CM在线观看 | 国产AV亚洲国产AV麻豆 | 亚洲熟妇色自偷自拍另类 | 中国女人内谢69xxxxxx直播 | 日本内射精品一区二区视频 | 青草久久久 | 国产全肉乱妇杂乱视频 | 强开乳罩摸双乳吃奶视频 | 亚洲国产成人私人影院 | 漂亮的保姆6在线观看中文 漂亮的保姆5电影免费观看完整版中文 |