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

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 的属性值。

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

加速Visual Basic For Application(VBA) 监视程序的运行情况 -VB资料 交换鼠标按钮 -VB资料 交换鼠标左右键 -VB资料 禁止使用 Alt-Tab 或 Ctrl-Alt-Del -VB资料 控制光驱门的开关 -VB资料 VB利用 窗口函数监视系统的运行情况(VB类) VB判断是否在VB5环境下运行 VB判断一个32位程序是否结束 VB判断一个程序启动完成(不是结束) 屏蔽TextBox的系统菜单 -VB资料 启动时禁止装入 Add-Ins -VB资料 让Timer控件每5分钟触发一次事件 -VB资料 让程序启动快一点 -VB资料 VB如何调用系統的【查找】、【替换】的对话框? VB如何动态新增、移除 ODBC DSN? VB如何读取 Picture 内任何一点的颜色值? VB如何获取硬盘卷标、序列号和文件系统类型? VB如何判别程序是在Win95或NT下执行? VB如何启动控制面板? VB如何取得磁盘序列号? VB如何让Window不接受键盘输入及Mouse Click VB如何让程序拥有多个热键? VB如何让用户自行输入方程式,并计算其结果? VB如何使程序不在Ctrl+Alt+Del弹出的对话框内? VB如何使用 VB 编写自动反安装的程序? VB如何用VB建立快捷方式 VB如何用VB在桌面建立快捷方式 VB如何在 VB 中控制 Modem 行为? VB如何在VB中判断Windows9x的运行模式 VB如何在Visual Basic中实现异步执行程序 送分题,如何取得一个表的所有字段名? 那里可以下载Wrox系列书的英文版? 无法启动sqlserver的问题. DELPHI中dbgird的语句问题 关于控制动态产生Checkbox,并进行动态控问题 BCB中使用MSComm控件,无法定义动态数组变量,该怎么办?--急啊!在线等待 战神----巴蒂 两个问题! 用ADO访问DBASE数据库 百分求救:关于COM方法的reference参数不返回值的问题 请教各位高手 如何将程序中不同的查询结果写入报表? 怎样自编程序监控icmp包,应该截获什么消息,还是用别的方法? java本地化的问题(各位帮帮我!) 一个关于类型转换的菜鸟问题!! 招聘 Jpeg中FFd9可以有几个? ?????不同窗口中多个参数传递的问题,在线等待中........ 关于 EmbeddedWb 的Mshtml_tlb, SHDocVw_tlb 问题! 各位大虾 帮我翻译一下 急 悲... DBGrid为什么没有数据集记录失去焦点事件? 怎样手动和在程序中更改SEQUENCE的当前值? 怎么结贴子,什么叫FAQ? 关于“软件蓝领”的3个疑惑。 在函数中以引用方式调用结构的问题?给我能给的最高分100 怎样实现随机打印一个数据表的几个子段? 大家看看,这个功能如何实现? 怎样编一个程序读取服务器上的时间? VC工程不能正常打开? Jpeg中FFd9可以有几个? datawidgets简介!简单的问题---“送大伙一点小分” 新人到!!有问题想要问!!! 有谁知道sybase12.5中定义的所有保留字keywords? 为什么我的Tomcat突然找不到Serverlet了 关于报考程序员的问题 请问:一个应用程序发布时需要为每个发布的实例建立一个唯一标识用GUID好不好? 介绍些ActiveX/COM的好书吧! 图片的名字是中文就不能显示,怎么办 奇怪的问题关于NULL! 高分求助:pb中数据传输的问题 请教,在窗体改变大小时,有没有通用的办法,改变窗体内控件的大小,位置 如何用VB在CMOS中获取指定信息? ??低级问题,如何得到一个hdc(最好多几个方法) !!!!!!!!!急急急!!!!!!!!!!!!! 如何在頁面引用outlook的收件人地址控件,使得輸入的mail帳號會自動加上下划线,请给代码,并解释,非常感谢! 有名的ehlib控件,2.3版,功能多多,本人在其基础上又增加了很多属性,不能错过! 不是高手莫进来!:) 这是小雨田子第N次给大家送分了,请进吧!!! 如何打包 一个百思不得其解的问题,使用SetSQLSelect()语句重置数据窗体的SQL语句,SQL语句无错,但存在部分机器不能成功执行。不知何故。 make a switch有哪些意思?都是什么? 实际气体为什麽在高温低压下才接近理想气体?为什麽要比气体的沸点高很多,又要在低於0.1个大气压的情况下才接近理想气体?请问这压力是指哪里的压力? 汽车电路中,50线的作用是什么? 楼梯间非采暖 不设置散热器 其热负荷如何计算 是否要计算温度要算作室外计算温度 还是另外的计算温度 求解 低压下的气体( ).选项:a、可以视为理想气体 b、 不能视为理想气体 c、 可以忽略分子间的相互作用 d、低压下的气体( ).选项:a、可以视为理想气体 b、 不能视为理想气体c、 可以忽略分 检查汽车电路应注意哪些事项 灯罩的作用是利用光的( )将光线尽量集中罩到需要照射的地方,因此灯罩内表面应尽量( ) 为什么高温低压的气体可近似看做理想气体低压可以理解,压强小,气体密度小,分子间距大故分子间作用力小,那高温呢?是为了增强热运动还是破坏分子间的相互作用了 汽车电路怎么查线 楼梯间不采暖时候温度按多少算? 求助啊I2(g)+H2(g)=2HI(g) 放热 恒容时 降低温度,HI的物质的量是不是增多? 将玻璃罩罩住两根蜡烛,为什么长蜡烛会先灭? 怎样测量光的频率和波长光的频率和波长是怎样测量出来的?什么仪器可以测量光的频率和波长? 为什么2HI=H2+I2这个反应中反应前后气体的物质的量不变 两根蜡烛一根长,一根短,问如果将两根蜡烛点燃后,用一个封闭的玻璃罩罩住后,问哪个先灭? LED日光灯的灯罩种类有哪些? 可逆反应2HI(g)=H2(g)+I2(g),达到平衡,增大HI的物质的量,HI的分解率和体积分数不变,为什么呢?,能不能解释清楚啊 在一个玻璃罩中有两只长短蜡烛那只先灭?为什么 年最大负荷利用小时数计算公式 door除了门还有什么意思新概念英语初阶第27课 响度跟距离发声体的__有关,响度的单位是__ 日光灯为什么要装灯罩 在水平桌面上,放上两只蜡烛,罩上玻璃罩,哪只蜡烛先灭? 冰熔化过程的特点是_______. 在一定温度下,在一个密闭容器中加入H2和I2蒸气各0.5mol一个密闭容器中加入H2和I2蒸气各0.5摩,发生反应H2+I2 2HI,达到平衡时,生成HI 0.8摩,若其它条件不变,开始充入的H2为2摩,则达到平衡时生成的H 在桌上放1高1低蜡烛,点燃后罩上玻璃罩,问哪只蜡烛先灭为什么说出来 响度跟发声体的什么有关 LED蜡烛灯哪些有哪些最好想买一些LED的蜡烛灯,但是又对LED产品不了解. 在水平桌面上放两支蜡烛,罩上玻璃罩,哪个蜡烛先灭? 响度与发声体的什么及距发声体的什么有关?急. LED蜡烛灯 在平桌面上放两根高低不同的蜡烛,罩上玻璃罩,哪根先灭可是我做实验的时候是长的先灭的,有什么原因使他们不同时间灭? 汽车常用检测设备有哪些? LED节能玻璃灯罩 球泡 蜡烛泡 拉尾灯罩哪里可以买到?如题 LED节能玻璃灯罩 球泡 蜡烛泡 拉尾灯罩哪里买比较便宜? 放两根蜡烛,一根长一根短,同时罩上玻璃罩那根先息,为什么?为什么?为什么?为什么?为什么?为什么?为什么?为什么?为什么?为什么?为什么?为什么?为什么?为什么?为什么?为什么?为什么?为什么? 汽车钢材检测项目有哪些?所涉及到的检测设备有哪些?公司筹建汽车钢材检测实验室, LED蜡烛灯在哪家比较好? door是什么意思 溶质对溶液的熔沸点有何影响 牧童描写了怎样的场面 声音的响度越大,传播的越远,这句话对吗? 为什么 溶质加入水后,溶液的熔沸点发生上什么变化? 台灯灯罩是金属的好吗?LED灯 45000平方米制冷面积,用蒸汽式溴化锂机组还是用离心式机组,蒸汽价格220元电价1元 声音传播距离与响度无关,为什么越远越听不清不懂 灯罩能否让LED灯的光平行射出?我现在需要一个灯罩可以将灯泡发的光最后与灯罩面垂直的方向平行射出,最后可以通过一个凸透镜将光线收集到一个点.不知道这样的灯罩有没有厂家能做?还有 双效溴化锂吸收式制冷机组为什么要用圆筒圆形筒有什么优点或缺点啊?为什么不用方形筒啊 音调越大声音传的越远,还是响度越大声音传播的越远.警报声之所以能传播很远的距离,是因为它的( )A.音调高 B.响度大 C.音色美 D.节奏快 如果不慎将油汤洒到衣服上,可以用什么方法除去?原理是什么? 白色物体能_各种颜色的光,无色物体能_各种颜色的光 如果把长短不一的两支蜡烛点燃后用玻璃罩罩上,请问哪支先熄灭呢? 关于光的波长和频率光入射水中时速度会改变,是频率还是波长改变了?波长有可能改变么? 上午化学课做实验,将无色液体和白色粉沫混合,产生大量无色气体,这两种物品是什么 用玻璃罩罩住一支长蜡烛与一支短蜡烛,哪一支会先熄灭?玻璃罩小的话,玻璃罩大的话,(老师没有说明玻璃罩的大小)如何写实验报告?(第一分实验报告,希望能写的准确些)求达人解答请写 That's a switch 别用词典上的“那是一个开关”,来忽悠我。不是表面上的意思 一个玻璃罩,罩住一长一短两根蜡烛,同时燃烧,那根先熄灭,为什么?我个人觉得是短的,但是做实验只做了一次,是长的先灭,为什么?如果是短的,为什么我们做出来的是长的?有没有什么误差? 如果不慎将油汤洒到衣服上,可以用什么方法除去?说一下你的依据得原理 switch (a) 和 switch(a==1)有什么区别以下选项中与if(a==1)a=b;else a++;语句功能不同的switch语句是A)switch(a){case1:a=b;break;default:a++;}B)switch(a==1){case0:a=b;break;case1:a++;}C)switch(a){defa 一长一短两支蜡烛在同一玻璃罩中燃烧,哪个先灭? door什么意思
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘