俺所尊敬的与月共舞老大的意见:论坛上有朋友发贴探讨阅读VCL的经验,我先回复一下,希望大家可以在邮件列表中讨论起来。分析VCL源代码也是有很多层面的,在不同的学习阶段看同样的代码也会有不同的体会,下面简单谈谈我的一些经验:1、一开始阅读VCL代码,最直观的感受是代码的规范性,VCL的代码是非常清晰、简洁、易读、高效的,几乎找不到一行多余的代码。虽然代码量大,注释少,但还是比较容易理解。阅读VCL代码,让我养成了不管写任何代码都要一丝不苟的习惯。2、代码实现的技巧和对VCL的深入理解。VCL的代码毕竟是最优秀的Delphi大师千锤百炼的成果,对程序语言本身的运用以及数据结构、算法设计等方面的实现,对我们都有着极大的参考价值。虽然有些代码一时不容易读懂,特别是涉及到其它领域知识的部分(如设计模式),不过多读多用就会慢慢理解。分析发VCL的实现机理,对我们在开发中编写有效的代码也非常有帮助,可以避免走弯路。3、整个VCL体系结构的设计思想。前面的阅读让我们“知其然”,再往后就是分析“其所以然”。为什么Borland的工程师要这样来设计VCL?VCL是怎样一步一步演化来的?如果是我来设计,我会怎样开发自己的组件库?如果有时间,也可以看看介绍VCL体系的书籍,如李维的《Inside VCL》等,带着自己思考的结果和疑问来看书,收获更大。4、知识和智慧源于思考,有了前面的经验和自己的想法就可以去行动,编写一些有趣的控件,加深对VCL组件的认识和理解。也可以写一些文章总结自己的思想,与其它人交流扩展自己的知识面等。写文章其实是非常有益的工作,即可锻练自己的文字表达能力,又可锻练内容组织和思维能力,还可与别人交流经验,一举多得,呵呵。也希望大家在 CnPack 邮件列表中能多多探讨!               周劲羽  2004-08-30

解决方案 »

  1.   

    俺的:有关阅读vcl的经验,我曾经给老罗说过一些。这里发过来吧。本来主要是说提高架构能力的:
    看Vcl好结合基础知识和以往开发的知识配合才会产生自己的想法。
    说架构经验:
    架构优势首先建立在大代码量上。小代码量的,建立架构的时间浪费了开发周期。其次是在企业级的重用开发上,在一个软件适用领域,不管怎么做项目,都脱不开这个领域的一些特征。总结一些特征,就发挥了FramWork的优势了。我现在做的工作也正是这个。前提是企业级的,需要讲项目成本,讲研发周期,项目制作周期的。个人软件或许不会这么重视。提高方法总结:架构的优势就是可扩展和可重用,在做小项目可重用可以不考虑。在这两条的前提下有两点必须。一、对以往项目的总结,就像老罗说的那些,10万代码量只说明一个时段的经验总结。没有一哪来二?或许以后把前面的代码完全摒弃,但是这些经验的总结会成为高效架构的一个大优势。总结自己的经验还远远不够,总结他人的会有更多想法提高。开源软件的用处很大。又要提一下我现在的工作,原来公司的那个架构已经不适用了,技术总监辞职了,现在我来担任基础架构的设计。总结他的一些想法,然后扩展我的想法也是我的经验。现在是个学习的好机会。:〉二、学习好的架构技术,我说的是诸如《设计模式》《敏捷软件开发》之类的经验总结书。设计模式这本书并不厚,但说的东西太多。然后是《重构》这样的书籍,尽管说到重构了,是弥补设计不足的时候,但是知道所不足,才能知道设计的时候怎么高效设计。但这些东西真正用得上,又得带着这些知识来开发。在我的感觉这时候真的是很痛苦,面对好东西不知用在什么地方。不过开发久了,自然而然就用得上了。使用delphi很幸运,可以看VCL的代码。作为一个非常成功的Framework,窥其九牛一毛就受益匪浅。总之:一个学习总结,再学习再总结的过程。读Vcl的经验:
    真正理解Vcl还是靠Dreamtheater大哥的指点,尽管大哥对delphi用得很少,vcl也没有我看得多。但是一看就看到点子上。短短一年下来,他给我指的几个要点,让我以前的知识全部串联起来了。就这点,我很感激他。我的总结,了解一个框架,首先得了解它设计的意图,为什么要这么去设计。然后了解组成的机理。从基础开始。也就是说从根开始,可以说寻根溯源。经历:那时候我还在宁波,也就是去年这个时候。大哥首先说我,你不真正明白消息处理机制,你怎么理解vcl为什么要这么做?大哥又告诉我,你不了解TObject的机理,怎么真正了解Vcl?他甚至怀疑我没有看过vcl的代码。唉…… 我浮躁,囫囵吞枣,其实什么都不懂。感叹白用delphi五年。踏踏实实的用罗云彬的那本书,把消息机制再巩固一遍,作为基础,然后把TObject为什么这么建立。一个基础类是怎么建立的搞明之后。顺序把主干类的定义和技术细节看一遍,持久类TPersistent,然后看组件类TComponent代码,然后是控件类TControl,TWinControl,如何把复杂的消息分工使用。尽管对里面技术细节还不是很理解,但目的已经达到了。再编写控件就不浑浑噩噩的写了,因为我理解了vcl的封装机理。适时地Inside VCL这本书的出版。我很幸运哦。:〉谈论有关设计:
    其实不管怎么设计,怎么编码。其实还是那句伟大的话:程序 = 算法 + 数据结构。比较好的设计就是把这二者协调的好的设计。所谓的过程化设计、模块化设计、对象化设计在我的实践中认为,这些东西只不过是不适合某些开发,违背了重复代码的大原则等等,应运而生的东西。老的汇编和老式的Basic一个大大的流程下来。随着代码量的增加,算法的增多,Dijkstra老先生在1968年提出了模块化设计。把技术细节提取出来。不要掺杂在一起。代码量继续增加,许多不同的数据加入进来,为了协调处理不同数据的各种算法,不知道谁提出了对象化设计。把处理同一种类型数据的模块,包括数据本身都看成一个对象。继续把技术细节提取出来。再怎么设计,只不过更好的改进数据和算法之间的关系,使之思路更清晰,更容易维护,更容易扩展。对方法的选择。也建立在这基础的基础——数据和算法上。举个设计模式的例子,设计模式中的策略和模板是两个看上去类似但目的截然相反的模式。而他们的区别就是在数据和算法上,策略模式是在数据源已定的情况下,算法不确定有多种可能的情况而使用的,派生类定义的不同的算法被称为不同的数据处理“策略”。模板模式与之相反就在各种算法是确定的,而数据源是不定的,而这些定义好的算法就是“模板”,数据源在派生种定义。设计之初就要把数据摆出来,看看需要的数据有哪些,然后根据具体情况定义合适数据结构,预计处理数据的算法摆出来。根据确定性,不确定性,扩展性等基本特性,然后做出相应的设计。这就是所谓Designer的工作了。算是自我总结吧。最后自己的总结,其实也是这一段时间的总结:  学习的一个很有意思的规律,基础知识掌握到了一定程度,仿佛看一些所谓的“高深”的理论和代码,都是水到渠成的事情。  VCL,设计之初就是为了windows设计的,而消息机制是里面的核心部分,从TObject就为这个作铺垫了,以次一步步建立起来。  看Vcl的代码,真正明白TObject的东西,就明白了Vcl一半了,核心是一定要掌握的。设计的源头一般是很难理解的,尽管简单。  其实Inside vcl也没有真正把TObject的机理介绍清楚。  了解意图,了解目的,了解手法。
      

  2.   

    超级无敌的Passion老头(这是我对Passion地称呼):Leeon写了这么多,确实是非常宝贵的经验。一般来说VCL代码的开始入门的阅读都是自末向枝再到根的,但这个顺序并非足够平坦。初学者开始VCL代码阅读之旅通常是为了研究某个具体控件的机制,或对某事件某属性的疑问与好奇,从而借着Ctrl加Click来闯入VCL的大门。然而门内的东西繁复无比,知道了一点,不知道两点;知其然,不知所以然。因而放弃的有之,然而更多的,是坚持了下来认真阅读。但如果没找到一个合适的切入点,不能提纲挈领地领会所需要的架构,那么这样的坚持阅读便无异于事倍功半。——不少VCL的阅读经验都是提倡从TObject读起,了解构造/析构的基本机制,再熟悉TPersistent的流化和赋值,熟悉TComponent的父子关系和持久载入,熟悉TControl的可视的抽象和Parent机制,熟悉TWinControl和Windows控件的无缝接合,从而慢慢领悟一些标准可视化控件的机制。但这样从头读起,对于基础较差或急于有点成效的朋友来说,确实是个困难所在。我这里说说我自己的一点小习惯(大道理就不说了):从VCL树的枝节开始往上转悠而基本上能无碍地理解到TComponent,这样的情况对于初学者来说比较少。因而可以在中间截取关键点(类似于checkpoint),比如阅读可视类控件的时候,可以将TWinControl作为目标,一口气理解到TWinControl为止(可以不包括TWinControl)。如果这仍然比较困难,可以再朝下,如读Button的时候以TButtonControl为目标,体会各类Button的共性与抽象的思想,然后可以根据思想再看看TSpeedButton等其他东西。这样从枝节摸起,比较容易有成就感,因此积极性也稍微高点。但要注意的是,这样的“成就”只意味着大头,不意味着小节。各个大头到时候还是得朝上摸索朝根部发展。因此可以继续选Checkpoint,继续递归似的阅读。如果在checkpoint处碰到了困难暂时无法弄懂的时候,可从其他资料中参考有关的信息(比如说TWinControl具有句柄,和Windows控件有着对应关系等等),在头脑中将其“规定”为实现此类功能或拥有此类机制的“黑盒”,从而暂时屏弃其内部实现,先拿它作为一块现成的砖头填到思维的墙壁中再说,等有空的时候,再去砸碎这块砖头研究其粉末。当枝节部分摸索得有一定心得的时候,就可能对checkpoint们的实现更加有兴趣,此时便可对砖头开砸,了解其内涵,从而慢慢到达根。了解根的时候是需要有一定的基础的,否则即使死记硬背了其实现和规矩,也没法在其子类中体会其设计思想,甚至也搞不清它为啥要这样做,所以,总得有个慢慢熟悉的过程。
        另外,一个人的思维没法一直都连贯地跳跃,当你查看某个控件的机制的时候,可能子类不懂,看其父类,父类还不够懂,再跳到爷类(^_^,自创的词),这样即使具有超强的阅读理解能力,等到爷类或爷爷类的时候,也许早把前面读的初衷给忘记了。这样读只适合于“消遣”式的无目的的读,而不适合于抱着问题去寻求答案的方式。另外,VCL是Windows上的Framework,无论怎样封装,它最终还是可以和WindowsAPI和消息机制扯上钩,因此Windows的底层知识对VCL的基类等的了解具有莫大的帮助,如果不了解Windows机制,VCL的阅读寻源还只是浮沙上的别墅,总是不扎实的。
      

  3.   

    也不要过分迷信Vcl,我个人感觉就是继承太多了,可能老外的脑子就是和我们的不一样
    毕竟是喝牛奶长大的。
      

  4.   

    Brain Kernighan曾经引用这么一句话:总而言之,只有熟悉了这个领域的工具和技术才能对特殊的问题提供正确的解答,只有丰富的经验才能提供坚实的专业性结果。我们在这里讨论的是学习Vcl的心得和体会,一些人就开始说迷信二字,何谓迷信?真正了解了吗?就说三道四?小眼镜,你说什么呢?
      

  5.   

    而且,小眼镜,你看没有看周劲雨和刘啸说的什么?你有没有看我LiKe说了些什么就在这里说?老罗在轻描淡写提出的问题,大家讨论你又不是没有看!你怎么理解的?
      

  6.   

    也不是说猪研究领域的生物学家是错的,他们的存在可以辅助厨师做出更好的猪肉餐(比喻而已,没必要考究这个比喻的有效性)。职责不同,各行其道,生物学家劝说厨师搞生物研究这就不对头了(本想说个成语的,但突然忘了),厨师不愿意搞生物研究那就没办法。当然厨师能花点时间研究猪也是好的,多学点东西没有错误。但厨师学什么,主动权在厨师手上,而不在生物学家的劝说,在说每个人都因自己的领域和个方面因素而有自己的立场,生物学家说研究猪的重要性比厨艺高,厨师说厨艺比研究猪的重要性高都不能算错,所以出现某某大师说研究XXX是搞YYY的必须前提也有个人立场影响,那些不搞YYY的而搞XXXX的难道就不行么?至少现在民工做房子不研究原材料对他做房子没影响,原材料的选购和开销评估不是他们的事情。当然也有不少的“少数”民工想主动研究一些底层的,如砖的制造工艺,这些对他们前途有好处,但不是没有这些好处他们就活不了。有些厨师固步自封,学了一点就可以了,但生物学家没有法律的支持让他要求厨师学生物,这只是一个社会道德问题了
      

  7.   

    小眼镜,我不信一个好厨师对自己的原料毫无了解。对他的佐料毫无了解。对他的手里面的锅碗瓢盆一点都不了解。打死我也不信,对自己原料一点都不了解的厨师能做出什么菜?你叫一个杭州厨子用海鱼做出知名的糖醋鱼!能吃吗?他研究了如何将鱼做得很好吃!你叫一个鲁菜厨子拿南方的嫩豆腐来做赤磷鱼汤!拿能吃吗?????这可是他钻研了很久的一道菜!王义夫别看拿了奥运会冠军,你应该知道,每次子弹都是他到子弹厂自己去认真挑选的。子弹他非常了解,如果叫他做,他也能做得出来!你站在什么样的角度来看待Vcl的???
      

  8.   

    你的学习出发点就是一个误区,学了原理就要去研究?知道生物学原理就要养猪?你学编译原理干吗,我知道你写了自己脚本语言!你学操作系统就是为了写一个操作系统?学了Vcl就要去研究并且开发一个Vcl?理解了之后会更好的使用这个东西。为什么Inside C++ Object Modal这种书会出版??难道叫你再去写一个C++?不排除一些是民工,只需要组装,不需要关心。但是我有我的立场,我现在需要建立框架,这是我现在的工作,我需要为整个公司的项目制作人员服务!我不能去做民工,所以我要和懂得人交流!所以为才在这里开帖大家来讨论!但是,人往高处走!不想当元帅的士兵不是好士兵!你以为人人都去做民工?人人都去做只做几道菜的厨子?王义夫是最好的例子,他对子弹对枪的了解让他能取得今天的成就!枪不是他造的!子弹也不是!
      

  9.   

    当然厨师应该知道它的原料啊但不至于对猪的生活习性,种类,世界分布,骨骼结构,生理特点等都了如指掌,因为这个不是他做的事情。王义夫是射击高手,但他也不至于为此学习动力流体学,有机化学等深入子弹制造工艺的技术
    我对VCL的看法嘛,世界上总有人去深入研究VCL的,他们努力研究,他们得出成果,被其他人利用。他们的成果辅助了他人的开发,他们是伟大的,但并不是人人都是伟大的。没有必要人人都放弃原本可以从别人经验学来的东西,而自己研究,这样只会带来所有的开发过程极度缓慢,甚至会影响全球经济。在适当的情况下,借鉴别人的成果,只会对自己有利而无害,但自己有时间的时候,能利用空闲时间来自己充当这研究的先锋,给别人的工作开路带来方便也是不错的。
      

  10.   

    你错了,王义夫知道子弹的制造工艺。你没有看过王义夫的采访不要乱讲,他辛苦去那么远的地方挑子弹,他很清楚。>>>没有必要人人都放弃原本可以从别人经验学来的东西现在就是在学经验,知道Vcl的机理才能更好的使用。难道你没有看Inside vcl吗?而且个人有个人的见解!李维并不是权威,他说的也有他的缺陷!而就vcl这个小框架来说,花不了多长时间。会影响到全球经济?你不是花了三天就看完了Inside Vcl吗?
      

  11.   

    王义夫就是要到子弹厂去看他们的制作工艺,原料采集。并不是别人买回来的他就用了!>>>>当然厨师应该知道它的原料啊>>>>>>但不至于对猪的生活习性,种类,世界分布,骨骼结构,生理特点等都了如指掌,因为这个不是他做的事情。
    你是不是把庖丁解牛给忘了?庖丁对于他所解的牛了解不够深????生理特点,骨骼结构不了解?????
      

  12.   

    我个人并不反对深入研究底层,也不反对什么都不研究,因为我没资格反对任何事情。别人不会因为我反对而取消他的行为。反对无意义我个人偏向自然发展和人在发展中起的作用。但对他人我无约束能力,所以对于“你站在什么样的角度来看待Vcl的???”我没角度
      

  13.   

    唉…… 你啊你,我的原则是让知道的人在这里发表自己的感想,这是我的题目!可你在说什么?如果你反对,或者不理解,你可以保持沉默!---------------------------
    >>框架辅助开发,也算是工具。
    工具是服务于人的,人应该了解它能更好的服务于人。
    而不能迷信工具,花了太多时间在不应该花时间的事情上,人反而成了工具的奴隶,身体成了工具的躯体,灵魂却被工具所占据。把灵魂出卖给魔鬼获取更多的利益,不如交给上帝
    -----------------------这些里面有几句是说Vcl的?上帝是VCL?魔鬼是VCL???_____________________例如传教士发扬上帝论,都好几个世纪,依然还是那么多人不相信上帝
    ___________这是VCL吗?相信不相信上帝是人们自己的事情,你去问问欧洲人,美国人,这个具备普遍意义吧,你去问问英国人有几个不信上帝的?圣经是所有欧美国家卖书卖的最多的!!!!!宣传是另一码事。
    我不明白你学数学是为什么?你学数学是为了搞数论,数学研究,还是数学模型?你上学是为了什么?你上课是为了什么?你看书是为了什么?你写程序是为了什么?是的,大家都学,可是没有几个人是数学家,毕竟不是每个人都是专家。但是为什么要学?被强迫???生存欲望?我只不过举一些大家都知道的例子!人们较信服的例子!是的,上面周劲羽的例子你不看,你还说我狡辩!刘啸的例子你不看,说我狡辩!老罗的例子也是狡辩?cg1120、风炎、Ehom他们也是狡辩?
      

  14.   

    >>>>生活就像强奸,不能反抗就好好……靠!不是我骂你!这是谁说的歪理邪说!你拿出来做凭据了!这就是你脑子充斥的事情?生活什么时候像强奸了?????别以为受了点挫折就以为谁谁强奸了你!你脑袋不要充斥这种负面思想!你变了,你不是原来开朗的人了!我无话可说了……
      

  15.   

    坚强起来!如果生活像被强奸!那这么多人活着还有什么意思?别听网络中那些人胡扯淡!如果生活这样颓废,还会有那么多美好的东西?说这些话的人,TMD,跟F L G那些人没有什么区别!我们生活在别人制定的游戏规则中,自然要遵守这些游戏规则。不管生存,生活,工作,学习,都是如此。老鼠是因为它的无知,它靠生存的本能来判断,而你是人!命运把握在自己手里!!!!!!!!!!!!