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

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

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

【直击美国云计算】Jason Hoffman:数据和计算的融合将破坏全球利润 【直击美国云计算】如何做Hadoop、流处理框架等技术的采用选择 【直击美国云计算】细数云技术领域成王败寇:从SaaS到SDN 【直击美国云计算】谷歌Jeff Dean:成功的关键是专注 致远V5发布:强调大协同,企业移动化真来了 Mailbox:六星期实现从零到百万用户及日处理亿条消息 代码审查,也要天时地利人和 Clash of Clans产品总监:游戏中的商品定价一开始就要高 移动互联网最核心的竞争是:设计的竞争 【直击美国云计算】面对AWS,VMware不会畏缩 美国白宫任命Twitter法务总监Nicole Wong为副CTO Keek宣布推出首款视频Update API 专访阿里前端工程师:淘宝移动Web开发那些事儿 【直击美国云计算】为什么eBay用燃料电池来驱动他的犹他州数据中心 【直击美国云计算】6周发布新产品,LinkedIn的trunk-based开发 移动周报:疯狂吐槽还是更得欢心?细数iOS 7的是与非 国内最受欢迎的开源项目集锦 开始3D编程前需注意的十件事 [CTO俱乐部第100期]软件平台的新思维及2345技术团队管理经验分享 失败怪圈:今天的移动App在重蹈1999年的覆辙 极客编程必备的五大PHP开发应用 Oracle或将宣布与Salesforce.com,NetSuite以及微软结盟 【专访间】神州数码谢耘:智慧城市需要以“融合平台”为特征的沃尔玛模式 对话OW2 CEO:开源≠安全隐患,免费≠无利可图 不断抄袭的Facebook正逐步沦为一家普通的公司 Windows 8.1会不会把Windows 8的“Modern”开发者踢到路边 任志鹏:FusionCloud是华为二十年技术积累的精华 机器学习典范?iOS7中的Siri能主动学习如何发音 三星宣布关闭PC业务 主推便携设备和一体机 Web设计师必须掌握的六大设计策略 Facebook为什么要推Instagram视频分享功能? 同志们 再见 接分! 再发一次,ie版本问题怎么解决,100分 请教:在Rational rose中如何去设计数据库表? 为什么wndows2k pro一访问windows2k server就有"打印机"和"任务计划"的共享,可不可以消除? win2k server下,iis5.0有问题,我想卸载,再重新安装,怎么做? treeview的使用小结(一) INDY 资料! 请分析这段代码,谢谢 怎样获得DataGrid的DataSource? 有关struts的问题,返回页面结果不对!在线等待,以解决就结帖 怎么改变快捷菜单PopupMenu1的颜色? 用OWC组件做柱状图,需要显示不同颜色的柱状以及显示不同颜色的图例 VS.NET中如何让自定义的事件出现在属性编辑器中? javascript 中有没有能返回指定某年某月中总天数的函数 如何将主窗体中的变量传到报表中,以供dataset查询用,急急急!!! 新手探路 不知道这是不是一个bug 函数返回值类型问题 兄弟我现在改行搞传统的邮政商业信函业务!给点建议!来者有分! 装有isa客户端的机器不能用FlashGet或者蚂蚁下载 网路多少钱才要交税? Kingofark关于英语及外语学习的50个观点 adotable定位记录有哪些方法?如何使用? 超高难度求sql语句,非高手莫进,在线等.......... petshop有些代碼不明白。。。。。。。。。。。 哎,运算符重载把我卡住了!求救!!! 最后 请问函数传递,设置默认值问题! 通过ODBC连接INFORMIX的问题!急!急!急! 有没有VC高手想在上海找工作? 求一个发送邮件的例子(急!!) 有谁碰到过多人同时改写几十个xml文件从而导致xml文件混乱的情况? 我在datawindow中设置initial vlaue=0,为什么写到数据库里的值还是null 请问联众和中游客户端的聊天大厅是基于chtmlview还是crichedit编程的? WINDOWS高级用户或技术支持人员请进! 通过ODBC连接INFORMIX的问题!急!急!急! 将数据保存到数据库问题 ???急。。。在线等待。。。 一个动态模板列的问题 请各位兄弟姐妹扔个FontTwister1.3的注册码上来,谢过了。 高分求救:怎么时查询后的记录成高亮状态! jsp中如何得到 select 控件的值??? 初学者求救!!!! NetBSD China站点开通<CSTC团队> 从数据库读出字段类型为int型的数据,如何转换成字符型的? 想用C来做个东西,但不知做什么好 exchange 2003 rc1版安装后后没有M盘?就是没有M盘,还是安装的问题? 关于水晶报表打印的问题,请各路大侠指点迷津 请大家(特别是安逸)指点一下关于pppoe的开发。 弱弱一问,dll 能静态连接吗? 在jbuilder中project webapplication jsp什么关系 疑问 日全食的时侯是退大潮吗? 我想要一个用ne555的延时电路,负载为一个led灯,延时时间为十秒左右,可以在灯亮期间重复按开关,每按一次重新计时 用火红,蔚蓝,姹紫嫣红,诗情画意和欣赏造一个句子, 姹紫嫣红总是春前面一句啊是首唐诗里的 忘了前面一句是什么? 用云淡风轻、繁花似锦、姹紫嫣红、晶莹剔透造一句话 主港和偏港分别是什么意思 什么是( 港主)在马来西亚有关历史事件报导中,常题到 中国主港是指什么地区啊? 港咩也 什么意思 初一上册语文第8课第2个寓言《落难的王子》1.“我”在情节中起到的作用是什么?2.“天哪,太可怕了,这事落到我头上,我可受不了!”这句话在课文重反复出现过3次,都是在什么情况下出现的? 国庆见闻怎么写快,急要,400字以上 爱尔兰政府资深顾问哈利根:中国梦属于马达加斯加总理经济顾问曼德拉拉:中非日本福岛核电站冻土遮水壁预计将使用6专家:注册资本改革反推行政改革 建立\"10.25故意伤害案\"后续:坚朝称决不放弃核武计划 韩议员团考察开永康将代表浙江 参选全国循环经济示范温州市地税局 三举措大力支持浙商创业诺奇时装:“全民时尚”并非只是口号58同城今日在美上市 上调发行价区间津巴布韦灵车撞油罐车致24人死亡 多夏高静:非农行情待周一发泄,周一操作虾仁西葫芦饼9月份大波大片来袭,肯定有你喜欢的!脆皮鸡蛋糕10间最美厨房让你从此爱上做饭古代后宫三千佳丽的真实面目,看傻了!纯手工打造蒜香脆皮肠高品质生活必备的15个微信号丹麦蓝罐曲奇Taylor Swift搭配Roge这些不要“脸”的婚纱照,简直美到爆!
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘