读者盛赞Inside VCL,李维一一作答

    技术2022-05-11  230

    (编者按)《Inside VCL(VCL核心架构剖析)》一书出版以来,众多热心读者给李维先生、博文视点公司、写来信件,有更多朋友在各个论坛上发表关于该书的言论。读者们不但盛赞该书,还细心地指出了书中的失误之处。我们特将读者的意见和李维的回复整理出来,发布到,希望能集中回答一些读者的问题。   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 ApplicationWindows Forms Application并不兼容,因为采取了两套不同的 FrameworkVCL组件是不能使用在 Windows Forms Application中的。不过 Delphi 8也有耀眼之处: 1、与 Together的整合,真正做到了建模与程序设计同步进行(不过 Vs.net中可以使用 Together for vs.net实现); 2ECOEnterprise Core Objects)提供了 Object Space的概念,使得程序逻辑与物理存储相分离,非常好。 3DB 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》第 13章的内容应该是李维为一些入门、中阶的程序员在进入后面章节之前铺下的准备之路, 对于一些高阶的 Delphi程序员来说可能许多内容已经知道了,不过李维在这三章的贡献是比较全面和完整的呈现许多 OO重要的观念以及对于了解 VCL Framework的基础知识。特别是第 3章,李维一开始就先整理出了 VCL Framework使用来设计 Framework的一些手法和技术,接着带领读者从 VCL Framework的核心类来解释 VCL Framework的设计架构并且印证前面整理出来的设计手法可以看出李维的用心。虽然许多人可能会觉得这些设计手法在很多书中都有看到,但是李维花时间从 VCL Framework整理的功夫却令我敬佩, 更让我觉得有意思的是其中李维说的三明治和 Bootstrap设计手法是我以前不知道的,由此可见李维是有独特的眼光和见解,在 VCL FrameworkSource Code中也印证了这些手法。       第 45章是此书非常精彩的章节,因为这两章明白却详细的剖析了 VCL Framework如何封装 Window Message以及 Window Message分派的机制。 在这两章中可充分看到李维的细腻阐述手法,为什么这样说呢?因为也许有一些高手 Delphi程序员也大概能够从 VCLsource中掌握,但是书中图 5-4揭示了李维的高水平,因为他清楚地把 WindowPascal calling convention如何在 VCL中转成 stdcall再转成 register call的过程说得非常明了。没有对 Windows APIcalling 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如何移植到 .NETVCL FrameworkWin32下也将持续的开发,因为 Borland仍然有计划推出新的 Delphi For Win32版本。笔者知道 Inside VCL10章的门槛较高,没有 .NET一定知识的读者可能在阅读时有困难。因此读者如果真的有困难可以先浏览此章,得到一个 VCL Framework移植的工程概念即可,等到读者阅读了其它 .NET书籍之后可以再回来看本章比较偏技术的细节内容就可以明了了。当然, Delphi.NET会有完整的书籍来讨论,笔者也希望拙作《 Delphi.NET Developer Guide》能够早日上市。 最后还是谢谢您花时间写了这么长,这么好的书评。     chaneerac(来自台湾深度论坛):     请问李维先生,看您的《 Inside VCL》,需要什么样的基础才可看的懂呢 ?   李维:     很难说,有的章节虽然谈的比较深,但是依序看我觉得没有问题,有一些章节则牵涉比较深广,到了后面的章节会更深,例如第 9章讨论 VCLDesign Pattern,第 10章讨论 VCL如何 PortVCL.NET,其中就有设计和语言实现的内容。       不过看《 Inside VCL》可以有几种不同的方法,你可以从观念的角度来看 VCLVCL.NET,由此可吸取设计观念和技巧。你可以从实现角的度来学习 VCL使用的高级 Coding技巧,你也可以从学习如何使用 Design Pattern的角度来印证 VCL如何使用和发展 Design Pattern,你也可以从 Framework/Platform的演变看看 VCL如何 AdaptVCL.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 会发现,找到并有值传回。   ~~特此回报~~       最后,希望能在 45 天内将全书读毕,到时还有发现问题,一定马上跟作者您报告。   李维:     是,我已经知道这个问题,《 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锲而不舍地想出这本书,这将是本可能永远不会出版的书藉。  

    最新回复(0)