Delphi数据模块的使用 - 单个还是多个?

8

我正在编写一个应用程序,其中包含各种表单和相应的数据模块。
我以这样的方式编写代码,即通过在uses类中引用彼此(一种在实现中,另一种在接口中,以避免交叉引用)来实现它们之间的使用。 这种方法是否错误?为什么或者为什么不应该这样使用?


你应该重新编写标题,以更清楚地表明你的问题的性质。你可能无法编辑它,所以我会为你做这件事... - Chris Thornton
3
在我看来,数据模块不应该引用项目的表单。如果一个表单需要对数据集的更改做出反应,例如,将TDatasource放在该表单上,将其链接到数据集,并将代码放在TDatasource的事件中。 - Ken Bourassa
1
回到这样的问题几年后,我发现有趣的是,在没有限制你可以塞进一个表单、数据模块或单元的数量时,Delphi开发人员平均而言会把太多的东西塞进一个模块/单元/文件中,而不是考虑什么才是实际合理、可维护和可读的。 - Warren P
Warren,我认为所有开发者都需要在软件设计和计算机科学方面接受更好的教育,尤其是现在距离你所在的年代已经过去这么久了。包括我在内,仍有一些应该学习的东西是我不知道的。 - William Egge
4个回答

9

我必须同意Ldsandon的观点,我认为在项目中拥有多个数据模块比较好。如果你将其视为模型-视图-控制器,则DB是模型,表单是视图,数据模块是控制器。

个人而言,我在项目中至少有2个数据模块。一个数据模块用于在整个项目中共享操作、图像列表、DB连接等其他内容。大多数情况下,这是我的主要数据模块。

从那里开始,我为应用程序中的每个“实体”创建一个新的数据模块。例如,如果我的应用程序需要处理或显示订单、客户和产品,则我将为每个实体都有一个数据模块。

这样,我可以清晰地分离功能,并轻松地重复使用一些部分,而不必拉入所有内容。如果我需要与客户相关的内容,我只需使用客户数据模块即可。

问候,

Stefaan


7

没问题,特别是当你需要创建多个使用不同相关数据模块实例的相同表单时。

只需注意VCL设计中的一个小问题:如果创建两个相同表单和它们的数据模块实例,除非在创建数据模块实例时使用一些小技巧,否则这两个表单将指向同一个数据模块(由于VLC解析链接的方式):

  if FDataModule = nil then
  begin
    FDataModule := TMyDataModule.Create(Self);
    FDataModule.Name := '';  // That will avoid pointing to the same datamodule
  end;

2
超越镜面。我总是使用表单(Form)而不是数据模块(DataModule)。我知道这并不常见。
我总是使用表单 (Forms) 而不是数据模块(DataModules),我称它们为 DataMovules。
我每组逻辑相关的表格都使用一个 DataMovule。
我使用表单 (Forms) 而不是数据模块(DataModules),因为两者都是组件容器,都可以有效地用作数据相关组件的容器。
在开发过程中:
- 我的应用程序更易于开发。表单使您有机会查看数据组件,从而更容易开发这些组件。 - 我的应用程序更易于调试,因为您可以立即放置一些查看器组件,以便实际上可以看到数据。我通常创建一个选项卡架,每个表格对应一个选项卡页面,并在每个页面上放置一个数据网格以浏览表格上的数据。 - 我的应用程序更易于测试,因为您最终可能会操纵数据,例如尝试极限值进行压力测试。
开发完成后:
- 我确实将表单设为不可见。实质上使其成为一个数据模块(DataModule),我享受与数据模块具有相同的容器特性。 - 但还有一个额外的好处。表单仍然存在,所以我可以在问题确定时将其设置为可见状态。我使用“关于”对话框( About Box) 实现这一点。
而且,我没有经历过任何明显的应用程序大小或性能损失。
我不试图破坏 MVC 模式 (MVC paradigm)。相反,我试图遵循它。我不将构成我的视图(View) 的表单与构成我的控制器(Controller) 的数据模块混合。我不认为它们是我的视图的一部分。 DataMovules只是表单。它们只是方便的工程构件。

1
嗯,我猜你喜欢多个数据模块。 ;) - Sertac Akyuz
8
与数据模块相比,窗体是“重量级”的。因为它们实际上是操作系统的“窗口”,使用系统资源,有一个 winproc 等等。数据模块更加轻便。没有必要显示只有非可见组件的窗体。是的,你可以向它们打印一些调试输出,但在我看来,有更好的方法来执行这个任务。 - user160694
是的,我会使用尽可能多的模块来逻辑地组织我的应用程序并促进重用。 - PA.
我使用可见组件,通常每个表格使用一个数据网格。 - PA.
+1 表述得很好。虽然不是我的方法,但仍然很有趣。 - Argalatyr

2

如果您只有一些数据库表,则为您的表对象创建一个数据模块是不错的选择。

而为您的操作创建一个数据模块则是另一个好的选择。

为图像列表创建一个独立的数据模块也是不错的选择。该数据模块仅包含图像列表,需要访问图像列表的表单可以从这个共享位置使用它们。

如果您有200个以上的表对象,则可能需要不止一个数据模块来处理它们。假设有一个涉及20个发票表和另外20个人力资源表的应用程序,如果它们内部的表格和代码不需要相互了解,或者即使其中一个模块在一个方向上具有"使用"依赖关系,但关系不是循环的,那么一个 InvoicingDataModule 和 HRDataModule 可以很好地分开。即便如此,更细粒度的数据模块划分也可以带来益处。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接