问题标签 [visitor-pattern]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
336 浏览

c# - Mono.Cecil 中的以下构造在 C# 中指的是什么?

有人能解释一下这些指的是什么吗?

如果您可以举例说明,那将是理想的。

我正在尝试在Mono.Cecil.

0 投票
2 回答
2768 浏览

ruby - Ruby 中的访问者模式,还是只使用块?

嘿,我已经阅读了关于何时/如何使用访问者模式的几篇文章,以及有关它的一些文章/章节,如果您正在遍历 AST 并且它是高度结构化的,并且您想要封装逻辑到一个单独的“访问者”对象等。但是对于 Ruby,这似乎有点矫枉过正,因为你可以使用块来做几乎相同的事情。

我想使用 Nokogiri 打印漂亮的 xml。作者建议我使用访问者模式,这需要我创建一个 FormatVisitor 或类似的东西,所以我可以说“node.accept(FormatVisitor.new)”。

问题是,如果我想开始自定义 FormatVisitor 中的所有内容怎么办(比如它允许您指定节点的标签方式、属性的排序方式、属性的间隔方式等)。

  • 有一次我希望节点为每个嵌套级别有 1 个选项卡,并且属性按任意顺序排列
  • 下一次,我希望节点有 2 个空格,并且属性按字母顺序排列
  • 下一次,我希望它们有 3 个空格,每行有两个属性。

我有几个选择:

  • 在构造函数中创建一个选项哈希 (FormatVisitor.new({:tabs => 2})
  • 在我构建了访问者之后设置值
  • 为每个新实现子类化 FormatVisitor
  • 或者只使用块,而不是访问者

不必构造 FormatVisitor、设置值并将其传递给 node.accept 方法,为什么不这样做:

p>

这与我认为访问者模式的样子形成鲜明对比:

p>

也许我把访问者模式弄错了,但从我在 ruby​​ 中读到的关于它的内容来看,这似乎有点矫枉过正。你怎么看?无论哪种方式,我都很好,只是想知道你们对此有何感受。

非常感谢,兰斯

0 投票
1 回答
1425 浏览

java - Eclipse JDT ASTVisitor - how to tell if a field is read or written in a method?

I am writing a Eclipse ASTVisitor. How to tell if a field is read or written in a method?

The idea provided was "You need to vist Assignment node. Field on the LHS is written, while fields on the RHS expression is read."

After I visit the assignment and get the LHS and RHS which are both of Expression, how do I tell if the Expression contains the field?

0 投票
2 回答
700 浏览

c# - 多态性(不)被 C# 中的访问者模式破坏(以及新而不是覆盖)

我有以下代码:

调用时是否有任何理由 Accept(Visitor v) 选择该方法 new Node().Accept(new VisitorSpecial())

更新:好的,我的错,我意识到我在访问者中使用“新”而不是覆盖。现在我知道为什么“新突破多态性”了。这使我的问题完全愚蠢。谢谢您的帮助。

0 投票
2 回答
108 浏览

.net - 限制严格关闭 VB.NET

嗨,我正在探索在没有所有装饰访问方法的情况下实现类似访问者模式的方法。到目前为止,我发现我可以在 VB.NET 中使用 Option Strict Off,但它有一些副作用。我有一组继承自基类 Shape 的 Shape 类。假设我们有以下接受形状的类:

这在 Option Explicit 关闭时有效。但是,使用其他方法调用 AcceptShape 方法的程序会编译,但会产生运行时异常。我们怎样才能把它变成一个编译时错误?

0 投票
4 回答
278 浏览

java - 处理表行数据结构的最佳模式是什么?

事实

我有以下数据结构,由一个表和一个属性列表(简化)组成:

现在我想用这个数据结构做不同的动作:

  • 以 XML 表示法打印
  • 以文本形式打印
  • 创建 SQL 插入语句
  • 创建 SQL 更新语句
  • 从 SQL 结果集中初始化它

第一次尝试

Attribute我的第一次尝试是将所有这些功能放在Attribute.

选择

感觉访问者模式可以很好地完成这项工作,但另一方面,对于这个简单的结构来说,它看起来有点矫枉过正。

问题

解决这个问题的最优雅的方法是什么?

0 投票
1 回答
344 浏览

c++ - 如何在访问者模式的节点上存储状态?

我有一个架构,它使用访问者模式在树上实现多次传递(恰好是 AST)。在其中一个过程中,我需要将一些数据与节点 ( nodeX) 相关联,然后从节点下方的某个点从对nodeX. 我想以一种不会将访问者/传递的实现推入树节点的方式来执行此操作。

有什么巧妙的方法可以使这项工作吗?

想法:

  • void*在每个节点上(丑陋,不安全)
  • hash_map<Node,Data>(没有我想要的那么干净,谁拥有它?)
0 投票
1 回答
481 浏览

java - Java和C++中双重分派和访问者模式的区别

双重调度和访客模式之间有什么区别吗?

我正在使用 Java 和 C++,想知道两者之间是否存在分歧。

0 投票
2 回答
233 浏览

f# - F# 中表达式的最佳表示

我正在开发一个从 LINQ 表达式(基本上是 LINQ-to-SQL 的修改子集)生成 SQL 的库。我正在使用有区别的联合来建模 SQL 表达式,但遇到了一些(感知的?)限制。我想做类似以下的事情(注意最后一行):

我可以执行以下操作:

...并将最后两行更改为:

但这似乎有两个问题:

  1. SqlOrderByExpression 不是 SqlExpression。这使得很难使用访问者模式(也许这就是问题所在?)。这意味着在遍历 Select 表达式时,我无法通过将每个表达式传递给 Visit(expr:SqlExpression) 的表达式来迭代顺序列表。

  2. SqlOrderByExpression 仅仅是一个元组的类型别名,所以没有类型信息被保留。这会损害 IMO 的可读性。

有没有更好的方法来建模这个?我尝试了继承路线,但我认为 DU 更容易使用(除非有提到的困难)。

0 投票
3 回答
3197 浏览

java - 使用访问者模式的树转换

(免责声明:这些示例是在构建编译器的上下文中给出的,但是这个问题都是关于访问者模式的,不需要任何编译器理论知识。)我正在阅读 Andrew Appel 的 Java 中的现代编译器实现来尝试自学编译器理论(所以不,这不是家庭作业),我无法理解他想如何使用访问者模式将 AST 转换为 IR 树。(注意:我在 Python 中执行此操作,因此我也可以学习 Python,这就是为什么即将出现的示例不在 Java 中的原因。)据我了解,访问者模式中的访问和接受方法在设计上是 void 类型的,所以如果我有类似的东西

那么我希望能够编写一个访问者方法,例如

这会将两个子表达式转换为 IR,然后将它们与表示加号表达式的 BINOP 链接起来。当然,除非我修改所有接受函数以返回额外信息,否则这是不可能的,这也很麻烦,因为有时您只需要一个不返回任何内容的打印访问者。然而,本文坚持访问者是正确的方法,在 Java 中,这意味着它可以在没有 Python 的灵活性的情况下完成。我想不出任何不是令人难以置信的hacky的解决方案 - 任何人都可以告诉我预期的设计吗?