delphi - Delphi 中模块化编程的最佳方法

标签 delphi bpl modularization

这是我开始的讨论的延续 here 。我想找到模块化 Delphi 源代码的最佳方法,因为我在这个领域没有经验。我将非常感谢您的所有建议。

让我发布我已经写过的内容there .

我工作的公司开发的软件由 100 多个模块组成(其中大部分是不同设备的驱动程序)。它们中的大多数共享相同的代码——大多数情况下是类。问题是这些类(class)并不总是被放入单独的、独立的 PAS 单元中。我的意思是共享代码通常被放入包含特定于模块的代码的单元中。这意味着当您修复共享类中的错误时,仅将其定义的 PAS 单元复制到所有软件模块中并重新编译它们是不够的。不幸的是,您必须将固定的代码片段逐一复制并粘贴到每个模块中,并粘贴到适当的单元和类中。这需要花费大量时间,我希望在不久的将来通过选择正确的方法来消除这种情况 - 请帮助我。

我认为使用与 EXE 一起分发的 BPL 将是一个很好的解决方案,但它有一些缺点,正如前面讨论中提到的一些缺点。最糟糕的问题是,如果每个 EXE 需要多个 BPL,我们的技术支持人员将必须知道哪个 EXE 需要哪个 BPL,然后为最终用户提供正确的文件。只要我们没有软件更新程序,这对我们的技术人员和最终用户来说都是一件好事。他们肯定会迷路并生气:-/。

还可能出现兼容性问题 - 如果一个 BPL 被许多 EXE 共享,则对该 BPL 的修改可能对一个 EXE 有利,但对其他一些 EXE 不利。

那么我应该怎么做才能在这么多项目中更快地修复错误?我想到了以下方法之一。如果您有更好的想法,请告诉我。

  • 将共享代码放入单独且独立的 PAS 单元中,这样当其中一个单元出现错误修复时,只需将其复制到所有项目(覆盖旧文件)并重新编译所有项目即可。这意味着每个单元被复制的次数与它所使用的项目的数量一样多。

就很少修改的代码而言,这个解决方案似乎还不错。但我们也有具有通用功能和程序的 pa 装置,这些装置经常进行修改。每次有人向此文件添加新函数时,不可能执行相同的过程(复制和重新编译这么多项目)。

  • 为所有共享代码创建 BPL,但将它们链接到 EXE,以便 EXE 是独立的。

对我来说,这似乎是现在最好的解决方案,但也有一些缺点。如果我在 BPL 中修复错误,每个程序员都必须更新他们计算机上的 BPL。如果他们忘记这样做怎么办?不过,我认为这是一个小问题。如果我们注意互相通报变化,一切都会好起来的。你觉得怎么样?

  • 最后一个想法,由CodeInChaos提出(我不知道我是否理解正确)。在项目之间共享 PAS 文件。这可能意味着我们必须将共享代码存储在单独的文件夹中,并让所有项目在那里搜索该代码,对吧?我想,每当需要修改项目时,都必须将其与共享文件夹一起从 SVN 下载。共享代码中的每次更改都必须导致使用该代码的每个项目重新编译。

请帮我选择一个好的解决方案。我只是不希望公司仅仅因为愚蠢的软件开发方法而在错误修复上损失更多的时间和金钱。到目前为止还没有人关心过它,你可以想象它会引起多少问题。

非常感谢。

最佳答案

你说:

  • Create BPLs for all the shared code, but link them into EXEs, so that EXEs are standalone.

您无法将 BPL 链接到可执行文件中。您只需链接 BPL 中的单独单元即可。这样,您实际上就不会使用甚至需要 BPL。

BPL 旨在用作共享代码,即您将共享的代码放入一个或多个 BPL 中,并使用每个 .exe、.dll 或其他 .bpls 中的代码。错误修复(如果它们不更改 BPL 的公共(public)接口(interface))仅需要重新分发该固定的 BPL。

正如我所说,确定 DLL 的公共(public)接口(interface),然后不要更改它。您可以添加例程、类型和类,但不应修改已在使用的任何现有类、类型、接口(interface)、常量、全局变量等的公共(public)接口(interface)。这样,就可以轻松分发 BPL 的固定版本。

但请注意,BPL 高度依赖于编译器版本。如果您使用新版本的编译器,则还必须重新编译 BPL。这就是为什么根据编译器版本给 BPL 后缀(如 100、110 等)是有意义的。然后,使用编译器版本 15.0 编译的可执行文件将被告知使用后缀为 150 的 BPL,而使用版本 14.0 编译的可执行文件将使用后缀 140 的 BPL。这样,不同版本的 BPL 就可以和平共存。后缀可以在项目选项中设置。

你们如何管理不同的版本?创建一个目录,其结构类似于我的 ComponentInstaller BPL(这是您可以在 Delphi/C++Builder/RAD Studio XE IDE 菜单“组件 -> 安装组件”下看到的专家):

Projects
  ComponentInstaller
    Common
    D2007
    D2009
    D2010
    DXE

Common 目录包含每个版本共享的 .pas 文件和资源(位图等),每个 Dxxxx 目录包含该特定版本的 BPL 的 .dpk、.dproj 等。每个包都使用 Common 目录中的文件。当然,这可以同时对多个 BPL 完成。

顺便说一句,版本控制系统可能会让这变得容易得多。请务必为每个版本的 BPL 指定不同的后缀。

如果您确实想要独立的可执行文件,则无需使用 BPL,只需链接到单独的单元即可。选项“使用 BPL 进行编译”对此进行控制。

关于delphi - Delphi 中模块化编程的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7067338/

相关文章:

c - 错误: misuse of undefined type 'struct IntArray'

delphi - 为应用程序启用主题

delphi - 是否可以仅基于 BPL/DCP,针对未检查 "Build With Runtime Packages"的 BPL/DCP 构建 EXE 项目?

c++ - 构建项目包C++ Builder

delphi - 如何从可执行文件调用 bpl 中的 Delphi 函数?

javascript - 关于 JavaScript 中的模块模式

sql-server - Delphi:基于互联网的数据源

delphi - FireDAC:阵列 DML 进展

Delphi函数将WrapText的Result转换为TStringList

drools - 我们如何在 JBoss 规则中的 .drl 文件之间共享单独的规则?