[初学者的困惑]我希望我的Delphi程序有更合理的结构,希望大家不吝赐教!

freevoice 2007-01-14 05:39:05
大家好,

小弟接触Delphi两年,逐渐发现Delphi强大的所见即所得开发方式使我一直懒于对程序的总体框架做深入的分析和设计。所以每次写程序都直接从MainForm入手,缺什么就加什么,不管什么变量都定义为TMainForm的成员,仿佛MainForm就是C语言里的Main函数一样。我自己把这种开发方式叫“GUI驱动开发”,就是程序的编写完全围绕GUI展开。可想而知,我的程序结构很不清晰,各种逻辑和调用混杂,模块之间耦合很紧,经常表现为:MainForm单元超长无比,MainForm.Create也是非常的长,维护起来非常麻烦,自己看了都觉得恶心。

我急于想从这种“GUI驱动”的状态中摆脱出来,使我的程序能有良好的OO设计。虽然看过刘艺的书(真是好书!),但还是不开窍。我觉得第一件事就是怎么做才能让我的业务逻辑与界面分离开来,也就是说:我开发好核心类后,怎样能与界面(MainForm)有效交互,又不会使我的MainForm单元过长呢?我常常看到MVC这个词,对于一个典型的Delphi桌面程序,如何做才能实现这一点呢?

我举一个我正在做的程序为例:这是一个远程机房监控程序,程序主界面(TMainForm)上有很多TImage控件用来实时显示远程机房(TRoom)的状态,我用一个RoomList对象(TOjbectList)储存多个TRoom,机房的配置信息放在一个config.xml里,网络通信用了TIdTcpServer控件。

我现在是这样做的:
1.我把TIdTcpServer放在了TMainForm里,结果网络通信的代码就使MainForm单元很长。请问:放在TMainForm里是否合理?我感觉网络通信模块并不属于界面,似乎已经独立出来。

2.我把RoomList定义为MainForm的一个成员,然后在MainForm.FormCreate方法里充斥有大量构造RoomList的代码,包括Room对象的初始化代码。请问:把RoomList定义为TMainForm是否合理?感觉它上也不属于界面,应该独立出来。

3.如果独立出来,RoomList和TIdTcpServer应该放在哪里?我想设计一个TRoomManager类,包含一个TObjectList,用来管理所有Room。请问:RoomManager对象应该在哪里创建比较好呢?我想放在工程文件里,而不是放在MainForm单元里。

我问的问题太多,请大家原谅,希望大家积极表达意见,指点迷津。非常非常感谢!
...全文
229 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
YouTuBe 2007-01-15
  • 打赏
  • 举报
回复
qiume 2007-01-15
  • 打赏
  • 举报
回复
把你的业务逻辑类(比如通讯类)独立出来,写到单独的Units中......
freevoice 2007-01-14
  • 打赏
  • 举报
回复
To sxqwhxq,

谢谢您的宝贵指点!我知道接口很强大,但一直没有在实际编程中用过,真是惭愧
仙侣步惊云 2007-01-14
  • 打赏
  • 举报
回复
MainForm单元太长?
1、可以使用bpl包分解过于庞大的工程。
2、可以用Form划分程序大致的功能模块,同时用Panel作为这些窗口parent,做类似于mdi的程序。
3、datamodule不仅可以用于放数据库组件,也可以做一切不可视组件的容器。
4、将常用的公用函数放在公用的Unit;
5、适当地使用接口,李维说,面向对象的编程有很多可以用面向接口实现。
freevoice 2007-01-14
  • 打赏
  • 举报
回复
我能否将通信模块做成COM组件?我没有做过COM组件,不知道我这么说对不对。
freevoice 2007-01-14
  • 打赏
  • 举报
回复
热切期待其他网友的建议!
freevoice 2007-01-14
  • 打赏
  • 举报
回复
To DelphiGuy,

谢谢,你真是一语惊醒梦中人!我以前还真没有注意到TDataModule和Unit的全部作用。Delphi是我自学的,好多知识都比较欠缺!真得非常感谢!
  • 打赏
  • 举报
回复
一般来说与GUI关系不大的部分放在TDataMudule中比较好,或者你自己实现一个类似的结构。
OP的unit除了不能继承,基本上就是一种面向对象的实现,有接口部分(类似public)、实现部分(类似private)、初始化部分(类似构造函数)、退出部分(类似析构函数)。善用unit,即使不使用面向对象特性,也可以使程序结构更清晰、合理。

zsr 2007-01-14
  • 打赏
  • 举报
回复
将通信模块独立出来更好。
freevoice 2007-01-14
  • 打赏
  • 举报
回复
我现在是这样做的:
1.我把TIdTcpServer放在了TMainForm里,结果网络通信的代码就使MainForm单元很长。请问:放在TMainForm里是否合理?我感觉网络通信模块并不属于界面,似乎应该独立出来。

829

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧