0

在我们的项目中,我们有一个使用外部配置文件(比如 server.xml)的应用程序。现在我们需要在 C++/QT 中设计一个设置工具 GUI 来读取/编辑此类配置文件,它应该能够处理此类文件的所有不同版本。用户将选择文件版本,然后继续编辑。从一个版本到另一个版本并没有太大的变化,也许有一个新的 xml 标签,一个不同名称或不同位置的标签。

这样做的最佳设计方法是什么?我们正计划采用标准的 MVC 设计模式,但是如何处理所有不同的配置版本而无需再次重写相同的 GUI 代码?

这里是示例配置文件:

<?xml version="1.0" encoding="utf-8"?>
<Server_configuration ver="11">
  <core>
    <enable-tms>true</enable-tms>
    <enable-gui-messages>true</enable-gui-messages>
    <waiting-for-config-timeout>10000</waiting-for-config-timeout>
    <remoting>
      <port>50000</port>
      <join-timeout>5000</join-timeout>
      <ismultithread>true</ismultithread>
      <maxconcurrentrequests>20</maxconcurrentrequests>
    </remoting>
  </core>
  <content>
    <ftp>
      <ip>192.168.0.227</ip>
      <port>21</port>
      <userid>******</userid>
      <passwd>******</passwd>
    </ftp>
    <library>
      <ip>192.168.0.227</ip>
      <port>50023</port>
    </library>
    <local>
      <asset-root>/assetroot</asset-root>
      <kdm-expiration-warning>172800000</kdm-expiration-warning>
    </local>
    <hula-store-daemon>
      <ip>127.0.0.1</ip>
      <port>5567</port>
    </hula-store-daemon>
  </content>
</Server_configuration>
4

2 回答 2

2

这并不意味着解决方案的下降,但我这里有一些事情要做/考虑。每种情况都会有所不同。

  • 在您的配置文件中有一个明确的版本标识符。对它们进行指纹识别是一种真正的(容易出错的)痛苦。
  • 考虑拥有一个可以从一个版本更新到另一个版本的工具。这将比阅读旧版本并尝试应用它们更容易。
    • 我可能更容易单独执行每个版本步骤,但这可以使转换不那么“无损”。一个快乐的混合是从一个版本到另一个版本进行小更新,但有“检查点”主要升级,这些升级将直接跳到最新的(或最新的“检查点”)。这有点像每隔一段时间进行一次完整备份快照的增量备份。
    • 让用户了解情况。如果您更改他的设置,系统管理员将不会高兴。您可能希望使流程具有交互性或将注释放入每个添加/移动/删除设置的文件中。我还建议在文件的某些部分保留已删除的设置以供用户参考。(记下它们为什么也在那里)。
  • 备份旧文件。你的脚本会崩溃,它会吃掉数据。做一些类似命名当前文件的事情${oldname}.old-${ver}~。将设置保存在文件的不同部分并不总是足够的,这将为您的用户节省很多心痛。
于 2012-11-05T17:33:56.250 回答
1

版本控制应始终设计得尽可能健壮和简单。确定您的应用程序的每个版本是否必须与每个版本的设置工具兼容(这种情况很少见),或者您是否可以满足您的需求(例如,如果任何更新的设置工具与任何相同或较旧的应用程序,但反之则不然。

单向兼容性

为后者设计的一种可能性是向 XML 文件添加版本属性,但尝试通过始终仅以向后兼容的方式更改 XML 文件的结构和语义来使其永远保持相同的固定值。例如,添加一个元素是向后兼容的,只要设置工具能够以与旧设置工具和应用程序相同的方式解释它的缺失。新的设置工具总是将(等效)值写入新元素并没有什么坏处,因为不需要与旧应用程序的双向兼容性。

一旦有一天您无法保持输入的向后兼容性,您只需更改版本属性的值并在设置工具中启动特殊的大小写。

如果您根据 XSD 验证 XML,请注意 XSD 实际上可以为您做一件经常有用的事情:分配默认属性值。这样,您的设置工具的源代码甚至可能不会真正注意到底层文档缺少最近添加的属性!

两路兼容性

需要严格的版本控制。应为 XML 文件的每个版本定义模式定义(XSD、RelayNG、...),并且在设置工具读取、设置工具写入或应用。如果对同一个 XML 的解释发生了变化,则模式定义对于多个连续版本可能是相同的,因此当有疑问时,请始终增加版本号。

尽你所能教育每个人,他们不能只编辑最新的模式并取消它。不可靠的版本控制比没有版本控制更糟糕。

于 2012-11-05T17:55:56.810 回答