嘿那里,我已经阅读了关于何时/如何使用访问者模式的一些帖子,以及关于它的一些文章/章节,如果您正在遍历AST并且它是高度结构化的,并且您想要封装将逻辑转换为单独的“访问者”对象等.但是对于
Ruby来说,它似乎有点过分,因为你可以使用块来做几乎相同的事情.
我想使用Nokogiri的pretty_print xml.作者建议我使用访问者模式,这需要我创建一个FormatVisitor或类似的东西,所以我只能说“node.accept(FormatVisitor.new)”.
问题是,如果我想开始自定义FormatVisitor中的所有内容(例如,它允许您指定节点的选项卡方式,属性如何排序,属性如何间隔等等).
>有一次,我希望节点每个嵌套级别有一个选项卡,并且属性可以按任何顺序排列
>下一次,我希望节点有2个空格,属性按字母顺序排列
>下一次,我希望它们有3个空格,每行有两个属性.
我有几个选择:
>在构造函数中创建选项哈希(FormatVisitor.new({:tabs => 2})
>在构建访问者之后设置值
>为每个新实现子类化FormatVisitor
>或者只使用块,而不是访客
而不是必须构造一个FormatVisitor,设置值,并将其传递给node.accept方法,为什么不这样做:
node.pretty_print do |format| format.tabs = 2 format.sort_attributes_by {...} end
node.pretty_print do |format| format.tabs = 2 format.sort_attributes_by {...} end
这与我觉得访客模式看起来形成鲜明对比:
visitor = Class.new(FormatVisitor) do attr_accessor :format def pretty_print(node) # do something with the text @format.tabs = 2 # two tabs per nest level @format.sort_attributes_by {...} end end.new doc.children.each do |child| child.accept(visitor) end
visitor = Class.new(FormatVisitor) do attr_accessor :format def pretty_print(node) # do something with the text @format.tabs = 2 # two tabs per nest level @format.sort_attributes_by {...} end end.new doc.children.each do |child| child.accept(visitor) end
也许我的访客模式都错了,但从我在ruby中读到的内容来看,这似乎有些过分.你怎么看?无论哪种方式都适合我,只是想知道你们对它的看法.
非常感谢,
长矛