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

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

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

Marissa Mayer:雅虎月活跃用户增长了20%达8亿 移动用户3.5亿 气死偷车贼:脑电波防盗技术,让偷车贼无计可施 TIOBE 2013年9月编程语言排行榜:Transact-SQL首次进入前十 前Oracle总裁Charles Phillips:商业软件领域的“乔布斯” 留住你的用户:8款第三方移动推送服务 人气最旺:主流移动应用创建工具大合集(一) 不要强迫用户注册,请让他们先试用产品 Eve:基于Python的REST API框架 想扩展你的数据库吗?那么先了解一下I/O 白帽黑客将现场爆料Android系统及框架漏洞 9月13日:程序员节,一起来过节吧! 欲与Siri、Google Now比高低:微软开始打造个人助理Cortana 【开源专访】禅道创始人王春生:覆盖项目全周期,回归管理的本质 携程无线创业者大赛成功落幕 梁建章为头名“快展”颁20万奖金 Bug报告:小角色,大用处! iOS开发者必备: 五大编程类工具 多核优化软件MCx释放EMC VNX闪存潜能 手把手教学:详解HTML5移动开发框架PhoneJS 快速学习新技术的几条建议 研发周报:Angular.js or Ember.js 谁将成为Web开发的新宠? 10款免费且开源的项目管理工具 Greg Pass:拯救Twitter的无名英雄 Cassandra杀回数据库排行Top 10,及需求Java 7的2.0版本 安全专家王清将揭秘“大数据时代的大安全” BrainSpace:跟传统搜索说再见 艾普网络的OpenStack实践 移动周报:无需编程,分秒钟DIY一个移动网站 抢占先机:豌豆荚发布视频搜索产品 Cloud-Connect大会Day1:OCP与SwiftStack 云智能手机,将会很快威胁到Android和iPhone? 直接拿来用!超实用的Java数组技巧攻略 pfc问题 jin_shan(DOS)请进来看看,谢谢!! 大家平时玩什么网络游戏?请留下ID和擅长的游戏(玉笛书生有偿调查) 请帮一个忙? 怎么样在程序里注册OCX控件件? 奇怪,为什么我的电脑在死机后重起就不能浏览我写的asp页面了 各位,我現在到這一步了,下一步要做什麼 怎样把一个 Frame 窗体放进一个Penal 中??? 我编了4年程序,可是我在这里的提问没有一个人的回答让我满意!!!! 搞张jbuilder6破解? 特殊字符串查找 请问Win2k pro的Inetinfo.exe进程怎么占用CPU达99%呀?怎么解决呢? 自由自在的人,你在吗? 后缀是nlc的电子图书那里找? 请问vc里缺省参数的函数是怎么定义的?(70分) 救救我!!!数据库管理的几个基础问题?? 急需控件 请教一个关于CListCtrl的问题??? c语言实现"智力游戏" --? Redhat下设置环境变量 我的帐号被盗了啦!!!!!!! select max(count(*)) from table group by aa这个意思的语句该怎么样写? 在SQL SERVER7.0中如何实现类似于ORACLE中的CONNECT BY实现的树型查询? 这里都是些菜尿,吗的没有一次我的提问有人给我解决的! 为什么我的问题没人响应???????? 隐藏FORM的API,谁能提供? 谁知道 jdbc-odbc数据库连接是否要装jdbc程序 哪位大峡知道MetaTools公司的Photo Soap下载网址??? 数据库打开问题? 为什么会出现 Capability not suported???? 请教高手们一个在天极网没人能回答的问题,认真做答者有分 jsp的中文问题求救 何為數據流? 为什么在保存Word文档时总是提示Word内存不足,不能保存? 谁有开发支付网关的经历,请介绍一下经验,或提供些资料给我参考,谢啦。 求救!关于怎样提交表单???? 怎样写入txt文件里 alphagx送分了 求教: delphi中 JPG图片怎样存入数据库中的BLOB字段?怎么进行VCD文件分割或存入BLOB字段? 有关ICMP重定向报文的疑问!!! 在C++Builder中调用计算机内置扬声器,声音太轻了,怎样提高音量? 一个头痛的问题!大家指教! lujun,icevi……快来看看这个数据库怎么设计 请问怎么才能让DataSource.SaveToContainer不使用GUID作为邮件名称 怎么拒绝MM。 请教:为什么对话框的背景色没改变? 请问CDO中有什么方法可以不用邮件url而使用DAV:id来获得制定的邮件 FALSH问题?来者有分!(300) 一个关于头文件的问题. 简单问题001 有人在windows下写过数控程序吗? 描写一处风景的作文最好是浙江杭州的. 评论为什么要抄这篇作文(优点是什么)50字-80字人人都在渴望幸福,人人都在感受幸福.幸福有时很抽象,有时很具体.幸福有时很遥远,有时近在咫尺.奉献是幸福,给予是幸福,获得是幸福,享受 月光下的遐想 作文600字 写一处景色作文300个字 校服的好处 英文作文 50字 月光下的遐想 作文800字语言优美 要关于中秋的 要自己写的快 写一处风景的作文短一些 作文200字+评价50字+仿写随便 月光下的遐想 不少于500字的作文 定点描写一处春天景物的作文急用 .600字最好 认识自己作文50~100字把有趣的事情写出来由外到内 就是长着什么样子 我与老师的故事作文500字 关于写语文一处风景的作文 手机的看法(好处)1000字作文 求关于月球之谜:月亮是从哪来的?上面有什么东西?他跟地球一样吗?月球上的尘土有杀菌的本领吗?月球的请在清明节之前回答.谢啦~~~ 月球为什么会慢慢的离开地球?为什么?慢慢离开,最终与地球分手! 爱在身边作文400字 世界上第四大长河是什么 母亲作文的评语 我们可不可以这样想像一下地球和月球在很久以前 地球是本身并不在现在的位置,它的表面很均匀的覆盖一层厚厚的冰层,直到有一天,月球出现了,它朝着地球飞快的撞了过来,但是因为各自的 世界四大长河中径流量季节变化最小的是?(尼罗河、亚马孙河、长江、密西西比河)请问此四条河分别处于什么气候丫?尼罗河、长江、密西西比河为什么径流量季节变化大呢?. 写母亲的作文600字加100字评语 600字作文 要带评语的内容不限 写景免谈 世界四大长河中(尼罗河、亚马孙河、长江、密西西比河)径流量季节变化最小的是 写一篇关于母亲的作文 另外还有对这篇文章的评语 让世界充满爱作文600字 带评语 世界上四大长河是指哪四条? 感恩 母亲 作文 评语 50字 少点 要一篇关于成长的作文,要带评语的!大约500~600字 问一下世界四大长河的顺序及长度 世界“三大著名建筑”是? 600字关于温暖的作文带评语 跪求一篇300字的记事好作文饿- -拜托大家了 真的很急 必须是记事作文哦 今天晚上就要饿- - 让我感动的一个人作文200至400字! 月球的重力是地球的%60,有一个人那着一个东西在地球上重10斤,说月球上重多少斤? 求一篇记事作文,300字左右 读书使我快乐 作文500字急! 文明礼仪作文~400~500字的!急RT 求!寒假叙事作文300字!啊!要够300字啊!各位求求了!谢谢各位! 写读书带来的乐趣,600字 文明礼仪作文(公共场所里的)400字的 急需三篇450字作文内容任意,块! 月球上的东西能飘起来吗 世界上的未解之谜最怪异的,最恐怖的. 冬天里的故事作文500字 如过把月球上的碎石带回地球会飘起来吗? 大千世界未解之谜哪儿有这样的电子书? 我家的教育故事作文500字, 白兰地 伏特加 金酒 兰姆酒 龙舌兰 威士忌~这六种就哪个好喝! 世界四大未解之谜 求世界四大姓! 地球与月球有什么不同 葡萄酒 威士忌 伏特加 白兰地 朗姆酒 龙舌兰 那个好喝还有 香槟 世界四大未解之谜是指那四大 有关真诚的作文.急用!400字 洋酒中的六大烈酒:威士忌,白兰的,伏特加,朗姆酒,金酒,龙舌兰.哪些比较适合加软饮? 世界上还有哪些是未解之谜不是说地震这样抬杠的。要像百慕大呀,外星人那样。 格列佛游记读后感 要300~400字300~400字啊 威士忌,伏特加,金酒,龙舌兰,白兰地,中国白酒,日本清酒,朗姆酒各推荐一个牌子,价钱100左右 月光下的遐想 作文500字
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn