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

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

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

动动鼠标,决定“中国十大优秀开源项目”的归属 为改善Flickr 雅虎收购拍照应用开发商GhostBird 让你轻松学习新代码库的六个步骤 RESTful API 设计最佳实践 谷歌11亿美元豪购Waze原因:获取数据 争本地广告市场 为什么大家都要疯狂吐槽iOS 7的扁平化设计? 伟大的程序员是天生的,不是造就的 比Hive高效7倍 Facebook推新一代查询引擎Presto 未来的存储系统设计——PMC技术交流会举行 第五届中国云计算大会PPT尝鲜:十位专家分享的架构实践 “DIY”可穿戴设备:索尼开放智能手表固件 在微软的八个月里,我学到了这些 谷歌实习生每月都拿$6000,你呢? 【第五届中国云计算大会】由瓦特变比特输出,新疆要做中亚云服务中心 应用程序扩展性实现的十宗罪 图文:看谷歌实习生的惬意生活 为移动而设计:交互设计篇 小米游戏中心月度报告:极品、神庙、找你妹 中科院:常温下的液态金属电路3D打印机 细数IE10里的HTML5特性 使用Twitter Bootstrap的五大理由 Twitter重塑API战略 开启V1.1时代 Sony开放SmartWatch 支持第三方定制固件 甩啦甩啦!Apptopia帮开发者在线买卖App所有权 聚焦全球移动市场:印度,这块肥肉不太肥 Google决定明年一月份停止对Chrome Frame支持与更新 你应该关注的几个Eclipse超酷插件 华为王丰:FusionCube打造下一代融合一体机 上海云人联合创始人吴朱华:中国人也能做出最好的实时数据库产品 Facebook RSS替代Google Reader?或因其社交属性失败 让这么多国外开发者如此兴奋,iOS 7到底好在哪里? 删除Linux 关于求最大列的问题!!! 要用java开发snmp网管软件,用哪种软件包比较方便?(急急急) 不足3平方厘米电路板的CAD软件的设计该如何实现? 请问如何在java 中读写Excel文件中数据,并将其写入SQL Server数据库中 oLE连接对象的操作………… 有誰在WinXp下装过Jbuilder6? 如何用Tprint把DBGrid上显示的网格和数据打印出来?谢谢! 请大侠帮我解决一个数据库的问题 请问如何操作分布在两个数据库中的表数据? 寻求合作(有关车间数据采集):谁要MONEY? 请问哪里有有关COM原理的Ebook可以下载???? 有谁能够告诉我有关网站发展历史的资料么?世界上第一个网站是怎样建成的?以后的发展脉络呢?如果有谁能够相告不胜感激啊。 讨论:可视化开发XSLT的工具!! 如何使用VC进行“毫秒级”以下的 定时器。即(xx uS 的定时器)。。。。。。。。。。。。 看电视(转载) jsp比asp,php等好么?(在线等候) 怎样实现图像的自动拼接? 报表输出问题 我用ActionManage做出的菜单为何汉字显示总是最后一个字少半边? c#里如何使用shbrowseforfolder?那位兄弟给个例子 如何实现MAC和IP绑定。 帮帮我啊,老大们我真的很急谢了 session问题?????? 报表输出问题 你愿意吗? 关于PB中做VFP的ODBC的一个问题 我为什么不能提问? 在PASCAL语言中的"集合"概念,转化到C语言中,该怎么实现? 帮我看一下这个程序. 谁人发个QB的编辑器给我? 如何改变应用程序的图标 网吧管理 帮我看一下这个程序. 谁看谁头疼的问题!你除外! 请问JDK和J2SDK有什么区别? win98 转 win2000出现的问题,急,再线等候! 停止函数执行 请问如何在鼠标点击xx button 的时候获得 JtextField 中的文本输入--有重分送 我不能关机了!救救我哟~~给你分! tomcat4.0.1无法启动的问题 SoS!俺用fireworks做了一套菜单,但是应用于框架结构中时,只显示菜单所在框架的部分菜单。也就是说菜单显示不完整,如何能够让菜单跨越 刚装了REDHAT 7.2,不知道网络怎么设置 报表打印,望各位指点..... 是不是我这里设错了? 菜鸟有问题,Win2k的定时关机程序 关于天数累加的问题 webbrowser控件问题? 421连续进纸标准,打印问题,难啊,难 有个小问题难住偶了! 请教 bdf 文件的格式 同样重量的物体什么情况下受到的摩擦力小 有一艘轮船,载重量是800吨,容积是795立方米,现在要装运生铁和棉花两种物资,生铁每吨体积是0.3立方米,棉花每吨体积是4立方米,为了充分利用船的载重量和容积,生铁和棉花各应装多少吨?请问 火车在转弯行驶时,需要靠铁轨的支持力提供向心力,在转弯处是内轨和外轨的情况? 谁知道中国的主食,例如包子、馒头用英语怎么说? 判断题,‘果断’和‘果敢’是一组意思相近的词、 老是△=什么什么的 我都迷糊了?不是几何题那这个怎么念呢?拼音下 怎么用判别式确定取值范围啊。谁知道?而且还得举个例子 我才能明白 我做的是一道集合题已知集合A={x I x>0,且x包含 包子和馒头的来历 语文 判断题怎样选对或错 Y在数学里代表什么意思? 甲物体的重量是乙物体的5倍,甲从H高处自由落下,乙从2H高处与甲同时开始自由落下,说法正确的是,A 两物体下落过程中,同一时刻甲的速度比乙的大B 下落后1s末,他们的速度相同C 各自下落1m时, 判断题(语文的啊)1.根据书写的笔顺,判断下列的说法是否正确.1."九"的第一笔是"撇".( )2."也"的第三笔是"竖弯钩".( )3."每"的第四笔是"横折钩".( )挚怎么组词贞 加部首成新字再组词(要两个)2.照 小猪丶筷子丶小黄花编一个故事.怎么编啊. 两个不同重量的物体在同一高度是否会同时落地?! 如图,两圆同心,半径分别为14cm和6cm,另有一个圆与这两圆都相切,则此圆半径如图以o为圆心的两个同心圆中.大圆的玄AB是小圆的切线.若大圆的半径为10cm.小圆的半径为6cm玄AB的长为..... 写一篇童话故事《小青石》 两个物体 大小相同,重量不同 在高空扔下 哪个先落地?. 知道铜的重量怎样算数量还有体积我只知道铜的重量是494.厚是12厘米,宽是100厘米,长是6米 算的是铜的条数 《纸张、筷子与森林》的童话作文400字 重量为m的东西从h米高处自由落体,地面上放一个电子秤,请问怎么求出物体落到秤上的显示的重量值重量为m的东西从h米高处自由落体,地面上放一个电子秤,请问怎么求出物体落到秤上的显示 数学题? 一艘载重量是460吨的船,容积是1000立方米一艘载重量是460吨的船,容积是1000立方米,现有甲种货物450立方米,乙种货物350吨若每吨甲种货物的容积是2.5立方米,乙种货物每立方米重0.5吨问 火车转弯时,乘客受到向心力吗?不是说向心力只是效果力吗,你能仔细给我解释一下吗 两圆内切,一圆半径8,圆心距5,另一圆半径为? 两圆内切,一圆半径为6CM,圆心距为4Cm,另一圆半径 以小猴子的红屁股来写一篇童话故事,600字左右,急需! 第五个判断题对吗 两圆的半径之比为2:3,当它们内切时,圆心距为4cm,那么当这两个圆外切时,圆心距为多少? 已知两圆半径之和是6cm,大圆周长25.12cm,小圆的面积是() 有大小两个圆,大圆半径是6cm,小圆直径是4cm这两个圆面积的之差()急啊 五个判断题历史 已知两圆的半径之比为 3:5,若两圆内切时圆心距等于 6cm,则两圆的半 径分别为___; 若两圆无公共点,则圆心距 d 的取值范围为___若两圆半径为R和r,圆心距为d,且d .若半径为6cm和5cm的两圆相交,且公共弦长为6cm.则两圆的圆心距为 .请写出详细过程 5年级的判断题1、有一个面是正方形的长方体一定是正方体.《 》2、一个数的因数一定比它的倍数小《 》 3、一个数是6的倍数,这个数就一定是2的倍数又是3的倍数《 》4、所有自然数不 已知两圆的半径之比为5:2,两圆内切时的圆心距为9cm,求当两圆的圆心距分别为30cm,21cm,10cm,5cm时相应的两圆位置关系 甲种货物每吨体积为3立方米,乙种货物的体积为5立方米.一船载重量为500吨,载货空间为2100立方米,甲乙两种货物各装多少吨才能最大限制地利用这首船的载重量和载货空间 为什么不同重量物体.在同一高度同时落下,会同时落地. 一艘载重460吨的船.容积是1000立方米,现有甲种货物450立方米,乙种货物350吨,而甲种货物每吨体积2.5立方米,乙种货物每立方米0.5吨.问是否都能装上船?如果不能,请说明理由.并求出为了最大限度 已知两相交圆的半径分别为5和4,公共弦为6,求两圆的圆心距现在就要 为什么从相同高度抛下的两个重量不同的物体落下的速度相同偶尔玩时发现的规律,为什么? 一艘载重460吨的船,容积是1000立方米,现有甲种货物450立方米,乙种货物350吨,而甲种货物每吨体积为2.5立方米,乙种货物每立方米0.5吨,问是否都能装上船?如果不能,请你说明理由.并求出为了最 两圆相交 已知半径和圆心距 求公共弦长R=17 r=10 d=21 馒头日记里的馒头最后有没有死啊?花卷死了吗? 一艘轮船载重量是460吨,容积是1000立方米,现有甲种货物450立方米,乙种货物350吨,而甲种货物每吨体积2.5立方米,乙种货物每立方米重0.5吨,问是否都能装上船?如果不能,说明理由.并求出为了最大 相交的两圆的半径分别是8和5,公共弦长是8,这两个圆的圆心距是 怎么做馒头、花卷 两圆的半径分别为3和5,圆心距1,则两圆的位置关系是什么 已知两圆的半径为4和5,公共弦长为6,求两圆的圆心距(提示一下:有两种答案) 馒头,花卷,豆沙包这三个词用英语怎么说? 已知两圆的半径分别为3和6,圆心距为5,求两圆的位置关系 怎么算铜的重量 谁知道英语怎么说包子,花卷,雪饼和萨其马?需要公众认可的表达方式 两圆的圆心坐标分别是(根号3,0)和(0,1).他们的半径分别是3和5,则这两个圆的位置关系是( ) 编童话《小猴子找妈妈》急!用下面的材料编童话小猴子瞒着妈妈到外面玩,在树林迷了路.在树林里,小猴子遇到了狐狸、狼、小山羊、小松鼠.小猴子在树林里遇到了什么事,后来在谁的帮助下 数学中的log的具体意思是什么,怎么使用,表示? 已知两圆的半径分别为5厘米和7厘米,圆心距为8厘米,那么这两个圆的位置关系 已知两圆半径的比为3:5,当两圆内切时,圆心距是4cm,女么当此两个圆为外切时,圆心距是多少, 数学中^表示什么意思 两圆的圆心坐标分别是(根3,0)(0,1),半径分别为3和5,则这两个圆的位置关系如题 两圆半径的比为2:3,内切时的圆心距等于8cm,那么这两圆相交时圆心距的范围是多少? ^在数学中代表什么意思 书上说重力的施力物体是地球,能不能说重力的受力物体是地球呢? 已知两个圆的半径之比为3:5,两圆内切是,圆心距为6,则两圆的半径分别是___?这两圆外切时,圆心距为___?..说明原因.
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘