感叹:
设计VCL的人真是神人啊,感觉比Pascal编译器的设计人还要牛很多,把整个Windows架构理了一遍,封装的如此之好,复用的如此之好(以至于Delphi的控件满天飞,使用还特别容易),简直惊为天人。
难怪charles petzold当初觉得不可能用PASCAL语言做Windows编程(李维说的),以前我对这句话的理解是,Pascal语言本身达不到windows编程的要求,可能是因为他这方面的功力达不到(觉得可能是因为petzold对比anders的编译器功力相差太远,不知道编译器的许多细节可以达到这一要求)。而我一直觉得语言不过是语法糖,变来变去其实都是一回事,通过高超的编译器手段,用PASCAL语言翻译一下有什么不可以的。今天忽然觉得,charles petzold可能是指VCL不能很好全面的封装windows API,也许会封装的很肤浅(那样岂不是等同于失败),也许会有诸多不适应(能用但别扭,作为一个世界级的编程平台,仍然等同于失败,petzold可能是指这个意思),但最终Pascal编译器+VCL库+IDE的设计(这个相对次要一点)达到了Windows编程的目的(90年代Delphi火成什么样了,后来是有诸多失误Borland才完蛋的:收购dbase,开发office,不受欢迎的kylix,不支持unicode,Web开发落伍,人才流失,妄图精力集中于ALM,盲目跟随.Net战略导致失败的Delphi8与C#编译器,资金实力不够等等),早点学EMB做踏踏实实的开发,不可能会完蛋),而且VCL的设计是如此成功,简直难以置信,如今FireMonkey跨平台编程,照样堂而皇之的继承自VCL的TComponent,一点问题没有(从TControl开始已经是Windows编程了,所以舍弃)。
我对全局变量函数与OOP编程关系的一点体会:
1. 多年以前学Java的时候,面对诸多Get/Set觉得很麻烦,但又只能这样,似乎天经地义。其实Delphi里早就准备好了了property(java和delphi项目都开始于1995年),好用又更安全。现在C#也学会了,Java好像至今没有。放在IDE里还能强迫其设置正确的值。
2. 以前看Bjarne Stroustrup的书,总是提到一句话,要是C++能够去掉C语言的特性而实现纯OOP就好了,觉得可能是这么一回事(毕竟人家是大师)。
另外我发现Java也好,C++也好,调用类的静态变量/静态很别扭,要写上长长的类名前缀,而且还没有什么很大意义。
而且书上总是强调:编程要尽量不使用全局变量(哦,还没提到全局函数呢。在他们眼里哪有全局函数这个概念呢)。
现在看了Delphi的源码,通过实际使用体会,感觉事情不是那么绝对,还是OOP与过程编程结合最好。允许使用全局变量和全局函数最好(何况还可以带上Unit名称加以区别)。这样既不失OOP的编程特性(只要需要,不需要的话也就可以使用全局变量了)(有哪个语言的复用能超过Delphi),又特别方便,编译器自动帮助找到全局函数和全局变量,若参数不同,还能自动判断使用哪一个,全局函数也重载!不像Python,为了实现这个方便好用的特征,还饶了一道弯子:通过两种不同的import语法来实现(但这也间接说明直接使用全局函数是有用的),而Java和C++根本没有这个特点。Bjarne Stroustrup可能还是学者的研究味太浓了,Borland的工程师早就把实际工作做的炉火纯青。所以尽管Pascal语言本身小众(尽管语言不是私有的,但世界上就Borland一家公司在发展它),但Delphi却始终立于不败之地。反过来说,Pascal这么小众,Borland又没什么钱,如果不是诸多特性这样优秀,Delphi/Pascal早就被世界潮流淘汰到垃圾堆里去了。
3. 说了这么多,不知道与Delphi地位相近的VB在各方面是怎么样一个情况?有空可以了解一下。