Ruby中的访客模式,还是只使用一个块?

前端之家收集整理的这篇文章主要介绍了Ruby中的访客模式,还是只使用一个块?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
嘿那里,我已经阅读了关于何时/如何使用访问者模式的一些帖子,以及关于它的一些文章/章节,如果您正在遍历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 {...} endnode.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) endvisitor = 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中读到的内容来看,这似乎有些过分.你怎么看?无论哪种方式都适合我,只是想知道你们对它的看法.

非常感谢,
长矛

解决方法

我会选择简单而有效的方法.我不知道细节,但你写的与访客模式相比,看起来更简单.如果它也适合你,我会用它.就个人而言,我厌倦了所有这些技术,要求你创建一个巨大的相互关联的“网络”,只是为了解决一个小问题.

有人会说,是的,但是如果你使用模式来做,那么你可以涵盖许多未来的需求,等等等等.我说,现在做什么有效,如果有需要,你可以在将来进行重构.在我的项目中,几乎从未出现过,但这是一个不同的故事.

猜你在找的Ruby相关文章