在我们的项目中,我们得到了一个使用外部配置文件的应用程序(比如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>
答案 0 :(得分:2)
这绝不是一个解决方案,但我在这里有一些事情要做/考虑。每种情况都会有所不同。
${oldname}.old-${ver}~
之类的操作。将设置保存在文件的不同部分不会总是足够,这将为您的用户带来很多心痛。答案 1 :(得分:1)
版本控制应始终设计为健壮且尽可能简单。确定应用程序的每个版本是否必须与每个版本的设置工具兼容(这种情况很少见),或者是否可以满足您的需求,如果任何较新的设置工具可以与任何相同的工具一起使用,或者至关重要。较旧的应用程序,但反之亦然。
单向兼容性
为后者设计的一种可能性是向XML文件添加一个版本属性,但是通过始终只以向后兼容的方式更改XML文件的结构和语义,尝试永远保持相同的固定值。例如,添加元素是向后兼容的,只要设置工具能够以旧设置工具和应用程序的行为相同的方式解释其缺失。新设置工具总是将(等效)值写入新元素并不会有害,因为不需要与旧应用程序的双向兼容性。
当您无法保持输入的向后兼容性时,您只需更改版本属性的值并在设置工具中启动特殊包装。
如果您针对XSD验证XML,请注意XSD实际上可以为您做一件经常有用的事情:分配默认属性值。这样,您的设置工具的源代码甚至可能实际上没有注意到底层文档缺少最近添加的属性!
双向兼容性
需要严格的版本控制。应为XML文件的每个版本定义模式定义(XSD,RelayNG,...),并且在设置工具读取,设置工具写入或读取文件时,应对文件进行验证。应用。如果对同一XML的解释发生了变化,则几个连续版本的模式定义可能相同,因此如有疑问,请始终增加版本号。
做些什么可以教育每个人他们不能只编辑最新的架构并取消它。不可靠的版本控制比没有版本控制更糟糕。