感叹:
设计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在各方面是怎么样一个情况?有空可以了解一下。

Delphi研究,对全局变量函数与OOP编程关系的一点体会 good的更多相关文章

  1. 函数响应式编程(FRP)从入门到”放弃”——基础概念篇

    前言 研究ReactiveCocoa一段时间了,是时候总结一下学到的一些知识了. 一.函数响应式编程 说道函数响应式编程,就不得不提到函数式编程,它们俩到底有什么关系呢?今天我们就详细的解析一下他们的 ...

  2. PHP面向对象(OOP)编程入门教程

    面向对象编程(OOP)是我们编程的一项基本技能,PHP5对OOP提供了良好的支持.如何使用OOP的思想来进行PHP的高级编程,对于提高 PHP编程能力和规划好Web开发构架都是非常有意义的.下面我们就 ...

  3. php面向对象(OOP)编程完全教程

    摘自:http://www.php-note.com/article/detail/41 面向对象编程(OOP)是我们编程的一项基本技能,PHP5对OOP提供了良好的支持.如何使用OOP的思想来进行P ...

  4. Python核心编程读笔 10:函数和函数式编程

    第11章 函数和函数式编程 一 调用函数  1 关键字参数 def foo(x): foo_suite # presumably does some processing with 'x' 标准调用 ...

  5. js原生设计模式——4安全的工厂方法模式之oop编程增强版

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  6. RxJS入门之函数响应式编程

    一.函数式编程 1.声明式(Declarativ) 和声明式相对应的编程⽅式叫做命令式编程(ImperativeProgramming),命令式编程也是最常见的⼀种编程⽅式. //命令式编程: fun ...

  7. 面向过程编程(OPP) 和面向对象编程(OOP)的关系

    面向过程编程(OPP) 和面向对象编程(OOP)的关系 原文链接:http://blog.csdn.net/phphot/article/details/3985480 关于面向过程的编程(OPP)和 ...

  8. PHP面向对象(OOP)编程入门教程链接

    PHP官方学习OOP: http://php.net/manual/zh/oop5.intro.php 从其他博主学习:(以下链接来源: http://blog.snsgou.com/post-41. ...

  9. Python之路Python作用域、匿名函数、函数式编程、map函数、filter函数、reduce函数

    Python之路Python作用域.匿名函数.函数式编程.map函数.filter函数.reduce函数 一.作用域 return 可以返回任意值例子 def test1(): print(" ...

随机推荐

  1. React Component 生命周期

    一般而言 Component 有以下三种生命周期的状态: Mounting:已插入真实的 DOM Updating:正在被重新渲染 Unmounting:已移出真实的 DOM 针对 Component ...

  2. Raspberry Pi开发之旅-光照强度检测(BH1750)

    一.前期准备 1.环境要求 GY30模块(BH1750FVI传感器),树莓派系统,python-smbus,iic开启 2.取消对IIC驱动的黑名单 nano /etc/modprobe.d/rasp ...

  3. 新浪云虚拟机ftp链接显示失败问题

    新浪云虚拟机ftp链接显示失败问题 测试是在局域网遇到的 域名解析可以ping有字节回复 账号密码也没有错误,但是链接一直出现    连接失败   拒接连接等问题 解决办法: 其实是局域网内的问题,这 ...

  4. Flask 框架构建

    Flask 框架构建,目标构建成Django类似的结构 一. 先看看构建后的效果 # 第一次初始化 python manage.py db init # 生成数据库版本 python manage.p ...

  5. mysql_基础2

    创建数据表:

  6. TCP报文到达确认(ACK)机制

    TCP数据包中的序列号(Sequence Number)不是以报文段来进行编号的,而是将连接生存周期内传输的所有数据当作一个字节流,序列号就是整个字节流中每个字节的编号.一个TCP数据包中包含多个字节 ...

  7. Redis 之服务器集群配置

    常见的集群架构如图: redis操作过程中数据同步的函数调用关系: 集群搭建: 1.修改3个redis.config 文件的: 2.启动2个redis服务器 当杀掉redis主进程Master时,由于 ...

  8. jenkins环境搭建(Windows)

    1.下载并解压Tomcat Tomcat官方网站:http://tomcat.apache.org/ 下载并解压,解压后的目录结构如下: 2.下载并安装适合自己电脑系统的 jenkins Jenkin ...

  9. ES6 中set的用法

  10. NBXplorer的配置

    首先,必须安装bitcoin core bitcoin core启动时,会提示你定义数据存放目录,在数据存放目录下,找到bitcoin.conf文件,并填写内容: server=1rpcuser=rp ...