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