Delphi中进行数据库开发的最佳实践是什么?

12
  1. 如何使用RAD方式高效地进行编码(代码复用)。有没有示例、现有库或基本的CRUD生成器?
  2. 如何采用面向对象编程(OOP)的方式进行设计?为连接、抽象不同引擎/数据库访问层(BDE-DBExpress-ADO)、基本CRUD操作使用哪些设计模式?
6个回答

4

如果您使用“将每个数据库对象放入一个大数据模块”(或在大型应用程序中使用“少量大型数据模块”)方法,请非常小心。这可能会使您的项目的数据模块变得如此庞大,以至于您必须使用高清晰度监视器才能查看此数据模块上的所有TXDataset。
最重要的是:改用专门的业务逻辑类而不是大型全局数据模块。仅在非常小的项目中使用仅包含逻辑的全局数据模块。


数据模块没有必要变得太大。 - H H
@smok1:你写了模块(s),注意是复数。而且-1不是我的。 - H H
1
Henk Holterman,谢谢,你是对的。我稍微编辑了一下。我曾经与一个大型应用程序(500个pas文件)一起工作,架构师决定将所有内容放入5个DM中。因此,我们有5个数据模块,每个模块包含约100个数据集。即使没有单个DM,这种方法也很糟糕。 - smok1

4
我强烈建议您在设计用户界面时使用操作(TActionList)。这些操作包括对数据集执行的下一个/上一个/插入/删除/编辑/更新操作等许多预定义操作,因此使用这些操作并将它们链接到表单上的按钮/菜单是一个好的做法。这可以避免重复编写UI逻辑代码。
对于Delphi来说,没有必要使用CRUD生成器!只需向表单添加TDataSource、TDBGrid和TActionList,将预定义的数据源操作添加到操作列表中,将这些操作链接到按钮或菜单即可完成!

4
我有自己的Delphi/MySQL框架,可以快速添加“新屏幕”。我不会分享它,但是我可以描述我采取的方法:
我使用基于TFrame的分页界面层次结构。我创建一个选项卡并将TFrame链接到其中。
我通过标准的mysql存储过程实现处理所有crud管道和并发控制。如CustomerSEL,CustomerGET,CustomerUPD,CustomerDEL等…
我的主要表单实际上包含导航栏面板和包含TPageControl的面板
我的层次结构中类的示例
TFrame TMFrame-我的派生,具有捕获OnShow、OnHide和其他特定内容的接口实现
-TWebBrowserFrame -TDataAwareFrame --TObjectEditFrame ---TCustomerEditFrame ---TOrderEditFrame 等等... --TObjectListFrame ---TCustomerListFrame 等等...
还有一些对话框。。
TDialog TMDialog -TDataAwareDialog --TObjectEditDialog ---TContactEditDialog 等等。 --TObjectSelectDialog ---TContactSelectDialog
等等...
当我添加一个新对象进行管理时,它可以是客户的新属性,比如我们想跟踪客户拥有哪些车辆。
创建表CustomerVehicles 运行我的特殊sproc生成器,创建我的SEL、GET、UPD、DEL 测试它们...
从我上面提到的基础类派生,放置一些控件。在TCustomerEdit中添加选项卡。
Delphi始终将数据集作为抽象层,通过DataSources将其公开到GUI。将数据集添加到客户数据模块,并“注册”它。我自己的自定义函数在我的派生数据模块类TMDataModule中。
安全控制同样在框架中处理。我“注册”需要安全标志才能可见或启用的组件。
我通常可以在一个小时内添加一个新对象、构建sprocs并添加维护屏幕。
当然,这通常只是开始,通常当你添加一些东西时,你会用它来跟踪更多东西。如果这是一个车库应用程序,我们想要添加客户带进车库的车辆,对其进行标识,以便我们可以跟踪历史记录。但即使如此,速度也很快。
我曾经试过向使用“新开发工具”的年轻人分包,他们似乎从不相信我说我可以用Delphi比他们快十倍完成所有工作!我可以在两个小时内无错误地完成他们需要两天才能完成且仍有漏洞的工作...
DO-小心计划您的VFI!正如某人所提到的,如果您想更改父类之一上组件的名称,请准备好麻烦。您需要打开和“编辑”层次结构中的每个子级,即使您清除了DCU,您仍然可能会遇到一些DFM问题。我可以向您保证,在2006年,这仍然是一个问题。

不要创建一个庞大的数据模块

在设计前端时要慢慢来,如果你已经创建了大量依赖项,重构可能会成为一个有趣的挑战,但当你需要快速让新东西运行时,它可能会成为一场噩梦!


你应该使用<pre>标签来保留你的对象层次结构的格式。 - mghie

3
对于大型应用程序,我使用tiopf对象持久性框架。这使我能够处理对象而不是数据集,并轻松地交换数据库。我的大部分业务逻辑都移动到了业务对象模型(BOM)中,我的表单相对简单。tiopf有几种方法将BOM连接到表单中:持久性感知控件,Ttidataset用于数据感知控件,以及Mogel Gui Mediator类用于连接普通控件。

对于小型和快速应用程序,我只使用数据模块和数据库组件。要记住的主要事项包括:
  • 尽可能将代码放在数据模块中(尽量少放在表单中)。
  • 按功能拆分为多个数据模块,例如电子邮件模块、收入模块、发票模块等。
  • 测试,测试,测试。

2

使用VFI(可视化表单继承)。设计一个标准的数据库表单。例如,空的DataSet,DataSource,由2个选项卡组成的PageControl。第一个选项卡为空,稍后您将添加编辑控件以操作子表单中的数据。在第二个选项卡中添加DBGrid。请注意,这不是面向对象的方式,但它很容易和快速。


非常小心。如果您更改父窗体中的某些内容,有时您可能不会注意到,子窗体在运行时会崩溃。这在Delphi5中非常常见,不知道现在是否仍然存在此问题。 - smok1
1
如果我更改了父窗体上的某些内容,通常情况下我会重新打开应用程序中的所有窗体。我这样做并选择“全部保存”即可。Andreas Hausladen有一个DfmCheck实用程序可以比手动操作更快速地完成此操作;-) - Fabricio Araujo

2

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