【问题标题】:Pattern for managing application configuration in a maintainable way以可维护的方式管理应用程序配置的模式
【发布时间】:2016-10-21 22:22:38
【问题描述】:

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

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

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

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

其次,当用户决定删除全部或部分配置文件时,它将确定要使用的默认值。

我探索过的选项...

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

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

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

【问题讨论】:

  • 那么存在三个玩家:图书馆开发人员(您)、程序员(其他人)和用户(普通乔)?您是否希望普通的 Joe 修改应用程序设置(使用默认值,以防他删除某些设置)或程序员设置它们(再次使用默认值)?你的选项三听起来像我的前者,而你的选项一和二听起来像我的后者。
  • 如果主要的绊脚石有一个默认文件,只需将其作为字符串包含在程序中并解析字符串,就好像它是加载到字符串中的文件一样。然后使用相同的配置格式覆盖用户之后可以编辑的默认值。

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


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多