徹底完全地被LINQ(2sql以及C#3.0裡的一些文法)雷到了

來源:互聯網
上載者:User

    有幾位高手在留言裡提醒我, 把幾個概念搞混了. 其實概念我是明白的, 只不過我想, 這個文章肯定不是那種有 "前言" 和 "參考文獻" 清單的技術論文, 而更多是為了表達我在試用linq----2sql, 不好意思, 差一點又混淆了視聽----時, 對MS所做的一些工作的敬佩, 以及解決了我積累多時的技術問題時所感覺到的那種快意和激動, 因此甚至連很多拼字錯誤也沒有糾正, 大家都是搞技術的, 相信不會不理解我的意思.
    但是, 為了表示對大蝦們意見的重視, 我這就把文章裡的模糊化的概念和名詞加一括弧注釋, 以免誤導讀者. 如果您已經被本文誤導, 茲向您表示深切的(但是肚子裡憋著笑的)歉意.
-------------------------------------------------------------------------------------------

    多年了,沒有什麼技術再能讓我激動得無法控制住自己,包括WPF的超炫介面功能,我也只是小小地喜悅了一下,但畢竟知道介面設計更多還是美工創意的功夫,見過很多品味不夠的開發人員,把自己程式介面搞得花裡胡騷,簡直得像不小心坐在調色盤上的大熊的屁股,只能讓人笑話。所以WPF的UI能力似乎離自己還有距離。

  但是,Linq(其實是LINQ2SQL和C#3.0裡的一些新文法),卻真得把我雷到了。在我重新坐下來寫這段話之前,我是激動得在屋裡轉了幾圈的,嘴裡至少把MS罵了十來句“WC!”,這罵不是懷了恨意的罵,而是懷了敬意的罵,是沒辦法控制自己興奮和激動的心情的罵,就像是《朱羅紀公園》裡的馬爾康姆教授第一眼看到人工DNA造出來的活恐龍時,說的那句話:“這幫狗娘養的真的做到了!”
  我,未能免俗,被MS絕對好用的IDE拖住了,從VC(++)5.0開始, 一路上了MS的套, 直追到C#3.(0, .net3.5), 每一代的技術都讓人目瞪口呆, 但每一次又都如過眼雲煙, 還沒有來得及完全消化, 下一個版本時就已經被全然拋棄了. 在.net 1.0 時, 我跟著MS去用伺服器控制項和Dataset, 還沒有玩熱, 2.0裡已經開始在推datasou(r)ce, 其實我想datasou(r)ce裡一定會有很精深的東西, 但是我也沒來得及好好看時, LINQ(2sql)已經出現了.

    其實不能怪MS把自己的技術追隨者隨意拋棄, 憑心而論, MS這幾年是太進取了, 太希望把新的技術推出來了. 因為那些中間階段的技術, 雖然都能讓人有醍醐灌頂的感覺, 但是真得實用起來時, 總是會有一些這樣那樣的問題, 或是不方便之處. 於是, 每次MS推出一個新技術時, 都能讓我感覺恰好解決了一直困擾我的一些問題. 看看MS在為瞭解決公司專屬應用程式上做的努力吧: ASP.net用伺服器控制項的方式來簡化BS應用的開發, 不方便, 改用vs2003的智能用戶端(這時還需要用自己寫程式集載入功能), 還不方便, 在vs2005中智能用戶端已經一鍵部署了, 還是不方便, 然後, VS2008裡WPF出現, 用BS的方法開發和使用程式, 但像CS應用一樣運行, 您滿意了嗎?

    再看ORM方面的努力. .net1.0時, MS請我用dataset和dataadapter, 那已經比SQL方便了不了啦! 只不過我是一個OOP純粹主義者, 不太喜歡用資料表的方式考慮問題, 然後, MS開始允許讓我把 IEnum(e)rable 型也做為資料來源, 也一樣可以綁定資料控制項. 只是讓我痛苦的是對象不會自動地儲存到資料庫中, 我試過流行的開源ORM架構, 也痛苦地寫了自己的代碼產生器從表結構來產生類定義和CRUD的方法. 但還是總是會遇上一些問題.

    然後, LINQ出現了, System.Data.Linq(也就是linq2sql) 也出現了.

    第一次嘗試(linq2sql)時, 我向dbml(linq2sql類別設計工具)中拖了一個表格, 然後, 我被雷到了第一次: 它產生了我一直在找但一直沒有找到的那個類, 還有我之前不止一次夢想過的資料內容類!(我知道, 我知道, Hibernate也是可以的, 但是我真得記不住他的配置方法.)

    然後我向dbml(linq2sql類別設計工具)中放進去了更多的表, 然後, 我被雷到了第二次: 它根據我的表關聯關係自動為我配置好了對象彙總! 我試著查詢了一下產品對象, 然後, 通過產品對象的定單成員, 我可以直接檢索這個屬於產品的定單了.

    在通讀了幾篇LINQ(2sql, 這些文章的作者也沒有刻意去區別這個差別, 包括MSDN上的一些作者, 我替他們再向各位道歉)的內容之後, 我決定我的下一個項目用LINQ(2sql)來做. 然後, 一如即往的, 在實際的使用中遇上了一堆問題. 第一個問題是我想擴充資料類的定義, 增加自己的新屬性和方法什麼的, 然後, 我發現只要一動設計圖, 我所有的新代碼都不見了! 還好用了VSS, 立即簽回上一個版本. 那該怎麼辦呢, 難道不能修改這些美妙的類定義?

    然後, 我想過用extender, 用繼承, 但是都像之前的各種MS迫不及待地推給我的技術一樣, 雖然也能解決問題, 但都很勉強. 去MSDN一查, 他們建議我另建一個源檔案, 用partail(partial)類的方式來擴充這些類, 自己寫的partail(partial)類不會被設計器亂改. 他媽的! 居然這麼簡單! 我我我, 唉, 我真傻, 真的,我只知道Winform design的時候可以用到partail(partial)類, 不知道在linq(2sql)裡也可以用到的...

    這個問題解決了, 感覺自己連氣出得都痛快了. 但是隨即又遇上一個問題: 我想在資料載入時偷偷做些自己的處理, 這該怎麼辦? 我在智能感知的菜單裡去找閃電表徵圖, 希望找到一個DataLoaded事件讓我訂閱一下, 然後, 沒有! 試著打個override來看看有沒有OnLoaded之類的虛擬方法讓我重寫一下. 然後, 也沒有! 好好, 我還有一大堆辦法可以解決, 我可以在select之後再調用個成員方法來預先處理. 目的是達到了, 但是, 代碼好醜! MS就打算讓我這麼做? MS這回是怎麼回事? 明明一個delegate就可以解決的, 非要我寫這麼醜的代碼.

    真得不服氣呀! 我再去找! 然後, 就看到那一堆堆的 partial void OnLoaded()方法定義. 這是什麼東西? 方法也可以partail嗎? OnLoaded()明顯是我想要的東西, 但是這個partial表示什麼? 老了老了, 很多東西沒功夫好好看了.

    於是, 上MSDN上一找, 又被雷到了!

    MSDN上是這麼寫的:

    部分類別或結構可以包含分部方法。類的一個部分包含方法的簽名。可以在同一部分或另一個部分中定義可選實現。如果未提供該實現,則會在編譯時間移除方法以及對方法的所有調用。

    看看,看看! 如果未提供該實現, 則會在編譯時間移除方法以及對方法的調用! 老天呐!!! 事件委託時還要寫一個 "if (Data_Loaded != null)" 的, 現在只需要一個partail 方法? 繼續向下看, MSDN又說:

    分部方法使類的某個部分的實施者能夠定義方法(類似於事件)。類的另一部分的實施者可以決定是否實現該方法。如果未實現該方法,編譯器將移除方法簽名以及對該方法的所有調用。因此,部分類別中的任何代碼都可以隨意地使用分部方法,即使未提供實現也是如此。如果調用了未實現的方法,將不會導致編譯時間錯誤或執行階段錯誤。

    在自訂產生的程式碼時,分部方法特別有用。這些方法允許保留方法名稱和簽名,因此產生的程式碼可以調用方法,而開發人員可以決定是否實現方法。與部分類別非常類似,分部方法使代碼產生器建立的代碼和開發人員建立的代碼能夠協同工作,而不會產生運行時開銷。

    說實話, 到這時我已經基本被雷暈了, 我理想中的那種完美方案完全如希望的樣子出現了, 不, 這樣的代碼實現, 乾淨利落得遠遠超出我的期望. 我於是開始站起來在屋裡亂走, 一邊用髒話來發泄心裡的激動. 就是我在本文一開始說的那樣. 明白嗎? 這是在編譯時間處理的, 是原始碼上的方法樣板模式實現! 這還是一個編譯器該做的嗎? 你允許我用匿名型別的局部變數, 我就已經很感激了(自從泛型引入以後, 我就總是猜不中我該用什麼類型來接收模板方法的傳回值), 現在, 你開始允許我在源碼上瞎寫不存在的方法了!

    文章寫到現在, 激動的心情已經平靜不少, 一個擔心開始出現了: MS的C#接下來還將怎樣進一步允許我們胡鬧?

    我的一個開發員, 無論做什麼功能, 都用datasoure實現, 他只會 "拖控制項, 拖資料來源, 配置資料來源", 然後, 他在代碼裡一遍一遍地執行綁定, 完全不管資料庫已經被查詢了多少次. MS的技術越來越不要求嚴謹, 越來越縱容程式員胡來(在語言規範越來越靈活的同時, 向java一樣強制要求處理異常的機制卻一直沒有增加就是一個例子), 在MS的強大的編譯技術保護下, 還會有多少程式員變成傻瓜?

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.