AST:访问和只使用查询方法有什么区别?
AST: what's the difference between visiting and just using query methods?
例如,我从 ASTParser 获得了一个 CompilationUnit。为什么我需要接受访问者而不是使用正常方法:
ASTParser parser ... //all that stuff
CompilationUnit unit = (CompilationUnit) parser.createAST(null);
然后我做:
unit.types() //get all type declarations
从这里开始,我只是继续向下访问 AST,直到叶节点就这样,而不使用访问。使用访问者模式比我建议的有什么优势?
访问者(ASTVisitor
的子类型)的目的是遍历整个 AST,因此您可以毫不费力地检查每个 AST 节点(除非访问方法 returns false,此时点当前节点下面的子树被跳过)。
直接查询AST时,你负责遍历到所有感兴趣的节点。
当使用 unit.types()
时,您只能获得顶级类型声明,但使用访问者可以轻松处理编译单元中的所有类型,包括嵌套类型。
如果正确实施,两种方法应该表现出相同的行为。因此区别在于需要编写的代码量和代码的清晰度(训练有素的眼睛会立即理解访问者的用法,但需要仔细阅读手动遍历)。
例如,我从 ASTParser 获得了一个 CompilationUnit。为什么我需要接受访问者而不是使用正常方法:
ASTParser parser ... //all that stuff
CompilationUnit unit = (CompilationUnit) parser.createAST(null);
然后我做:
unit.types() //get all type declarations
从这里开始,我只是继续向下访问 AST,直到叶节点就这样,而不使用访问。使用访问者模式比我建议的有什么优势?
访问者(ASTVisitor
的子类型)的目的是遍历整个 AST,因此您可以毫不费力地检查每个 AST 节点(除非访问方法 returns false,此时点当前节点下面的子树被跳过)。
直接查询AST时,你负责遍历到所有感兴趣的节点。
当使用 unit.types()
时,您只能获得顶级类型声明,但使用访问者可以轻松处理编译单元中的所有类型,包括嵌套类型。
如果正确实施,两种方法应该表现出相同的行为。因此区别在于需要编写的代码量和代码的清晰度(训练有素的眼睛会立即理解访问者的用法,但需要仔细阅读手动遍历)。