7

为了启动我的 C++ 程序,我需要读取一些配置,例如 IP 地址、端口号、文件路径……这些设置可能会经常更改(每周或每天!),因此将它们硬编码到源文件中并不是一件容易的事好主意。

经过一些研究,我很困惑是否存在从文件加载配置设置并使这些配置可用于同一项目中的其他类/模块/*.cpp 的最佳实践。

静电不好;单例不好反模式?)那么,我们还有哪些其他选择?或者,也许“配置文件”的想法是错误的?

编辑:我没有加载配置文件的问题。我担心,在将所有这些设置加载到内存中的 std::map< string, string > 之后,如何让其他类、函数访问这些设置。

编辑2:感谢大家的意见。我知道我在这里列出的这些模式是FINE,并且它们被许多程序使用。我很好奇是否有(某种)最佳模式来处理程序的配置。

4

2 回答 2

5

可以说,配置文件是 Singleton 的合法用途。单例模式通常不受欢迎,因为单例会在多线程环境中导致竞争条件问题,并且由于它们是全局可访问的,因此您会遇到与全局相同的问题。但是,如果您的 Singleton 对象在您读取配置文件时被初始化一次,并且此后从未更改过,那么除了某种货物崇拜心态之外,我想不出有正当理由将其称为“反模式”。

话虽如此,当我需要将配置文件作为对象提供给我的应用程序时,我不使用单例。通常我将配置对象传递给那些需要它的对象/函数。

于 2013-04-16T16:03:23.530 回答
2

我知道解决这个问题的最佳模式是通过一个选项类,它在创建/配置时被注入到你的代码中。

脚步:

  1. 创建一个选项解析器类
  2. 配置解析器应该接受哪些参数和选项,以及它们的默认值(默认值可以是您的“最可能的”默认值)
  3. 编写客户端代码以接受选项作为参数(而不是单例和/或静态的东西)。
  4. 创建对象时注入选项。

查看boost.program_options以获得已经成熟的程序选项模块。如果您熟悉 python,请查看argparse 文档中的示例(相同的概念,在 python 库中实现)。他们很容易从中获得概念和交互。

于 2013-04-16T16:11:05.037 回答