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