在XML中使用DRY原则

时间:2010-11-15 18:55:22

标签: xml dry

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

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

现在,我们正在为客户提供30种类型的用户,而不是两种类型的用户,并且客户的配置文件会膨胀,同一条信息重复多达30次,从而为开发创造了维护的噩梦。 / p>

您建议采用哪种方式将DRY原则应用于这种情况?

2 个答案:

答案 0 :(得分:2)

您需要实现一种继承形式,就像面向对象编程语言或CSS中的继承一样,您可以从一组常用选项开始,然后允许它被更具体的集合中的其他选项覆盖。

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

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

当您考虑选项时,您可能会发现某些集需要有多个父集,因为它们组合了多个集的选项。如果是这种情况,您的树将变为DAG,并且在遍历它之前需要对其进行拓扑排序。

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

答案 1 :(得分: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>