【问题标题】:What are the best practices for database development with Delphi?使用 Delphi 进行数据库开发的最佳实践是什么?
【发布时间】:2015-11-25 06:53:46
【问题描述】:
  1. 如何有效地使用 RAD 方式(重用代码)。任何 示例,现有库,基本 crud 生成器?
  2. 如何设计 OOP 方式?哪个 使用的设计模式 连接,抽象不同 引擎/数据库访问层 (bde-dbexpress-ado),基本 CRUD 操作。

【问题讨论】:

    标签: database delphi oop


    【解决方案1】:

    我有自己的 Delphi/MySQL 框架,可以让我非常快速地添加“新屏幕”。我不会分享它,但我可以描述一下我采取的方法:

    我使用带有基于 TFrame 层次结构的选项卡式界面。我创建了一个选项卡并将一个 TFrame 链接到其中。

    我使用标准的 mysql 存储过程实现来处理所有的 crud 管道和并发控制。 CustomerSEL、CustomerGET、CustomerUPD、CustomerDEL 等...

    我的主窗体基本上包含导航栏面板和一个包含 TPageControl 的面板

    我的层次结构中的类示例

    TFrame TMFrame - 我的派生,具有捕获 OnShow、OnHide 和其他一些细节的接口实现

    --TWebBrowserFrame --TDataAwareFrame --TObjectEditFrame --TCustomerEditFrame --TOrderEditFrame ETC... --TObjectListFrame --TCustomerListFrame

    等等……

    还有一些对话框..

    TDialog TM对话框 --TDataAwareDialog --TObjectEditDialog -- TContactEditDialog ETC.. --TObjectSelectDialog --TContactSelectDialog

    等等……

    当我添加要管理的新对象时,它可能是客户的新属性,假设我们要跟踪客户拥有哪些车辆。

    创建表 CustomerVehicles 我运行我的特殊 sproc 生成器来创建我的 SEL、GET、UPD、DEL 测试那些...

    从我上面提到的基类派生,删除一些控件。向 TCustomerEdit 添加一个选项卡。

    Delphi 始终将数据集作为抽象层,通过数据源将其公开给您的 GUI。将数据集添加到客户数据模块,并“注册”。在我的派生数据模块类 TMDataModule 中我自己的自定义函数

    在框架中同样处理安全控制。我“注册”需要安全标志可见或启用的组件。

    我通常可以在一小时内添加一个新对象、构建存储过程、添加维护屏幕。

    当然,这通常只是开始,通常当您添加某些内容时,您将其用于跟踪之外。如果这是一个车库应用程序,我们想要添加客户带入车库的车辆,并对其进行标识,以便我们可以跟踪历史记录。但即便如此,它也很快。

    我曾尝试使用“较新的开发工具”向年轻人分包,但当我说使用 Delphi 可以将这一切都快十倍时,他们似乎从来不相信我!我可以在两个小时内完成他们似乎需要两天时间的工作,但他们仍然有错误......

    做 - 小心规划您的 VFI!正如有人提到的,如果您想更改其中一个父类上的组件名称,请做好麻烦的准备。您将需要打开和“编辑”层次结构中的每个子级,即使您清理了 DCU,您仍然可能会遇到一些 DFM 地狱。我可以向你保证,在 2006 年这仍然是个问题。

    不要创建一个怪物数据模块

    一定要花时间进行前期设计,在创建大量依赖项之后进行重构可能是一个有趣的挑战,但是当您必须让新的东西快速工作时,这将是一场噩梦!

    【讨论】:

    • 您应该使用
       来保持对象层次结构的格式。
    【解决方案2】:

    如果您使用“将每个数据库对象放入一个大数据模块”(或大型应用程序中的“几个大数据模块”)方法,请务必小心。这会使您的项目具有如此大的数据模块,以至于您必须使用高清监视器才能查看此数据模块上的所有 TXDataset
    底线:切换到使用专门的业务逻辑类而不是大的全局数据模块。仅在非常小的项目中使用具有逻辑的全局数据模块。

    【讨论】:

    • Datamodules 没有理由变大。
    • @smok1:你写了模块,注意这些。 -1 不是我的。
    • 亨克·霍尔特曼,谢谢,你是对的。我对此进行了一些编辑。我曾经使用过大型应用程序(500 个 pas 文件),架构师决定我们将把所有东西都放入 5 个 DM 中。所以我们有 5 个数据模块,每个模块包含大约 100 个数据集。即使没有单一的 DM,这种方法也很糟糕。
    【解决方案3】:

    好吧,我强烈建议您在设计用户界面时使用 Actions (TActionList)。有许多预定义的操作,包括可以对数据集执行的 Next/Prev/Insert/Delete/Edit/Update 操作,因此最好使用这些操作并将它们链接到表单上的按钮/菜单。这可以防止 UI 逻辑的重复代码。

    Delphi 不需要 CRUD 生成器!将 TDataSource、TDBGrid 和 TActionList 添加到表单,将预定义的数据源操作添加到操作列表,将这些操作链接到按钮或菜单,就完成了!

    【讨论】:

      【解决方案4】:

      对于大型应用程序,我使用tiopf 对象持久性框架。这让我可以轻松地处理对象而不是数据集并交换数据库。我的大部分业务逻辑都转移到了业务对象模型 (BOM) 中,而且我的表单非常愚蠢。 tiopf 有几种方法可以将 BOM 连接到表单;持久性感知控件、用于数据感知控件的 Ttidataset 和用于连接普通控件的 Mogel Gui Mediator 类。

      对于小而快的应用,我只使用数据模块和数据库组件。要记住的主要事项是:

      • 在数据模块中添加尽可能多的代码(在表单中尽可能少)。
      • 按功能划分多个数据模块,例如电子邮件模块、收入模块、发票模块...
      • 测试,测试,测试

      【讨论】:

        【解决方案5】:

        使用 VFI(视觉形式继承)。设计一个标准的 DB 表单。例如,空的 DataSet、DataSource、一个由 2 个工作表组成的 PageControl。首先将为空,稍后您将添加编辑控件以在子窗体中操作数据。将 DBGrid 添加到第二张工作表。请注意,虽然这不是 OOP 方式,但它既简单又快速。

        【讨论】:

        • 要非常小心。您是否在父表单中进行了更改,有时您不会注意到子表单会在运行时爆炸。这在 Delphi5 中很常见,不知道现在是否还有问题。
        • @smok1 如果我更改父表单上的某些内容,通常我会重新打开应用程序的所有表单。我这样做并保存所有.... 通常是所有需要的。 Andreas Hausladen 有一个 DfmCheck 实用程序,它比手动完成的要多;-)
        【解决方案6】:

        我会看看 Remobjects 的 Data Abstract

        【讨论】:

          猜你喜欢
          • 2018-10-21
          • 1970-01-01
          • 2016-04-06
          • 2019-08-22
          • 2015-07-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多