2010-11-15 58 views
3

我们有一个产品,其中每个客户都有一个XML配置文件,其中包含一组UI选项和子选项。例如,一种类型的用户(称为A)具有一组选项,而另一种类型的用户(B)具有不同的选项组。拥抱XML中的DRY原理

我遇到的问题是A和B共享大部分选项,尽管有时当他们共享一个选项时,一个或多个子选项会有所不同。

现在,我们正在为客户提供30种类型的用户,而不是两种类型的用户,并且该客户的配置文件臃肿,重复信息的次数高达30次,从而为开发创造了维护噩梦。

您会建议如何将DRY原理应用于这种情况?

回答

2

你需要实现继承的一种形式,就像在面向对象的编程语言或CSS,在你开始一组常见的选项继承,然后让它被更多特定集合中的其他选项覆盖。

您建立了选项集的层次结构,从顶部开始,选择所有用户都通用的选项,然后选择您已确定为许多类型用户共有的选项集,最后选择用户特定的选项。这需要在您的XML配置文件中表示为一棵树,方法是给每组选项一个名称和一个父项。树的底部是以特定类型的用户(As,Bs等)命名的选项集。

在你的程序中,你需要读取这个文件并在内存中组装树。然后,从上到下移动它,收集选项并在您选择时覆盖它们。当您到达树叶上的用户特定选项并执行最后一个覆盖时,就完成了。

当你考虑你的选择时,你可能会发现有些集合需要有多个父集合,因为它们结合了来自多个集合的选项。如果是这样的话,你的树就变成了一个DAG,并且在遍历它之前你需要对它进行拓扑分类。

我意识到这是一个复杂的解决方案,但我可以向您保证,这是处理具有共同元素的多种配置的最灵活的方式。为了配置多个使用相同后端的电子商务网站,我成功实施了它。

+0

我可以看到这个工作逐步添加/修改选项或子选项,但我将如何删除此方法下的选项? – 2010-11-15 21:19:16

+1

@Robert,你可以设置一个“未设置”值,或者设置另一个标签来删除,而不是设置一个选项。 – 2010-11-15 21:40:50

1

与Ant相同的方式:可以给每个唯一的配置信息一个ID,并且可以通过该ID引用。

示例(从Ant user manual):

<project ... > 
    <path id="project.class.path"> 
    <pathelement location="lib/"/> 
    <pathelement path="${java.class.path}/"/> 
    <pathelement path="${additional.path}"/> 
    </path> 

    <target ... > 
    <rmic ...> 
     <classpath refid="project.class.path"/> 
    </rmic> 
    </target> 

    <target ... > 
    <javac ...> 
     <classpath refid="project.class.path"/> 
    </javac> 
    </target> 
</project> 
+0

是否有任何工具可用于浏览/编辑此表单的XML文件? – 2010-11-15 19:54:36

+0

我会想到XPath,虽然它可能提取了功能(不太可能) – Anon 2010-11-15 20:09:06