加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 04:28:41 所属栏目:百科 来源:网络整理
导读:嘿那里,我已经阅读了关于何时/如何使用访问者模式的一些帖子,以及关于它的一些文章/章节,如果您正在遍历AST并且它是高度结构化的,并且您想要封装将逻辑转换为单独的“访问者”对象等.但是对于 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中读到的内容来看,这似乎有些过分.你怎么看?无论哪种方式都适合我,只是想知道你们对它的看法.

非常感谢,
长矛

解决方法

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读