Delphi全局变量带来的问题
admin
2023-01-28 19:39:58
0

最近在写一个Delphi程序,想到一个问题,即Delphi为了方便使用的需要,自动创建了所有的窗体,并将这些窗体变量自动声明为全局变量。想了一下,这会带来一些问题:

1、窗体声明为全局变量,可以随时随地可用,但也同时意味着,随时会被修改和调用,调用关系复杂,且难以被追踪。

2、不符合面对向象的要求。由于窗体全局变量的存在,在各个类的方法实现中,涉及到其它窗体时,代码都是类似于 frmMain.XXX 、 frmAddInstance.XXX ,使用窗体变量进行直接调用。但这样是不合理的,一个类的方法实现,直接调用的是某一个具体对象的方法,而不是通过创建、组合、继续的方式来实现代码,不符合面对对象的精神。

如:TForm1的OnClick方法里,经常看到开发人员这样写:

procedure TForm1.OnClick(Sender:TObject);

begin

form1.Caption := 'abc';

form2.Visable := not form2.Visable;

end;

这里在一个类的实现方法里直接使用了form1这个全局窗体变量,虽然运行没有问题,但如果TForm1创建了第二个实例呢,点击第二个实例的窗体时,它的标题根本不会变,但是第一个实例反而改变了。这样的代码肯定是可笑的。如果亡羊补牢,应该把from1改为self。这里对form2的引用也是类似,代码实现引用了具体的全局实例而不是由自己创建或控制的对象,是不合理的。

Delphi的机制难以改变,暂时可以将每个窗体的全局变量看作是单例变量来使用,即不要尝试去创建窗体的第二个实例。

3、Delphi创建的数据模块,上面的组件全部都是可见的,虽然操作方便,但很容易引导开发人员直接去操作组件。更合理的方式是将这些操作封装为模块公开的方法,每个方法实现特定的业务逻辑,其它窗体通过这些方法(即广义上的模块接口)去操作,而不是直接操作组件,从而达到解耦的目的。

相关内容

热门资讯

特朗普第三度通谍伊朗,红线划到... 前一天刚刚宣称“赢麻了”的美国总统特朗普,22日突然通过社交媒体向伊朗强硬喊话。“即刻起,只要伊朗伊...
2男子涉嫌盗窃转运数百只猫,警... 山东莱州市公安局7月23日通报,7月22日5时许,该局接群众报警称有人盗猫。接警后,公安民警迅速到达...
东方空间引力一号一箭9星发射成... 上证报中国证券网讯(记者 于祥明)记者7月22日从东方空间商业航天公司获悉,东方空间引力一号(遥四)...
湖北交投:用“积木”搭出长寿桥... 7月20日,汉宜高速改扩建项目施工现场一片繁忙,一块预制UHPC盖梁模壳借助吊机平稳落位,短短半小时...
李尔平院士:为智能时代筑牢“电... 封面新闻记者 刘叶 车家竹 摄影 何宏杰 在人工智能浪潮席卷全球的今天,一个名为“电磁兼容”的专业领...
江苏、上海等地将机器人纳入“国... 南都讯记者杨文君 发自北京 7月22日,记者从商务部获悉,2026年上半年,消费品以旧换新累计带动相...
“引力一号”成功发射一箭九星,... IT之家 7 月 22 日消息,今天上午,引力一号运载火箭在上海东部海域点火升空,成功将 9 颗卫星...
特朗普向4名士兵灵柩敬礼,均阵... 当地时间7月22日,美国总统唐纳德·特朗普率领数位高官,来到位于特拉华州的多佛空军基地,参加了阵亡美...
“特朗普这么干,10年后,美国... 据南华早报7月23日报道,分析人士认为,北京如今在语言能力方面更善于解读美国战略,而美国却难以做到同...
墨西哥一市长在市政厅内遭枪击死... 综合法新社等多家外媒报道,墨西哥检方当地时间22日通报称,该国中部一地方市长在市政厅内遭枪击死亡。今...