4 votes

Aide rapide à la refactorisation d'une classe Ruby

J'ai écrit cette classe qui renvoie les mises à jour des flux, mais je pense qu'elle peut être améliorée. Il n'y a pas de problème, mais en tant que nouveau développeur ruby, je pense qu'il est toujours bon de s'améliorer :-)

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

Comme vous pouvez le voir, c'est assez simple, mais les choses que je vois qui ne sont pas tout à fait correctes sont les suivantes :

  1. Lorsque j'appelle fetch via le terminal, il affiche une liste avec les mises à jour, alors qu'il est censé renvoyer un objet.

Par exemple, dans le terminal, si je fais quelque chose comme :

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

Je reçois ensuite :

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

C'est exactement ce à quoi je m'attendais. Cependant, en faisant la même chose avec la classe "inniting" avec :

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

Je reçois l'objet sous la forme d'un tableau contenant tous les éléments du flux.

Je suis sûr que je fais quelque chose de mal, donc toute aide pour refondre cette classe sera grandement appréciée.

J'aimerais également recevoir des commentaires sur ma mise en œuvre, ainsi que tout commentaire visant à l'améliorer.

Merci d'avance

1voto

Harish Shetty Points 38877

Essayez ceci :

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

Vous pouvez désormais obtenir les mises à jour comme suit :

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

PS : j'ai supprimé l'accesseur attr_ pour :update, et :new_entries.

Editar

J'ai ajouté du code pour activer le rechargement conditionnel du cache.

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

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

0voto

Mike Cargal Points 762

Il semble que vous attendiez de la méthode initialize qu'elle renvoie le résultat de l'appel à update. Initialize est en fait un constructeur en Ruby, il retournera donc le nouvel objet FeedManager.

Il est également très "inhabituel" de placer une déclaration d'exigence au milieu d'une définition de classe.

0voto

wilhelmtell Points 25504
  1. :update , @updates

  2. count > 0 ? true : false peut être juste count > 0

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X