状态和访问者模式
State and Visitor Pattern
在我正在构建的应用程序中,我尝试使用访问者模式收集大量状态,稍后将对其进行操作。这是使用 ANTLR 4 收集状态的典型方法还是反模式?如果不是,请提供一个如何处理状态的示例?
此外,您应该在遍历时更新您的域对象,还是在访问者外部遍历后实施所有业务逻辑?
我看到的所有 ANTLR 4 示例都太小了,我真的在寻找如何在现实世界中使用它。
谢谢。
public class JavaClassVisitor extends JavaBaseVisitor < String > {
private JavaClassVisitorState jcvs = new JavaClassVisitorState();
@Override
public List < String > visitParseContext(ParseContext ctx) {
visitChildren(ctx);
return jvcs.getAccessSpecifiers().toString();
}
@Override
public List < String > visitClassDeclaration(ClassDeclarationContext ctx) {
IdentifierContext idCtx = ctx.Identifier();
if (idCtx != null) {
String accessSpecifier = idCtx.getText();
List < String > accessSpecifiers = jcvs.getAccessSpecifiers();
accessSpecifiers.add(accessSpecifier);
}
return visitChildren(ctx);
}
@Override
public List < String > visitMethodDeclaration(MethodDeclarationContext ctx) {
IdentifierContext idCtx = ctx.Identifier();
if (idCtx != null) {
String accessSpecifier = idCtx.getText();
List < String > accessSpecifiers = jcvs.getAccessSpecifiers();
accessSpecifiers.add(accessSpecifier);
}
return visitChildren(ctx);
}
}
为了保持Whosebug典型的Q&A风格,我回答一个问题,这是IMO的核心。
我不知道 ANTLR4 的“典型”访问者模式。这完全取决于上下文和您要完成的任务。如果您需要更新域对象并决定在访问者中执行此操作,那就这样吧。
访问者模式并不局限于收集数据。更新也是一个有效的动作。 ANTLR4 中的访问者和听众的工作方式非常相似,都是深度优先遍历解析树。两种调用方法都特定于它们在树中看到的每个解析上下文。主要区别在于,侦听器执行一般行走,而访问者可以 return 自定义值(对于评估器之类的东西很有用,即使您也可以将中间值保留在访问者的成员变量中)。
在我正在构建的应用程序中,我尝试使用访问者模式收集大量状态,稍后将对其进行操作。这是使用 ANTLR 4 收集状态的典型方法还是反模式?如果不是,请提供一个如何处理状态的示例?
此外,您应该在遍历时更新您的域对象,还是在访问者外部遍历后实施所有业务逻辑?
我看到的所有 ANTLR 4 示例都太小了,我真的在寻找如何在现实世界中使用它。
谢谢。
public class JavaClassVisitor extends JavaBaseVisitor < String > {
private JavaClassVisitorState jcvs = new JavaClassVisitorState();
@Override
public List < String > visitParseContext(ParseContext ctx) {
visitChildren(ctx);
return jvcs.getAccessSpecifiers().toString();
}
@Override
public List < String > visitClassDeclaration(ClassDeclarationContext ctx) {
IdentifierContext idCtx = ctx.Identifier();
if (idCtx != null) {
String accessSpecifier = idCtx.getText();
List < String > accessSpecifiers = jcvs.getAccessSpecifiers();
accessSpecifiers.add(accessSpecifier);
}
return visitChildren(ctx);
}
@Override
public List < String > visitMethodDeclaration(MethodDeclarationContext ctx) {
IdentifierContext idCtx = ctx.Identifier();
if (idCtx != null) {
String accessSpecifier = idCtx.getText();
List < String > accessSpecifiers = jcvs.getAccessSpecifiers();
accessSpecifiers.add(accessSpecifier);
}
return visitChildren(ctx);
}
}
为了保持Whosebug典型的Q&A风格,我回答一个问题,这是IMO的核心。
我不知道 ANTLR4 的“典型”访问者模式。这完全取决于上下文和您要完成的任务。如果您需要更新域对象并决定在访问者中执行此操作,那就这样吧。
访问者模式并不局限于收集数据。更新也是一个有效的动作。 ANTLR4 中的访问者和听众的工作方式非常相似,都是深度优先遍历解析树。两种调用方法都特定于它们在树中看到的每个解析上下文。主要区别在于,侦听器执行一般行走,而访问者可以 return 自定义值(对于评估器之类的东西很有用,即使您也可以将中间值保留在访问者的成员变量中)。