2012-04-30 31 views
0

我正在研究一個樹形結構的存儲,我們目前使用事務方法來修改樹形結構。我一直認爲使用命令模式是合適的。不過,我只是改變了一個小問題,我喜歡它(返回位於插入節點事務實例(除了屬性)):API設計/命令模式與「正常實現」對比

wtx.insertText(EInsert.ASRIGHTSIBLING, "value").insertElement(EInsert.ASRIGHTSIBLING, new QName("bla").insertElement(EInsert.ASFIRSTCHILD, new QName("blubb")).insertAttribute(new QName("foo"), "bar").insertAttribute(new QName("bar"), "foo")); 

我覺得鏈運作這種方式是非常好的,但我們的交易提供光標就像樹上的方法(moveTo(long),moveToParent(), moveToFirstChild() ...),它們返回的是布爾值而不是當前的事務實例,但我認爲這是無法避免的。否則,我們甚至可以做之間移動無需繁瑣的

wtx.method();wtx.method();wtx.method(); 

但是我想到這將是

new InsertText(EInsert.ASRIGHTSIBLING, "value").execute(wtx); 
new InsertElement(EInsert.ASRIGHTSIBLING, new QName("bla")).execute(wtx); 
... 

這是更詳細一點,但好,這將「支持」打開命令模式/封閉的原則,這是非常好的。

所以,你有什麼感想?

回答

1

對我來說,樹結構聽起來像是可以像一個巨大的複合物體一樣描述。既然你也在處理構建事務的問題,我認爲使用Command模式是合適的,但是如果可能的話,你應該考慮將你的execute()調用包裝在某種類型的director中,這樣你可以將Command和Builder模式混合在一起。

public void directorMethod(Object wtx) { 
    InsertText(EInsert.ASRIGHTSIBLING, "value").execute(wtx); 
    InsertText(EInsert.ASRIGHTSIBLING, "blah").execute(wtx); 
} 

注意,返回void可能是你的樹結構和WTX參數可以是交易和/或樹狀結構,我不一定相信你會如何想這樣做。使用Builder的想法是從底層實現中抽象組合事務的構建。這樣,如果你需要改變一個基礎命令,你應該能夠做到這一點並自動測試。

+0

你是什麼意思?「使用Builder的想法是從基礎實現中抽象複合事務的構建。」?樹結構本身是一個巨大的複合對象(帶有「指針」)。我不確定是否值得努力。我們經常在內部使用這些方法,並且我將不得不重寫一堆代碼。但幸運的是,我們現在沒有任何外部用戶;-)所以我可以改變任何事情,我想提供一個乾淨漂亮的API。 – Johannes

+0

順便說一句:通常你會使用某種導入(例如從XML文檔),然後使用Java API或者某天使用XQuery Update或類似的東西做一些更改。 – Johannes

+0

@Johannes - 複合材料通常使用建築師來建造。所以只要樹結構被視爲一個複合對象而不是一個文檔或一個數據源,這是值得考慮的。這個想法是把建築抽象成一個導演,這樣你就可以保證正確的創作。 – Joe