我正在开发一个由多个模块组成的应用程序,这些模块也将用于其他应用程序。这些模块中的每一个都需要一些配置选项,但不应该知道其他模块的选项,也不应该要求其他模块存在。一些设置在模块之间共享。
假设模块 A 需要设置 x 和 y,模块 B 需要设置 y 和 z。
设置存储在注册表或一个或多个 .ini 文件中。
到目前为止,我已经考虑了以下方法:
- 拥有一个包含在所有模块中的全局单元(“global.pas”),并包含带有设置的全局变量。我不太喜欢这种方法,因为它要求所有应用程序都有这样一个单元,并且它必然会收集大量与原始目的无关的附加代码。所以最终每个应用程序都会有自己不兼容的全局单元。
- 每个模块都有配置类,其中包含该模块所需的所有设置。这些从应用程序的某个中心点传递到模块,该应用程序还处理读取和写入它们到某种永久形式(例如使用 JvAppStorage)。这需要模块之间进行一些同步,因为某些选项将在它们之间共享,因此如果在一个模块中更改了选项,则此更改必须以某种方式反映在另一个模块的配置中(不一定是实时的,而是下一次模块已初始化)。
- 具有传递给每个模块的通用配置类,其中包含所有模块的设置作为属性。每个模块只访问它知道的那些设置。这里的问题可能是名称冲突可能会在不被注意的情况下发生。此外,我不喜欢传递模块不需要的配置选项的想法。此外,每个应用程序都将包含不同的模块子集,但最终会包含相同的配置类以及所有可能模块的选项。(这与上面的全局单位方法没有太大区别。)
- 像上面一样,有一个传递给每个模块的通用配置类。但是模块没有属性,而是通过名称访问它们的设置(在最简单的情况下,这可能是 TCustomIniFile)。这避免了所有应用程序中所有模块的设置,但引入了可能的类型兼容性问题,并且名称冲突可能再次成为问题(除非每个模块都为其选项加上其名称的前缀,但它们不能再共享选项)。
我想每个编写模块化系统的人都面临过这个问题,并找到了一些他们后来坚持使用的解决方案,无论他们是否仍然喜欢它们。我也去过那里,几次,仍在寻找金子弹。
也许其他人已经找到了理想的解决方案?
(这是 Delphi 2007 以防万一。我已经在使用 JCL / JVCL。)