当我的AST只是一个数组数组时,我应该使用访问者吗?

时间:2011-02-25 14:06:27

标签: design-patterns abstract-syntax-tree visitor-pattern

我看过用于走AST的访客模式。要使用此模式,请在AST节点对象上添加accept(visitor)方法。这个方法调用visitor.visit(self),然后“处理”节点以获得所需的结果(例如,一个漂亮的AST版本)。

注意,您通常必须修改节点本身才能添加方法。但是,如果您的AST使用内置对象,该怎么办? Ruby的Ripper库将AST作为数组数组返回。我可以按如下方式添加accept方法:

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

查看documentation for Array,目前没有accept方法,因此不存在冲突。但是,这对我来说并不合适,特别是如果我自己写一个图书馆的话。我不想“污染”其他人可能依赖的内置对象。

但这并不是Ruby独有的,因为我可以在C#中添加一个扩展方法来做类似的事情。

我的问题是:我应该在这种情况下使用访问者模式,还是应该编写一个递归函数来简单地接受我正在处理的数据类型并返回我想要的答案?

1 个答案:

答案 0 :(得分:1)

访问者模式是一种解决经常性问题的已知解决方案(此处的问题可能仅适用于未提供multiple dispatch的编程语言)。

当你似乎知道时,很多时候人们希望将数据结构与人们可能想要做的事情分开。

通常,您有一个类的层次结构(具有不同类型节点的树)。然而,在这种情况下,我没有看到这种情况发生。所以我想知道你为什么要首先使用访问者模式。创建将数组作为输入并处理它的不同类不是更容易吗?