Быстрая справка по рефакторингу Ruby Class - PullRequest
4 голосов
/ 21 марта 2010

Я написал этот класс, который возвращает обновления каналов, но думаю, что его можно еще улучшить. Это не глючит или что-то в этом роде, но, как новый разработчик 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")

Я получаю объект, возвращаемый в виде массива со всеми элементами в ленте.

Конечно, я делаю что-то не так, поэтому любая помощь в рефакторинге этого класса будет ему очень признательна.

Кроме того, я хотел бы видеть комментарии о моей реализации, а также комментарии любого рода, чтобы сделать ее лучше.

Заранее спасибо

Ответы [ 3 ]

1 голос
/ 21 марта 2010

Попробуйте это:

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.
0 голосов
/ 21 марта 2010
  1. :update, @updates

  2. count > 0 ? true : false может быть просто count > 0

0 голосов
/ 21 марта 2010

Похоже, вы ожидаете, что метод initialize вернет результат вызова update. Initialize - это, по сути, конструктор в Ruby, поэтому он будет возвращать новый объект FeedManager.

Также очень «необычно» помещать оператор require в середине определения класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...