我们有一个产品,每个客户都有一个XML配置文件,其中包含多组UI选项和子选项。例如,一种类型的用户(称为A's)具有一组选项,而另一种类型的用户(B's)具有不同的选项集。
我遇到的问题是A和B共享大部分选项,但有时当他们共享一个选项时,一个或多个子选项会有所不同。
现在,我们正在为客户提供30种类型的用户,而不是两种类型的用户,并且客户的配置文件会膨胀,同一条信息重复多达30次,从而为开发创造了维护的噩梦。 / p>
您建议采用哪种方式将DRY原则应用于这种情况?
答案 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>