(编者按)《Inside VCL(VCL核心架构剖析)》一书出版以来,众多热心读者给李维先生、博文视点公司、CSDN写来信件,有更多朋友在各个论坛上发表关于该书的言论。读者们不但盛赞该书,还细心地指出了书中的失误之处。我们特将读者的意见和李维的回复整理出来,发布到CSDN,希望能集中回答一些读者的问题。
zhenyulu:
读完这本书,感觉写的真是不错。深入透彻、细致入微。只要是李维写的书,我都会买的,不会错。不过,看完后又有一丝隐隐的忧虑,VCL Framework的架构巧夺天工,但VCL.net却背负沉重包袱,就像 Visual Foxpro背负了FoxBASE的包袱一样。为了保留传统Object Pascal语言特色并且和VCL Framework兼容以及.NET兼容,VCL.NET采取了很多“补丁”技巧,使得编译出来的中间代码看起来要比C#复杂很多。尽管这样不会太影响效率并且似乎提供了很多C#所不具备的功能,但我仍然感觉到了在.NET上实现Object Pascal的艰辛。
现在Delphi 8已经正式推出,我以前在DELPHI 7上开发的程序已经无法编译下去,ADO已经不再支持,没有了指针,COM的声明也不再象从前。而且VCL Forms Application和Windows Forms Application并不兼容,因为采取了两套不同的Framework。VCL组件是不能使用在Windows Forms Application中的。不过Delphi 8也有耀眼之处:1、与Together的整合,真正做到了建模与程序设计同步进行(不过Vs.net中可以使用Together for vs.net实现);2、ECO(Enterprise Core Objects)提供了Object Space的概念,使得程序逻辑与物理存储相分离,非常好。3、DB Web也给人耳目一新的感觉,简化了Web Application的开发过程。如果所有这些能够在C# Builder上开花、结果,也许C# Builder会是Borland下一个盈利点。
李维:
谢谢您的来信指教。我想并不是Object Pascal在.NET上实现困难,而是VCL Framework具备了一些先进的功能是目前.NET环境无法提供的原因,Delphi程序语言本身并没有包袱,而是需要兼顾VCL.NET的兼容性。
Delphi 8是第一个.NET上的Delphi版本,但是Borland很快的会继续强化Delphi For .NET,你说的ADO(dbGo)已经被列为高优先开发项目,至于您说的没有指针则是我不太了解您意思的地方,希望您能进一步地说明。
Delphi 下一版本将有更大幅度的功能,例如ECO将会有多线程,Server Side以及Web ECO的功能,这些是许多了解ECO强大能力的程序员急于拥有的功能,当然DB Web也一定会出现在C#Builder之中。
最后还是谢谢您购买本书,也希望您能够再次不吝指教。
D-Lead:
这几天一直在看这本书,觉得这真是一本珍品,作者应该是花了大量的心血写作的,为什么这样说呢? 这从书中的许多地方可以看出来。
《Inside VCL》第1至3章的内容应该是李维为一些入门、中阶的程序员在进入后面章节之前铺下的准备之路, 对于一些高阶的Delphi程序员来说可能许多内容已经知道了,不过李维在这三章的贡献是比较全面和完整的呈现许多OO重要的观念以及对于了解VCL Framework的基础知识。特别是第3章,李维一开始就先整理出了VCL Framework使用来设计Framework的一些手法和技术,接着带领读者从VCL Framework的核心类来解释VCL Framework的设计架构并且印证前面整理出来的设计手法可以看出李维的用心。虽然许多人可能会觉得这些设计手法在很多书中都有看到,但是李维花时间从VCL Framework整理的功夫却令我敬佩, 更让我觉得有意思的是其中李维说的三明治和Bootstrap设计手法是我以前不知道的,由此可见李维是有独特的眼光和见解,在VCL Framework的Source Code中也印证了这些手法。
第4至5章是此书非常精彩的章节,因为这两章明白却详细的剖析了VCL Framework如何封装Window Message以及Window Message分派的机制。 在这两章中可充分看到李维的细腻阐述手法,为什么这样说呢?因为也许有一些高手Delphi程序员也大概能够从VCL的source中掌握,但是书中图5-4揭示了李维的高水平,因为他清楚地把Window的Pascal calling convention如何在VCL中转成stdcall再转成register call的过程说得非常明了。没有对Windows API和calling convention有深入的了解是不可能在数10万行的VCL Framework中注意到这个重要技术点的,在这里我就想给这本书5星的评价。
第6和第9章是我非常喜欢的章节,因为我从没看过一本Delphi的书籍把interface讲得这么全面和深入,我个人认为第6章是所有Delphi程序员都应该好好看看的。第9章也算是《Inside VCL》的重头戏吧,因为李维从VCL Framework中整理出了许多的Design Pattern,当然在前面的章节中李维也陆续地整理出VCL Framework使用的Design Pattern来,我个人比较喜欢的地方是李维也融合这些Design Pattern到范例程序中,让读者知道怎么在一般的应用中使用这些Design Pattern。
我观察李维写的书很久了,觉得李维实在很勤奋,因为他在每一个新版Delphi出来之后就会写新主题的书,虽然这些主题不一定适合所有的Delphi程序员,但不可否认李维勇于突破,从不以旧的内容充数,也不会只改改书中Delphi的版号就出新书,这样的做法是国内作者中少见的。从李维敢挑战VCL Framework,写出世界第1本专门讨论VCL Framework的书的勇气来看,就值得给予5星的评价,更不用说书籍最后呈现的内容和品质都堪称国内一流的水平。如果真要找此书不足之处,就我的观点是最后讨论VCL.NET的篇幅我觉得还不够多,进入的门坎高,不懂.NET的读者可能在阅读上有点困难,而我则是看得还不过瘾。希望李维能够再接再厉的写一本真正讨论Delphi.NET的书籍。
李维:
看了您的书评真是让我汗颜,《Inside VCL》在2003年是第一个版本,仍然有许多可以改善的地方,也有许多读者提供了各种不同的意见,笔者都感谢各位先进的批评和指教。就像写软件一样,一旦软件发布之后会马上觉得做得还不够好,还有更多的东西可以写、可以改善、可以加进去。然而在一个时间点是一定要发布的,否则这将是一个永无止境的循环。笔者也希望《Inside VCL》能够继续有第2版、第3版等等,让这本书能够变得更好。
最后有关Delphi.NET的书籍,笔者在Inside VCL的最后一章是希望让读者了解VCL Framework如何移植到.NET,VCL Framework在Win32下也将持续的开发,因为Borland仍然有计划推出新的Delphi For Win32版本。笔者知道Inside VCL第10章的门槛较高,没有.NET一定知识的读者可能在阅读时有困难。因此读者如果真的有困难可以先浏览此章,得到一个VCL Framework移植的工程概念即可,等到读者阅读了其它.NET书籍之后可以再回来看本章比较偏技术的细节内容就可以明了了。当然,Delphi.NET会有完整的书籍来讨论,笔者也希望拙作《Delphi.NET Developer Guide》能够早日上市。
最后还是谢谢您花时间写了这么长,这么好的书评。
chaneerac(来自台湾深度论坛):
请问李维先生,看您的《Inside VCL》,需要什么样的基础才可看的懂呢?
李维:
很难说,有的章节虽然谈的比较深,但是依序看我觉得没有问题,有一些章节则牵涉比较深广,到了后面的章节会更深,例如第9章讨论VCL的Design Pattern,第10章讨论VCL如何Port成VCL.NET,其中就有设计和语言实现的内容。
不过看《Inside VCL》可以有几种不同的方法,你可以从观念的角度来看VCL、VCL.NET,由此可吸取设计观念和技巧。你可以从实现角的度来学习VCL使用的高级Coding技巧,你也可以从学习如何使用Design Pattern的角度来印证VCL如何使用和发展Design Pattern,你也可以从Framework/Platform的演变看看VCL如何Adapt成VCL.NET。有的东西如果一下子不懂你可以先看其它的内容,或是问问你身边的高手。
总之《Borland传奇》和《Inside VCL》和我以前写的东西很不同,你可以看看书中列出的目录应该就可以略知一二了。
syntax (来自台湾深度论坛):
很棒的一本书,在市场上充斥着“快快乐乐”类型的书籍时,已经好久没有如此有程度的中文书籍了,就算外文书看得懂,我还是喜欢看母语书籍,昨晚刚买,看了大体架构,并读了约20多分钟,感觉还不错,文字流畅,观念表达清楚,看的人可谓通体舒畅,很棒喔!
看到之前已有人回报Bug,不过没看到我所要报告的,如果重复请勿见怪。
Page 2-29 最上两行文字(简体版59页靠下的一段文字)所说的观念有错,MethodName 不是似乎只会对从 TComponent 继承下来的类的 Published 方法才有作用,而是MethodAddress / MethodName 都只会对自己的调用有反应,由其他对象来调用不会有结果。在 Page2-26 ShowMethodAddress 中使用的是 aObj.MethodAddress (aObj is TDertived) ,而在 Button7Click 使用的是 MethodAddress,此时是调用 self.MethodAddress 而不是 TDertived.MethodAddress,所以就算是将 TBase 的继承由 TObject 改为 TComponent,仍然是同样的结果——找不到,因为此两方法都是以调用自己的对象为参考依据,所以在 self.MethodAddress 中 Self 是 TForm1,而 TForm1 并不含有 MyMethod1 or MyMethod2 ,因此传回的值是“找不到”,同理,Button8Click 因为 OnClick 是 self.MethodAddress (Self 是 TForm1) 的一个方法,所以有值传回。反证:可以将 Button7Click 中
aPtr := Pointer(@TDertived.MyMethod2)
sData := MethodName(aPtr)
TDertived.MyMethod2 改成 OnClick
会发现,找到并有值传回。
~~特此回报~~
最后,希望能在 4~5 天内将全书读毕,到时还有发现问题,一定马上跟作者您报告。
李维:
是,我已经知道这个问题,《Inside VCL》的一些打字错误和这个问题会在再版中修正。有关MethodName/MethidAddress的问题不一定是书的错误,而是服务定义和实现的不同。在根对象中定义的方法应该是基础服务,特别是当MethodName/MethodAddreess被定义成class method时。依照class method的基本含意,所有Object Instance或是经由class都可以调用, 因此MethodName/MethidAddress根据Contract应该是需要回传正确数值的.然而对于由他对象来调用不会有结果在书中不会回传正确值才会觉得奇怪,这一部份是实现的差异,我个人觉得这是VCL中服务定义和实现不太一致的地方,在书籍再版中会以注释向读者说明。我不觉得是书中说明的错误,因为VCL这样的设计违反了OCP规范,只是书中没有补充说明清楚。
cocoboy79(来自台湾深度论坛):
呵呵,我过年这几天也在看,感觉读了书里面的那些关于设计模式的内容真是受益不少。其实看好书也是一种休息。
李维:
谢谢,我也觉得VCL使用的一些设计模式真的很好用,我把这些技巧也用在我日常写的程序中,真好。
pcplayer(来自台湾深度论坛):
新年好!
我是在年三十那天把《Inside VCL》读完的。感觉这书的确非常不错,早两年出就更好了。
李维:
你阅读的速度真快,看到读者这么快的把我写了这么久的书看完心中一则一喜,又有种特别的感觉,写书的速度真是太慢了。这本书能够出版我就很高兴了,要不是yeka锲而不舍地想出这本书,这将是本可能永远不会出版的书藉。