c++ - 以可维护的方式管理应用程序配置的模式

标签 c++ c++11 configuration app-config

我正在寻找一种 DRY 模式来管理跨平台 C++ 应用程序中的应用程序配置。

理想情况下,我希望有一个明确的应用程序配置来源,以最大限度地减少开发人员的维护负担。这可以存储为 txt、XML、JSON、YAML

这个文件有两个用途...

首先,它用于创建用户可访问的配置文件。

其次,它将确定在用户决定删除全部或部分配置文件的情况下使用的默认值。

我探索过的选项...

  1. 在编译时让某种预处理器将配置文件编译到应用程序中。这似乎是不可能的。

  2. 创建一个工具来读取配置文件,并生成必要的代码以将默认值编译到应用程序中。这可行,但会增加构建过程的复杂性,我希望避免这种情况。

  3. 创建两个配置文件,一个是用户可配置的,另一个包含隐藏的默认值。在应用程序启动时,默认文件被读取,然后用户文件被读取,通过覆盖默认值来应用用户设置。这并不理想,因为它依赖于隐藏文件来保证默认值对用户安全。

最佳答案

Config4Cpp为您想做的事情提供直接支持。有关详细信息,请阅读 Chapter 3 of the Config4* Getting Started Guide 中的讨论。关于嵌入式配置(将您的默认值硬编码到应用程序可执行文件中)和回退配置(本质上,从已解析的配置文件中查找请求变量的值,如果这不起作用,则“回退”以查找嵌入式配置中的值)。

如果您想将此方法与另一种配置文件语法(例如 json 或 XML)一起使用,则归结为以下步骤:

  1. 编写类似于 config2cpp 的命令行实用程序(在 Chapter 6 of the Config4* Getting Started Guide 中讨论)将配置文件(或者实际上是任何文本文件)转换为包含以下内容的(单例)C++ 类配置文件内容的快照,并且可以通过公共(public)方法提供对该快照的访问。您将使用您的应用程序的其余部分编译这个生成的 C++ 类,因此应用程序将“默认”配置变量嵌入其中。

  2. 使用您喜欢的配置文件语法的解析器,但要确保解析器可以解析外部文件或嵌入式配置文件。换句话说,您应该能够执行 cfg.parseFile("file.cfg")cfg.parseString(EmbeddedConfigurationClass::getString())

  3. 编写您自己的“包装器”配置 API 类,将两个 已解析的配置对象作为实例变量。这些变量之一将是解析的外部配置文件,另一个变量将是解析的嵌入式配置数据。实现包装类的lookup()方法,使其首先在解析的外部配置文件中查找指定的变量;如果失败,则该方法会在嵌入式配置数据中查找指定的变量。

这就是它的全部。 Config4* 为您提供了上述开箱即用的功能,但是,正如我在上面的步骤中所描述的,无论您喜欢什么配置文件语法,都应该很容易模拟类似的功能。

顺便说一句,如果你实现了这个功能,那么我建议你将外部配置文件设为可选。这样做意味着您的应用程序将能够开箱即用,而无需用户首先显式创建配置文件。在 Config4* 中,我称之为 zero configuration .

关于c++ - 以可维护的方式管理应用程序配置的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37926304/

相关文章:

c++ - 检查 n 值的倍数作为模同余

c++ - 无法在 std::min_element 的返回值上编译

java - Hibernate 4.3.5 - hibernate-entitymanager-4.3.5.Final.jar 有什么用

ruby-on-rails - Nginx + 配置错误

c++ - 将整数集转换为范围

c++ - 模板模板参数中默认模板参数的奇怪行为

c++ - 引用数组中的子数组

c++ - 如何强制实例化类模板的成员函数?

c++ - try catch finally construct - 它是在 C++11 中吗?

java - 如何拆分Spring条件配置?