VB和COM的宝书

类别:VB语言 点击:0 评论:0 推荐:

                      VB和COM的宝书
关键字:Advanced Visual Basic、VB、COM、高级、书评
难度:高级

    Matthew Curland的《Advanced Visual Basic》,一本不折不扣的VB宝书。一个星期前我终于收到从

上海新风雨网络书城(http://www.cnforyou.com)邮购的这本书的中译本《高级Viusual Basic编程》。

中国电力出版社2001年5月出版,时隔近一年还能够买得到,可见这本书卖得不算好。这几天挑灯夜读,感

慨不少。所以虽然我对这本书的理解还不到二成,虽然我自己都觉得没有任何资格来为这本书写书评,但

还是来谈点自己的感想。
    下面所说的,有些完全是个人观点,非常无知,请您不要笑。

    一、宝书还是天书?
    《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大师的功力,就能理解什么叫

真正的深入。
    可以说,这本书是VB深度探险所必备的一本魔法书,它为VB英雄们全面展开了COM的地图。不过学习它

需要很高的力量、法力和经验值,如果你的等级不够,就只能把它存放在宝物箱里,而不能把它带在身上


    因为要象Matt这样深挖VB和COM技术,需要非常全面的技术功底。不怕你笑话,我看了几天,很多地方

我都无法理解,这一方面是因为中文翻译较差,另一方面也是因为很多COM方面的细节问题Matt都没有好好

解释。
    因此在看这本书之前,还是应该先看看其它COM原理方面的书,以打好基础,否则这本宝书就会变成一

本天书,只能用来治疗失眠。
   
    二、高级还是低级?
    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在底下所做的一切。

    三、简单还是复杂
    前面说了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类已经封装的不错了,会用接口聚合器,理解接口函数是如何重定向就足够做出高效灵活

的对象了。
       
    四、有用还是没用? 
    我前面就说过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。

    五、翻还是译
    本来想好好批评一下这本书的翻译水平,可是类似的批评已经有不少了,我实在写不出任何新意,所

以除了表示伤心外,我没有什么坏话可说。相反,我准备说些好话说些有用的话。
    翻译讲就信、达、雅。其实作为技术书只要做到达就行了,而这正是最难的。翻译者要花点起码的时

间来理解一下原著,我想这本书的译者还是花了一点时间去理解的,但是对这样一本水平较高的书要抢时

间出版是不可能经过仔细研究和推敲的。因此建议对高阶的书还是直接出影印版,要么就请高手做技术上

的支持。可惜潘爱民老师没有时间来翻译这样一本VB的书,但这本书的译者至少要找一本翻译得较好的COM

方面的书看看,这样至少一些专有词能够准确一点。
    这本书有些词翻译的实在不好,只能来猜。我要是有美元,真想去Amazon买英文原版来看。比如Range

和Scope在一定的语境里都可以翻译成"范围",但在这本书讲SafeArray时,有几处"超出范围"实在让人误

解。还有"拆分"我原以为是Split,看了几处才知道应该是"终止"的意思,原文可能是teardown或

Terminate,翻不好都翻成"终止"也行嘛。还有"丢弃错误"应该用"抛出错误"更好吧!至于全文将Marshal

译成"排队",把UnMarshal译成"反排队",那肯定是没看过潘老师的书。
    基本上这本书的翻译只是在翻,根本就没有好好译,所以中文书可能变得比原文更不好理解。但是平

心而论,这本书的翻译也的确不容易,而且代码注释很明智的没有翻,大多数时候还是能够猜出原意的。

我想Matt这本书的原文可能本身也不容易理解,所以不能完全怪翻译。

    结论,这是一本相见恨晚的VB宝书。
   
   

本文地址:http://com.8s8s.com/it/it6402.htm