2011-02-25 57 views
0

我見過用於走AST的訪客模式。要使用此模式,您需要在AST節點對象上添加一個accept(visitor)方法。這個方法調用visitor.visit(self),它反過來「處理」節點以獲得期望的結果(例如AST的漂亮版本)。當我的AST只是一個數組數組時,我應該使用Visitor嗎?

注意,你通常需要修改節點本身來添加方法。但是,如果AST正在使用內置對象呢? Ruby的Ripper庫將AST作爲數組返回。我可以添加accept方法如下:

class Array 
    def accept(visitor) 
    visitor.visit(self) 
    end 
end 

望着documentation for Array,目前還沒有accept方法,所以不會有衝突。但是,這並不適合我,特別是如果我自己寫一個圖書館。我不想「污染」其他人可能依賴的內置對象。

這並不是Ruby所特有的,不過,因爲我可以在C#中添加一個擴展方法做類似的事情。

我的問題是:我應該使用Visitor模式在這種情況下,或者我應該寫一個遞歸函數,僅僅發生在我工作的數據類型,並返回我想要的答案?

回答

0

訪問者模式是一種已知的解決方法來規避經常出現的問題(這裏的問題可能只適用於不提供multiple dispatch的編程語言)。

你似乎aknowledge,很多時候人們需要從什麼人可能想用它做的數據結構明確分開。

一般情況下,你擁有類的層次結構(與不同類型的節點樹)。然而,在這種情況下,我並沒有看到這種情況發生。所以我想知道你爲什麼要首先使用訪問者模式。創建不同的類,將你的數組作爲輸入並處理它,難道不是更簡單嗎?

+0

也許這是處理的最佳方式。至少我的部分問題是要求替代方案,如果訪問者不是正確的處理方法。我得考慮一下你的策略。 – 2011-03-08 14:24:04

+0

手頭的問題是相同類型數組的所有元素,還是它們具有不同的子類型? – 2011-03-08 21:43:23

相關問題