Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 读/写同一配置文件的不同版本的设计方法_C++_Xml_Qt_Design Patterns_User Interface - Fatal编程技术网

C++ 读/写同一配置文件的不同版本的设计方法

C++ 读/写同一配置文件的不同版本的设计方法,c++,xml,qt,design-patterns,user-interface,C++,Xml,Qt,Design Patterns,User Interface,在我们的项目中,我们得到了一个使用外部配置文件(比如server.xml)的应用程序。现在我们需要在C++/QT中设计一个安装工具GUI来读取/编辑这样的配置文件,它应该能够处理这样的文件的所有不同版本。用户将选择文件版本,然后继续编辑。从一个版本到另一个版本变化不大,可能有一个新的xml标记,一个具有不同名称或位于不同位置的标记 这样做的最佳设计方法是什么?我们计划采用标准的MVC设计模式,但是如何处理所有不同的配置版本而不重新编写相同的GUI代码呢 下面是示例配置文件: <?xml v

在我们的项目中,我们得到了一个使用外部配置文件(比如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>

真的
真的
10000
50000
5000
真的
20
192.168.0.227
21
******
******
192.168.0.227
50023
/资产负债表
172800000
127.0.0.1
5567

这并不是一个简单的解决方案,但我这里有一些事情要做/考虑。每种情况都会有所不同

  • 在配置文件中有一个明确的版本标识符。在他们身上留下指纹真是一件(容易出错的)痛苦事
  • 考虑使用一个可以在不同版本之间更新的工具。这将比阅读旧版本并尝试应用它们更容易。
    • 我可能更容易单独执行每个版本步骤,但这可以使转换更少“无损”。一个快乐的混合是从一个版本到另一个版本进行小的更新,但有“检查点”的大的升级,可以直接跳到最新的(或最新的“检查点”)。这有点像偶尔使用完整备份快照
    • 随时通知用户。如果您更改系统管理员的设置,他将不会高兴。您可能希望使流程具有交互性,或者将注释放入每个添加/移动/删除设置的文件中。我还建议在文件的某些部分保留删除的设置,以供用户参考。(记下它们为什么也在那里)
  • 备份旧文件。您的脚本将崩溃,并将吃掉数据。执行类似于命名当前文件的操作
    ${oldname}.old-${ver}
    。在文件的不同部分保存设置并不总是足够的,这将为用户省去很多心痛

    • 这并不是一个简单的解决方案,但我这里有一些事情要做/考虑。每种情况都会有所不同

      • 在配置文件中有一个明确的版本标识符。在他们身上留下指纹真是一件(容易出错的)痛苦事
      • 考虑使用一个可以在不同版本之间更新的工具。这将比阅读旧版本并尝试应用它们更容易。
        • 我可能更容易单独执行每个版本步骤,但这可以使转换更少“无损”。一个快乐的混合是从一个版本到另一个版本进行小的更新,但有“检查点”的大的升级,可以直接跳到最新的(或最新的“检查点”)。这有点像偶尔使用完整备份快照
        • 随时通知用户。如果您更改系统管理员的设置,他将不会高兴。您可能希望使流程具有交互性,或者将注释放入每个添加/移动/删除设置的文件中。我还建议在文件的某些部分保留删除的设置,以供用户参考。(记下它们为什么也在那里)
      • 备份旧文件。您的脚本将崩溃,并将吃掉数据。执行类似于命名当前文件的操作
        ${oldname}.old-${ver}
        。在文件的不同部分保存设置并不总是足够的,这将为用户省去很多心痛

      版本控制应始终设计为尽可能健壮和简单。对于您来说,确定应用程序的每个版本是否必须与安装工具的每个版本兼容(这是很少见的),或者如果任何较新的安装工具与任何相同或较旧的应用程序一起工作,您是否能够满足您的需要,这一点至关重要,但反之亦然

      单向兼容性

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

      一旦有一天您无法保持输入的向后兼容性,您只需更改version属性的值,并在安装工具中对其进行特殊的装箱

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

      双向兼容性

      需要严格的版本控制。应为XML文件的每个版本定义模式定义(XSD、RelayNG,…),并在安装工具读取、安装工具写入或应用程序读取文件时,对其进行验证。如果同一XML的解释发生了变化,那么对于几个连续的版本,模式定义可能是相同的,因此,如果有疑问,请始终增加版本号

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