2010-11-15 75 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