这是我开始讨论的延续here。我想找到模块化Delphi源代码的最佳方法,因为我在这个领域没有经验。我将很感激您的所有建议。
让我发一下我已写的there。
我工作的公司开发的软件包含100多个模块(大多数模块类似于不同设备的驱动程序)。他们中的大多数共享相同的代码 - 在大多数情况下是类。问题是这些类并不总是放在单独的独立PAS单元中。我的意思是共享代码通常放在包含特定于模块的代码的单元中。这意味着当您修复共享类中的错误时,将其定义的PAS单元复制到所有软件模块并重新编译它们是不够的。不幸的是,您必须将固定的代码片段逐个复制并粘贴到每个模块中,并将其粘贴到适当的单元和类中。这需要花费很多时间,这是我希望通过选择正确的方法在最近的将来消除 - 请帮助我。
我认为使用随EXE分发的BPL将是一个很好的解决方案,但它有一些缺点,正如前面讨论中提到的那些。最糟糕的问题是,如果每个EXE需要几个BPL,我们的技术支持人员将不得不知道哪个EXE需要哪个BPL,然后为最终用户提供适当的文件。只要我们没有软件更新程序,这对我们的技术人员和最终用户来说都是一个很大的优势。他们肯定会迷茫和生气: - /。
也可能出现兼容性问题 - 如果许多EXE共享一个BPL,那么对一个EXE的修改可能对一个EXE有利,对另一个EXE则有害。
我应该怎么做才能在这么多项目中更快地修复错误?我想到了以下方法之一。如果您有更好的想法,请告诉我。
对于很少修改的代码,这个解决方案似乎没问题。但我们也有具有一般使用功能和程序的通行单元,这些功能和程序经常进行修改。每次有人向此文件添加新功能时,都不可能执行相同的程序(复制和重新编译这么多项目)。
对我来说,这似乎是现在最好的解决方案,但有一些缺点。如果我在BPL中修复错误,每个程序员都必须在他们的计算机上更新BPL。如果他们忘记那样做怎么办?但是,我认为这是一个小问题。如果我们负责通知对方有关变化,一切都应该没问题。你觉得怎么样?
请帮我选择一个好的解决方案。我只是因为一种愚蠢的软件开发方法,我不希望公司在错误修正方面损失比必要的更多的时间和金钱。到目前为止,没有人关心它,你可以想象它会导致多少问题。
非常感谢你。
答案 0 :(得分:5)
你说:
- 为所有共享代码创建BPL,但将它们链接到EXE,所以 EXE是独立的。
您无法将BPL链接到可执行文件中。您只是链接在BPL中的单独单元中。这样你根本就不会使用甚至需要 BPL。
BPL旨在用作共享代码,即您将共享的代码放入一个或多个BPL中,并使用来自每个.exes,.dlls或其他.bpls的代码。错误修正(如果它们不改变BPL的公共接口)仅需要重新分配那个固定的BPL。
正如我所说,决定DLL的公共接口,然后不要更改它。您可以添加例程,类型和类,但不应修改已在使用的任何现有类,类型,接口,常量,全局变量等的公共接口。这样,可以很容易地分发固定版本的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进行。
版本控制系统可能会让这更容易,BTW。请务必为每个版本的BPL添加不同的后缀。
如果您确实需要独立的可执行文件,则不要使用BPL并只是在单独的单元中链接。 “使用BPL编译”选项可以控制它。
答案 1 :(得分:3)
从我的角度来看,尝试管理像Delphi单元,库和可执行文件这样的工件,你会在错误的地方搜索。我建议你转而开始重构代码,基于Design patterns实现。
E.g。所有常用函数都可以放在一个Singleton类中,公共类的实例可以用Abstract Factory构造,类可以通过本地Delphi实现接口而不是直接使用等等。即使您可以选择为项目的所有常见部分实施Facade。
当然,具体的模式选择和实施细节取决于具体项目,只有您可以决定适用于您的情况。 我想,在寻找这方面的项目之后,您可以找到更自然的代码组织方法和解决问题的方法。
其他一些事情: