【问题标题】:Quick help refactoring Ruby Class快速帮助重构 Ruby 类
【发布时间】:2010-03-21 00:01:07
【问题描述】:

我编写了这个返回提要更新的类,但我认为它可以进一步改进。这不是故障或任何问题,但作为一个新的 ruby​​ 开发人员,我认为改进总是好的 :-)

class FeedManager
  attr_accessor :feed_object, :update, :new_entries

  require 'feedtosis'

  def initialize(feed_url)
    @feed_object = Feedtosis::Client.new(feed_url)
    fetch
  end

  def fetch
    @feed_object.fetch
  end

  def update
    @updates = fetch
  end

  def updated?
    @updates.new_entries.count > 0 ? true : false
  end

  def new_entries
    @updates.new_entries
  end
end

如您所见,这很简单,但我看到的不太正确的是:

  1. 每当我通过终端调用 fetch 时,它都会打印一个包含更新的列表,而实际上它应该返回一个对象。

例如,如果我在终端中执行以下操作:

client = Feedtosis::Client.new('http://stackoverflow.com/feeds')
result = client.fetch

然后我得到:

<Curl::Easy http://stackoverflow.com/feeds>

这正是我所期望的。然而,当用“初始化”类做同样的事情时:

FeedManager.new("http://stackoverflow.com/feeds")

我将对象作为一个数组返回,其中包含提要上的所有项目。

当然我做错了什么,所以任何重构这个类的帮助他都会非常感激。

另外,我希望看到 cmets 关于我的实施,以及任何形式的评论以使其更好。

提前致谢

【问题讨论】:

    标签: ruby-on-rails ruby refactoring


    【解决方案1】:

    试试这个:

    class FeedManager
    
      require 'feedtosis'
    
      attr_accessor :feed_object    
    
      def initialize(feed_url)
        self.feed_object = Feedtosis::Client.new(feed_url)
      end    
      def fetch
        feed_object.fetch
      end    
      def updates (reload = true)
        @updates = reload ? fetch : @updates
      end    
      def updated?
        updates(false).new_entries.count > 0
      end    
      def new_entries
        updates(false).new_entries
      end
    end
    

    现在您可以通过以下方式获取更新:

    result = FeedManager.new("http://stackoverflow.com/feeds").updates
    

    PS:我已经删除了 :update 和 :new_entries 的 attr_accessor。

    编辑

    我已添加代码以启用条件缓存重新加载。

    feed = FeedManager.new("http://stackoverflow.com/feeds")
    updates = feed.updates # reloads the updates
    # do something
    
    updates = feed.updates(false) # get the updates from cache.
    

    【讨论】:

    • 不确定我在这里遗漏了什么,但我应该调用:result = FeedManager.new("stackoverflow.com/feeds").updates 每次?另外,我是否这样做:result = FeedManager.new("@ 987654322@) 和 try result.updates,我得到“你有一个 nil 对象,但你没想到它!”
    • 直接调用 Feedtosis::Client.new(feed_url).fetch 时,相同的 URL 是否有效?
    • 在初始化方法中赋值给@feed_object而不是feed_object
    • 嗨,这看起来很棒!只是在很小的事情上:我将更新方法更改为:更新||= fetch,因此它不会缓存变量并获取更新。一切似乎都运行良好,但是在 new_entries 方法上,它正在调用更新方法,该方法不再被缓存,这意味着将对更新进行新的调用,因此会减慢进程。任何方式我都可以在没有缓存的情况下使用更新,但是在 new_entries 上使用更新加载的版本?如果您需要对此进行更多说明,请告诉我。但是加载两次似乎有点矫枉过正
    • @KandadaBoggu 你是明星!它完美地工作,并且完全按照我的意愿去做。非常感谢!
    【解决方案2】:
    1. :update, @updates

    2. count &gt; 0 ? true : false 可以只是count &gt; 0

    【讨论】:

    • 我认为他指的是您attr_accessor ize :update,但您在任何地方都使用@updates 而不是@update
    【解决方案3】:

    您似乎希望初始化方法返回调用更新的结果。 Initialize 基本上是 Ruby 中的构造函数,所以它会返回新的 FeedManager 对象。

    在类定义中间放置 require 语句也是非常“不寻常”的。

    【讨论】:

    • 您似乎没有保留您正在创建的对象。你想达到什么目的?您是否只想要创建 Feedtosis 对象并获取它的更新(然后扔掉对象)的结果,那么您可能应该只为您的脚本定义一个方便的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    相关资源
    最近更新 更多