2016-04-20 33 views
0

例如,我從ASTParser獲得一個CompilationUnit。爲什麼我需要接受的,而不是使用正常方法訪問者:AST:訪問和僅使用查詢方法有什麼區別?

ASTParser parser ... //all that stuff 

CompilationUnit unit = (CompilationUnit) parser.createAST(null); 

然後我做的:

unit.types() //get all type declarations 

,並從這裏開始我只是不斷下降的AST,直到葉節點,就像沒有使用訪問。使用訪問者模式而不是我提出的建議有什麼優勢?

回答

0

訪問者的目的(子類型ASTVisitor)是遍歷整個AST,因此您可以毫不費力地檢查每個AST節點(除非訪問方法返回false,此時當前節點下面的子樹被跳過)。

當直接查詢AST時,您負責遍歷所有感興趣的節點。

使用unit.types()時,您只能獲得頂級類型聲明,但使用訪問者可以輕鬆處理包括嵌套類型在內的編譯單元中的所有類型。

正確實施時,兩種方法都應顯示相同的行爲。因此,需要編寫代碼的數量和代碼的清晰度(訓練有素的眼睛會立即瞭解訪問者的使用情況,但需要仔細閱讀手動遍歷)。

+0

我明白了。手動遍歷看起來更自然,更容易閱讀。但是,由於代碼的可讀性不僅意味着代碼的作者應該很容易讀取它,而且也可以讀取其他代碼,所以我正在重寫我的AST遍歷類 – FinnTheHuman

+0

也許作爲一個經驗法則:如果手動遍歷是微不足道的, ,甚至可能比訪問者更可取,但只要事情變大,訪問者就是規範的解決方案。由於Java語言很大,很多從小開始的實現在填充初始間隙和漏洞時會變大。 –

相關問題