存储设置的最佳做法

Best practices for storing settings

本文关键字:最佳 设置 存储      更新时间:2023-10-16

我有一个相当大的C++应用程序(在Windows上,没有计划其他平台),它目前将所有设置(甚至是某种地址)存储在Windows注册表中。

有时这很不方便,因为用户很难更改注册表中的条目。我想对设置进行版本控制,以便设置始终与当前代码匹配。目前我们对 reg-files 进行版本控制,但您永远不确定是否所有 reg-file 都已添加到目标计算机上。使用 C#,可以在 app.config 中定义默认值,但不要覆盖现有设置。我不知道,C++是否存在这样的机制或库。

我希望有以下"功能":

  • 可以对设置进行版本控制
  • 目标计算机上的简单更新(可由用户完成)
  • 确保在更新时仅添加新设置,并且不会用默认值覆盖现有设置
  • 用户设置的简单更改
  • Win
  • XP 和 Win 7 下的工作流程相同

据我所知,有 3 种可能性可以在 Windows 上存储设置:

  • 注册表
  • 伊尼文件
  • XML 文件

目前,我们套件中只有一个应用程序使用Qt,但Boost将可用。

对于地址,我们会将它们放在某种 XML 地址簿中,但对于其他设置,我们不确定最佳做法是什么。

正如评论所提到的,基于树的键/值结构是一种常见的解决方案,库很容易找到。

Boost的property_tree是一个很好的选择,因为它经过了良好的测试,可以很容易地导出为XML或JSON。

关于您的要求:

  • 可以对设置进行版本控制

是的! 使"版本"成为顶级键。 使其易于与其他版本进行比较。

您还可以将设置分类为各种树节点,并为每个节点提供一个版本。

  • 目标计算机上的简单更新(可由用户完成)

让您的应用程序在运行时执行此操作。 见下文。

  • 确保在更新时仅添加新设置,并且不会用默认值覆盖现有设置
  • 用户设置的简单更改
  • Win
  • XP 和 Win 7 下的工作流程相同

当设置从一个版本更改为另一个版本时,这些更改通常分为三类。 需要新属性,放弃旧设置,并且某些设置会更改其预期格式。 例如,"32 华氏度"变为"0 摄氏度"

当应用程序初始化时:

  • 加载现有配置文件,而不考虑其版本。
  • 如果版本与应用程序的当前版本不匹配:
    • 为新配置创建新的空白属性树
    • 对于树中的每个节点,如果旧文件的树中没有此设置,请使用一组预期的属性名称,以及一个函数指针或类似名称来获取此设置。 如果设置更改了其格式,请为其指定新名称。
    • 在旧树中搜索每个设置,如果找到,则复制它,如果未找到,则使用提供的函数的结果。
    • 保存新的设置文件。

您的"缺失设置"功能可以:

  • 返回常量默认值。
  • 在树中查询其他设置并转换它(如果也找不到旧设置,则使用默认值)
  • 询问用户