快速帮助重构Ruby类

时间:2010-03-21 00:01:07

标签: ruby-on-rails ruby refactoring

我写过这个返回Feed更新的类,但我认为可以进一步改进。这不是什么微不足道的事情,但作为一个新的红宝石开发者,我认为改进总是好的: - )

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时,它会打印一个包含更新的列表,当它真的应该返回一个对象时。
  2. 举个例子,如果我做了类似的事情,在终端中。

    client = Feedtosis::Client.new('http://stackoverflow.com/feeds')
    result = client.fetch
    
    然后我得到:

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

    这正是我所期待的。但是,当用“inniting”类做同样的事情时:

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

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

    当然我做错了,所以任何帮助重构这门课的人都会非常感激。

    此外,我希望看到有关我的实施的评论,以及任何形式的评论,以使其更好,欢迎。

    提前致谢

3 个答案:

答案 0 :(得分: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:我已经删除了attr_accessor:update和:new_entries。

修改

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

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

updates = feed.updates(false) # get the updates from cache.

答案 1 :(得分:0)

您希望initialize方法返回调用update的结果。 Initialize基本上是Ruby中的构造函数,因此它将返回新的FeedManager对象。

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

答案 2 :(得分:0)

  1. :update@updates

  2. count > 0 ? true : false可以只是count > 0