【轉】VB和COM的寶書

Matthew Curland的《Advanced Visual Basic》,一本徹徹底底的VB寶書。一個星期前我終於收到從程序員

上海新風雨網絡書城(http://www.cnforyou.com)郵購的這本書的中譯本《高級Viusual Basic編程》。編程

中國電力出版社2001年5月出版,時隔近一年還可以買獲得,可見這本書賣得不算好。這幾天挑燈夜讀,感網絡

慨很多。因此雖然我對這本書的理解還不到二成,雖然我本身都以爲沒有任何資格來爲這本書寫書評,但多線程

仍是來談點本身的感想。
    下面所說的,有些徹底是我的觀點,很是無知,請您不要笑。框架

    1、寶書仍是天書?
    《Programming Distributed Applications with COM and Microsoft Visual Basic 6.0》一書的做函數

者Ted Pattison是這樣來評價《Advanced Visual Basic》:這本書可以把咱們帶到別的講VB和COM的書都工具

不敢去的地方,若是你拒絕認可那些常人所接受的VB侷限,這本書確定適合你。
    Francesco Balena(《Programming Microsoft's Visual Basic》一書的做者,也是一位VB大師級人學習

物)在這本書的前言裏說不要在睡覺前看這本書不然會睡不着。的確,由於這本書實現了太多讓人激動不網站

已的東西。
    只須要用兩個小時把這本書翻一遍,就能感受到Matthew Curland這位VB大師的功力,就能理解什麼叫url

真正的深刻。
    能夠說,這本書是VB深度探險所必備的一本魔法書,它爲VB英雄們全面展開了COM的地圖。不過學習它

須要很高的力量、法力和經驗值,若是你的等級不夠,就只能把它存放在寶物箱裏,而不能把它帶在身上


    由於要象Matt這樣深挖VB和COM技術,須要很是全面的技術功底。不怕你笑話,我看了幾天,不少地方

我都沒法理解,這一方面是由於中文翻譯較差,另外一方面也是由於不少COM方面的細節問題Matt都沒有好好

解釋。
    所以在看這本書以前,仍是應該先看看其它COM原理方面的書,以打好基礎,不然這本寶書就會變成一

本天書,只能用來治療失眠。
    
    2、高級仍是低級?
    VB是一門高級語言,她創建在COM之上,她很好的隱藏了COM繁瑣的細節。但是Matt這本書卻要把低層

的東西挖出來給咱們看,而且從底下從新構建以完成在VB裏一些被認爲不能實現的COM技術。
    要在VB裏真正玩轉COM須要什麼?沒有真正的指針技術,所以就得用SafeArray來變通的模擬;沒有真

正的函數指針,因此就有了須要用機器代碼實現的FunctionDelegate。有了指針技術,才能控制類廠,才

能定製QI,才能實現接口聚合,才能實現輕量級的COM對象系統。
    因而,咱們可以脫光VB爲COM穿上的衣服,咱們才能夠玩GUID,玩接口的老祖宗IUnknown。玩了這些基

本的,Matt還要玩在C++裏都不必定人人玩得轉的自由線程,他還要玩本身的內存分配管理器。玩得真是夠

深了,玩出一個很不錯的VBoost類,玩出幾個頗有實用價值類型庫工具。
    Matt真是很會玩,在他的網站www.PowerVB.com上,他放了一張小孩子時的照片,很頑皮,雖然少了兩

顆門牙,但笑得很開心。我可以想象Matt在VB裏玩這些深刻底層的東西經歷過多少次GPF,經歷過多少次痛

苦的失敗。雖然他曾經是VB開發小組的一員,雖然他知道一些內幕,可是好多VB內部實現上的BUG是他親手

挖出來的。因此沒有他那樣的樂於突破,不怕失敗的精神,就不可能象他那樣玩轉這麼多別人想都不敢想

的技術。
    問題是做爲高級語言的VB應不該該玩這些東西。我想把這本書名裏的"Advanced"翻譯成"高級"並很差

,由於這並非真正高級的東西(後面會講到真正高級的.NET),相反這本書裏有不少很是Low Level的東

西,爲了區別中文"高級"的二義性,這本書的名字應該翻譯成"深刻VB編程"更貼切一些。
    我我的是很是喜歡玩Matt所玩的這些東西的,雖然水平上和他相差十萬八千里。其實,對這些技術的

評價很大程度上成了我的喜愛的問題。你可能根本就沒法說服你的VB項目經理,雖然你可以告訴他把全部

的內部對象都用輕量技術來實現會快不少,並且實現起來也並非太複雜,可是他仍是會用一句話掐死你

:"老兄,看清楚,這是VB!咱們須要的是更簡單而不是更快,咱們不須要這些低級的東西"。固然,會有

例外,若是你的項目經理是Matt,他確定會以他的權威來贊同你的觀點。
    客觀的說,任什麼時候候,任何語言,不管它多麼高級,瞭解底層和系統都是很必要的。而因爲VB很是依

賴COM,因此深刻了解COM的底層細節是實現VB高效對象技術的基礎,也是寫IE和Shell擴展的基礎。固然,

Matt這本書卻不是爲COM初學者寫的。即便是高手,學習這本書也必定要有所取捨,要考慮那些看起來很過

癮的低層技術是否是真有應用價值。不管如何,Matt這本書正是針對VB深刻COM極地的一本好書,它讓咱們

真正看清了VB在底下所作的一切。

    3、簡單仍是複雜
    前面說了Matt的書講了不少底層的低級的東西,因此學習起來會感受到很複雜。的確,這本書不是幾

天就可以理解的,我想這仍是由於我基礎太差吧!
    其實高級和低級,簡單和複雜都是相對的,COM對於用熟ATL的人來講,其實並不算什麼底層,也不算

複雜。但在VB,還有Java和.NET裏COM成了底層成了複雜成了須要好好隱藏包裝的東西。即便在Java裏除了

須要瞭解JVM,要和COM打交道同樣還要會JNI,J/Direct。對任何技術而言,進行高級的封裝只是爲了更容

易使用,不表明不須要了解底層的東西。廣告說簡單,也不要都信。若是有人告訴你COM,CORBA,SOAP很

簡單,那是要麼是吹牛,要麼他背地裏花了很多時間學習過。不少被說成簡單的東西都有大部頭的書來說

,一個程序員一輩子爲了學習這些簡單的技術,須要看N本複雜的書,問題的關鍵是如何來把這些複雜的書看

得簡單起來。
    以Matt的這本寶書爲例,這本書之因此顯得複雜,是由於Matt想把本身多年的東西濃縮到一本書內。

但有些地方實在是太濃了,因此根本就化不開。那些喜歡而且專啃硬骨頭的高手專家大師們吃起來以爲很

有嚼口頗有味道,但通常人的消化能力是適應不了的,吃起來可能會傷身體。因此,不要聽Ted Pattison

和Francesco Balena說Matt這本書多麼好多麼好,就覺得咱們看了就可以必定可以有收穫。
    前面一直在說它的好處,如今要談談它很差的地方了(請高手們看到這裏不要起鬨,若是你以爲這本

書很是很是適合你,那是由於你牙齒和腸胃厲害,我對你的景仰如濤濤江水……)。
    我不得不說Matt不是一位會寫書的大師。雖然整本書到處都是寶,但要撿哪個都讓人以爲不容易。

這本書要是順着看確定要睡着,你要常常去翻翻後面,找些讓你激動的東西。其次,Matt過於高估了讀者

的接受能力,把有些推理當成定理來說了,讓人很不容易理解。再次,有些地方的確過於複雜,過於追求

完美。
    就拿Matt的多線程的實現來講,爲了不DoEvent的重入問題,他用了一個模塊來本身處理COM隱藏窗

口的消息,這玩得其實太深了。因此Matt的實現用了許多個類,使用起來也不方便。其實已經有高手在

Matt的方法的基礎上作出了更簡單更易用的實現,之後我會來介紹。
    我想,就大多數VB開發者來講,其實用不着學習那些實現上過於複雜的技術,即便這些技術有用,但

和學習這些技術所須要的投資相比,咱們還不如把時間花在回報更高的問題上。
    要想把Matt這本複雜的書看簡單,就得有所側重,取其精華。我想這本書的精華在於Matt他提出的VB

輕量對象系統,這在VB裏頗有價值,由於VB所生成的完整的COM對象的其運行開銷不小。輕量對象其方法和

原理並不複雜,若是咱們的目標只是會用這種技術,那麼咱們並不須要過多瞭解實現上的細節問題。Matt

所提供的VBoost類已經封裝的不錯了,會用接口聚合器,理解接口函數是如何重定向就足夠作出高效靈活

的對象了。
        
    4、有用仍是沒用?  
    我前面就說過Matt這本書到處都是寶,但若是你剛用VB不久,這本書對你沒用,我建議你找本書直接

去學VB.NET。你很幸運,入門在.NET出現的時候,你的確能夠沒必要了解COM繁瑣的底層細節,而直接享用

COM+。你只須要對COM的原理有一個大概的瞭解,就可以作出高效靈活的組件。這得益於.NET框架所提供的

共公語言運行時CLR,它設計上就比VB所依賴的VB和COM的運行時高級得多。
    VB.NET已經有了真正的Class,直接支持實現繼承,即不象原來在VB裏那樣要把繼承的函數一個一個代

理到基類函數上,也不用象Matt那樣本身來實現接口函數指針的重定向,一切就象在C++在Java裏同樣簡單

而清楚了。在VB.NET裏實現支持對象訪問的自由線程也只須要數行代碼,而不須要象在VB裏那樣要去用OLE

API要本身來處理列集接口。
    .NET所吹噓的一大優勢之一,就是徹底隱藏了COM繁瑣的細節,如今COM已經徹底在公共語言運行時控

制之下了。相比之下,雖然VB也竭力隱藏COM細節,可是VB運行時只是COM一層薄薄的包裝而已。
    有了.NET,是否是說Matt這些技術就真的沒用了呢,有了.NET是否是就真的不用去學習COM了呢?要想

不學習COM,除非如今的無數COM組件都真的消失了,除非目標系統都是.NET的,除非你們都進步到了WEB服

務。雖然這確定是一個趨勢並且發展得很快,雖然微軟有得是錢來推進它認準了是將來一統天下的東西,

可是如今學習COM技術也決不會白學,至少不少思想是互通的。
    因此不要去計較有用仍是沒用的問題,學了的東西都不會沒用。固然,對Matt的這本書應該去研究學

了就能用的東西,我不許備在這本書上花太多的精力,我已經準備留下點時間去學習一下.NET。

    5、翻仍是譯
    原本想好好批評一下這本書的翻譯水平,但是相似的批評已經有很多了,我實在寫不出任何新意,所

以除了表示傷心外,我沒有什麼壞話可說。相反,我準備說些好話說些有用的話。
    翻譯講就信、達、雅。其實做爲技術書只要作到達就好了,而這正是最難的。翻譯者要花點起碼的時

間來理解一下原著,我想這本書的譯者仍是花了一點時間去理解的,可是對這樣一本水平較高的書要搶時

間出版是不可能通過仔細研究和推敲的。所以建議對高階的書仍是直接出影印版,要麼就請高手作技術上

的支持。惋惜潘愛民老師沒有時間來翻譯這樣一本VB的書,但這本書的譯者至少要找一本翻譯得較好的COM

方面的書看看,這樣至少一些專有詞可以準確一點。
    這本書有些詞翻譯的實在很差,只能來猜。我要是有美圓,真想去Amazon買英文原版來看。好比Range

和Scope在必定的語境裏均可以翻譯成"範圍",但在這本書講SafeArray時,有幾處"超出範圍"實在讓人誤

解。還有"拆分"我原覺得是Split,看了幾處才知道應該是"終止"的意思,原文多是teardown或

Terminate,翻很差都翻成"終止"也行嘛。還有"丟棄錯誤"應該用"拋出錯誤"更好吧!至於全文將Marshal

譯成"排隊",把UnMarshal譯成"反排隊",那確定是沒看過潘老師的書。
    基本上這本書的翻譯只是在翻,根本就沒有好好譯,因此中文書可能變得比原文更很差理解。可是平

心而論,這本書的翻譯也的確不容易,並且代碼註釋很明智的沒有翻,大多數時候仍是可以猜出原意的。

我想Matt這本書的原文可能自己也不容易理解,因此不能徹底怪翻譯。

    結論,這是一本相見恨晚的VB寶書。

原文地址:http://blog.csdn.net/adambear/article/details/13706

相關文章
相關標籤/搜索