说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

Delphi 中面向对象编程之我见

HTML文档下载 WORD文档下载 PDF文档下载
Delphi 中面向对象编程之我见

面向对象的编程技术提出来也有些年头了,开发大型软件的时候采用面向对象的编程技术可以缩短程序的开发周期,提高程序的可读性,易调试性,同时也就相应的提高了程序的可维护性,而对大型软件而言,可维护性是保证其生命力的一个极为重要的指标。

不知大家注意到没有,可视化程度很高的编程语言在采用面向对象的编程技术上很难处理。例如 VB,4.0基本不支持面向对象的编程,5.0 好一些,但微软也只敢说在面向对象的编程上 5.0 比 4.0 好得多,而不敢说 5.0 支持完全的面向对象的编程(6.0 我没用过,不知道,如果能支持,也是 VB 爱好者的福音了)。这大概就是人们常说的不用 VB 做大型程序的重要原因之一吧。 我不知 Delphi 是从什么版本开始提供面向对象编程支持的,但我从 VB 5.0 转到 Delphi 4.0,除了项目要求外,这是最重要的原因了。

由于 Delphi 除了支持面向对象的编程外,也支持一般的面向过程的编程,而且因为其可视化技术的运用,很多人(包括我)很容易就偏离了面向对象的方向,实际上,我觉得要实现面向对象的编程也不难,因为 Delphi 给你的全都是对象,你只要在编程的时候注意自己的代码就是了。下面是我对在 Delphi 中采用面向对象技术的一些体会:

1.不要用全局变量

即使要用,也要用全局对象来代替它。习惯了面向过程编程的程序员在这点上很容易犯错,而且这一点相对来说也比较难掌握。实际上,全局变量也是面向过程编程技术的一个很大的缺陷,难跟踪,难调试,也就难维护。

为什么要用对象而不是变量呢?对象可以封装对变量的操作,任何对该变量的操作都必须通过调用对象的方法来完成,我们可以在操作该变量的方法中设置断点来调试,这就解决了前面所提到的 3 个难点(难跟踪、难调试、难维护)。

举个常见的例子(也许并不能最大限度的反映这个问题):让你做一个 IE,对于 Internet Option,你打算怎样处理?

根据以上的讨论,我的想法是写一个 TDefaultINI 类,这个类负责 Option 中各项设置的保存,读取。Option window 和别的需要操作其中设置的对象都通过这个类来进行处理。这样就实现了数据的封装。你可以定义一个 TDefaultINI 类的实例作为全局对象,当然,因为这些设置是保存在存储器中可以随时读取的,你也可以只在需要的时候创建一个 Tdefault 对象来完成你的功能。

2.对象之间交换数据,尽可能的使用属性而不是变量

为什么要用属性而不是变量呢?对数据的操作可以通过属性的方法进行封装,一旦以后对象内部的数据结构发生了变化,只要我们提供的属性接口不变,对程序别的部分的影响就能减小到最小。例如 Form 之间通过属性来交换数据。以后因为某个原因你得将原来用数组实现的东西改为用链表实现,只要你的属性接口仍然是数组,那对别的对象就几乎没有影响。

3.合理的安排对象的方法

我直接举例来说明这个问题,例如在连接数据库的时候,你是在主 Form 中设置好 TdataModule 中 Tdatabase 的 AliasName 和 Params,然后用 DataModule.Database.Open 来连接呢,还是写一个 TdataModule.ConnectToDatabase 方法,将 AliasName 和 Params 作为 TdataModule 的属性,而在主 Form 中调用这个方法来连接呢?从理论上来讲,两种方法都是面向对象的。也许很多人不能体会到后一种方法的优越性,想象一下如果数据库发生了变化,以前只有 Sql Server,现在还需考虑 Oracle。后一种方法将会使你的应对轻松的多,尤其是你在主 Form 中有好几处地方需要连接数据库的时候。

4.合理的安排你的对象

一个问题该有几个对象来解决,每个对象实现什么功能,它们之间是什么联系?这个问题是面向对象编程的永恒的问题,Delphi 中这个问题怎么处理呢?在此我就和 Form 有关的问题和大家讨论一下吧,先举一个例子:写一个将 IE 中的收藏夹导入到数据库中的程序,该怎么安排你的对象?这个问题并不复杂,一个 Form 就能解决问题了,也许为了数据库管理比较方便,再加上一个 DataModule,Form 负责读入收藏夹,将之显示在 TreeView 中,用户可以选择 TreeView 的节点(即收藏夹)导入数据库。也许你的程序刚做好,老板又要求对 NetScape 的 BookMark 也完成同样的功能,怎么样,你的改动量有多大?如果你以前使用的是两个对象来完成上面讨论的一个 Form 的功能,一个对象负责将收藏夹的数据导入到 TreeView 中,而 Form 只完成对 TreeView 的操作,你就会发现你的改动是很轻松的。由此我的建议是 Form 只完成对界面的操作,对于具体的数据结构,由我们自己写的对象去完成。

5.不要在两个同级的子 Form 之间交换数据

在 Delphi 中很容易犯这个错误,这样做是很危险的,因为很有可能你认为存在的 Form 被关闭了或者干脆就没有打开过,而且这样做最大的坏处是程序晦涩难懂。解决的办法之一是可以通过它们的父 Form来交换数据,例如父 Form 中取得 A子 Form 的属性值,根据这些值来设置 B 子 Form 的属性值。

面向对象的编程技术绝不只是应用在大型软件的开发上,实际上,小型程序采用面向对象的技术开发对于今后的扩展和移植(即是只是部分功能的移植)是很有帮助的。

微软的无奈:或允许Android应用运行于Windows平台 如何选择适合自己的编程语言 Google Now新增语音命令:生活简单一点,让爱更近一点 千万美金收购案:GetJar是一家怎样的公司 传苹果与时代华纳等公司合作,推新一代Apple TV 追本溯源 解析“大数据生态环境”发展现状 为Hadoop存储层增加对OpenStack Swift的支持 详解并行逻辑回归 在AWS上使用GPU实现分布式神经网络 大数据时代,看“小数据”如何支持决策 22人15天研发 微信红包系统发起“珍珠港偷袭”的背后 开发产品防脱节,DevOps来帮忙 手游福音:官方中文版Unity用户手册免费发布 支持多平台!2D和3D游戏引擎Godot宣布开源 从Google备份互联网看“数据安全” NBA全明星周末,数据打造下的辉煌盛事 2014情人节没活动?我们来帮你! Windows 8授权销售已超过2亿份 速度不及Win 7 IDC:2013年第四季度Windows Phone出货量大幅增长 深入思考SDN的核心本质:从SDN=OpenFlow回到软件定义网络 谷歌、VMware在Chromebooks上双赢了,微软你怎么看? Tizen真要来了!又有15家IT大佬成帮会成员 研发周报:开源世界应该致谢的五家公司 Square、LinkedIn、Google... 看国外巨头如何“绑架”用户? 一周消息树:5.5寸屏幕的iPhone 6概念机来袭、索契冬奥会开幕式现Bug 一周热点:美国大学生数学建模分析,Hadoop不是万能,探访雅虎数据中心 Google Play services 4.2全球推送,完全支持Chromecast! 移动周报:最快的Web开发IDE——HBuilder Google Glass是空有噱头还是实用品? 服务好“最后一公里”,高效CDN架构经验 “义军”突起,帮用户夺回大数据控制权 知道了这些信息会不会对服务器造成威胁? 可不可以telnet 212.xxx.xx.xx [1433]察看SQL SERVER端口 下面的这段代码为什么不执行呢? ado的连接问题 如何使系统在退出时自动清除最近打开的文档? 各位老大请进. 在asp.net中用datagird控件做的"删除"功能,生成html页面后,删除是一个链接,我想在单击这个链连时,出现一个确认框, 各位老大请进. 各位老大请进. 如何给下拉列表框中某一选项的值赋null?另,如何判断用户没有对列表框进行选择? 为什么我在sql*plus在system表空间建了个scott.sale表后在oem看不见呀!! 如何给下拉列表框中某一选项的值赋null?另,如何判断用户没有对列表框进行选择? 各位老大请进. 超级菜鸟 datagrid的触发事件问题 为什么选择服务器游标后,datagrid 不能用了? 数据库oracle9.2,用oledb连接数据库时出现“未在本地计算机上注册“OraOLEDB.Oracle.1”提供程序。”怎样解决? 直接通过ADO如何远程访问计算机上的SQL Server数据库 如何升级jbuilder7的jdk? 发布基于TXMLDocument的程序需要打包哪些文件? 小白鲨只是提议版主不要随意性执法 彩色图像的亮度和对比度? HTML Help Workshop 话中国电影的英文译名(英语爱好者请进,更新中) 小弟做的第一个网页,知道来这个论坛的都是高手,请大家多批评! 如何从CObject中派生一个类? 初学请求大家帮助希望早结贴早睡觉(两贴共120分)。 菜鸟问题:应该先学开发平台还是先学开发语言? service是否也有消息队列? 不知道这样的情况,SQL语句该如何写!谢谢了! HTML Help Workshop 安装什么样的版本? iis无缘无故死掉??? c#.net ! Delphi程序员现在的工资怎么样啊? 如何取得Button的Text属性值? 歪脚鸭病了 一个想了很久的问题,C/C++为什么把声明与实现放在不同的文件里(*.h,*.cpp),感觉没有一点好处。 郁闷,散分! 关于scjp的一个很菜的问题 请问为什么我的两千上网后不能关机? 哈!又升级了!(版主要手下留情,我是真心感谢大家) 现在再看《人月神话》有价值吗? 有关生成可执行文件的问题 水源里的兄弟们进来说说,到底怎样才能渡自己早日成星呀? 请教:怎样在一个应用程序中提取经运算的 多行文本行 有关new操作的问题 我要学c#.net,该从那开始??难吗??谢谢指教啊~~~~~ 两个小问题 请教:怎样在一个应用程序中提取经运算的 多行文本行 如何读取一个目录下所有目录? 袁姗姗甜美写真曝光 花丛美人娇艳性感范冰冰代言诸多国际大牌:中国人早晚要俞灏明渴望谈恋爱:想有一个可以交流的46岁苏永康中年发福 出车祸撞烂女友谢霆锋陪母狄波拉赴新加坡散心 两子未47岁朱丽倩高龄求子 刘德华建2亿城梁朝伟笑对张曼玉调侃 冷言称与其没有林志颖娇妻大起底 主动追求爱情手段堪陈豪承认将迎娶陈茵媺 巧妙避答奉子成周慧敏否认为爱猫推千万工作 澄清内地小宋佳叛逆街头形象出街 潮爆吸睛走路张歆艺新加坡庆生 获“玛丽莲·梦露”方脸村姑变麻豆 韩国整容惊人对比堪比元彬现身帅气不再 身形消瘦满目愁容惹杨幂机场素颜判若两人 全程戴口罩无人少女时代徐贤猛烈回头露囧相忙遮掩《杀戒》首映 倪妮被刘烨亲昵紧搂钻戒芭莎艺术之晚宴在港举行 刘嘉玲鲁豫等韩国人眼中的的中国美女素颜浓妆皆女神!唐嫣赵丽颖PK少女时超模邦辰油润登封面 比基尼咸湿秀热辣贵州推出超万亿“政金企”合作项目成都高品质物业价值重构 城市清幽之地江苏旷达2014年净利1.7亿 光伏广东召开第二季度防范重特大生产安全事宁西二线郑州局管段NX9标牵引变电工一季度四川居民消费价格总水平上涨1.一季度四川工业生产者价格同比下降3.罗德曼与色情影星过54岁生日 AV三牡丹江销毁一批侵华日军遗留武器山西千名城市医师结对帮扶乡村医生杭州限牌新政征求意见:驾照成门槛清出青海高中和中职学生助学金标准提至生均李学军:电影《巴彦岱》接地气 很有意直属单位国有资产管理工作规程(暂行)猫咪上楼还是下楼?烧脑图片引发网友争原标题:高劲松接受调查 昆明三任市委外交部发言人评奥巴马涉南海“块头和肌全国人大与日本国会众议院合作委员会举外交部谈南海问题:望美方尊重中国和东《中国区域旅游发展年度报告》发布 北周仲明当选承德市人民政府市长
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘