2010-03-21 56 views
4

我写过这个类,它返回Feed更新,但我认为它可以进一步改进。这不是出问题或任何东西,但作为一个新的Ruby开发者,我认为这是一件好事,提高:-)快速帮助重构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> 

这也正是我所期待的。但是,这样做与“inniting”级同样的事情时有:

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

我得到恢复与对饲料的所有项目的数组对象。

当然,我做错了什么,所以任何帮助重构这个类他将不胜感激。

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

在此先感谢

回答

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 for: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. 
+0

不确定我;我在这里错过了一些东西,但我应该打电话:result = FeedManager.new(“http://stackoverflow.com/feeds”).updates每次? 此外,我是这样做的: 结果= FeedManager.new(“http://stackoverflow.com/feeds”)和尝试 result.updates,我得到“你有没有对象,当你不期望它!” – 2010-03-21 01:11:34

+0

直接调用Feedtosis :: Client.new(feed_url).fetch时,相同的URL是否有效? – 2010-03-21 02:21:20

+0

在初始化方法 – 2010-03-21 02:58:22

0

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

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

+0

这应该在哪里呢? – 2010-03-21 00:28:31

+0

您似乎不会保留您正在创建的对象。你想达到什么目的?你只是想创建一个Feedtosis对象并获得它的更新(然后扔掉对象)的结果,如果你应该为脚本定义一个方便的方法。 – 2010-03-21 02:59:22

+0

我已经修复了'initialize'方法中的代码。再试一次。 – 2010-03-21 03:52:17

0
  1. :update@updates

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

+0

不确定你的意思是: :update,@updates – 2010-03-21 00:16:35

+0

我认为他指的是'attr_accessor'ize':update',但是你到处使用'@ updates'而不是'@ update'。 – theIV 2010-03-21 00:43:30