29 votes

Observateurs vs rappels

j'ai pensé à utiliser des observateurs ou des rappels. Quoi et quand utiliser un observateur?

Fe vous pourriez faire ce qui suit:

 # User-model
class User << AR
  after_create :send_greeting!

  def send_greeting!
    UserNotifier.deliver_greeting_message(self)
  end

end

#observer
class UserNotifier << AR
  def greeting_message(user)
  ...
  end
end
 

ou vous pouvez créer un observateur et le laisser regarder quand les utilisateurs sont créés ...

Qu'avez-vous recommandé?

39voto

Michael Johnston Points 2195

Une distinction vraiment importante à garder à l'esprit, qui est liée à la réponse de Milan Novota, est que les rappels sur un ActiveRecord ont la possibilité d'annuler l'action appelée et tous les rappels ultérieurs, contrairement aux observateurs.

 class Model < ActiveRecord::Base
  before_update :disallow_bob

  def disallow_bob
  return false if model.name == "bob"
  end
end

class ModelObserver < ActiveRecord::Observer
  def before_update(model)
    return false if model.name == "mary"
  end
end

m = Model.create(:name => "whatever")

m.update_attributes(:name => "bob")
=> false -- name will still be "whatever" in database

m.update_attributes(:name => "mary")
=> true -- name will be "mary" in database
 

Les observateurs peuvent seulement observer, ils ne peuvent pas intervenir.

27voto

Milan Novota Points 10892

Vous pouvez utiliser les observateurs comme un moyen de découplage ou de la distribution de la responsabilité. Dans le sens de base - si votre modèle de code est trop salissant commencer à penser à l'aide d'observateurs pour certains inutiles comportement. Le pouvoir réel (à moins que je le vois) des observateurs réside dans leur capacité à servir de point de connexion entre vos modèles et quelques autres sous-système dont la fonctionnalité est utilisée par tous les (ou certains) d'autres classes. Disons que vous décidez d'ajouter une notification de messagerie instantanée à votre application - dire que vous voulez être informé à propos de certains (ou tous) de la CRUD actions de certains (ou tous) les modèles dans votre système. Dans ce cas, à l'aide d'observateurs de l'idéal - votre notification sous-système à rester parfaitement séparé de votre logique métier et vos modèles de ne pas être encombré avec un comportement qui n'est pas de leurs affaires. Un autre bon cas d'utilisation pour les observateurs, serait un sous-système d'audit.

8voto

Aaron Digulla Points 143830

Un rappel est de plus courte durée: Vous le passer à une fonction qui doit être appelée une fois. Il fait partie de l'API que vous ne pouvez généralement pas appel de la fonction sans aussi le passage d'un rappel. Ce concept est étroitement associée à ce que la fonction n'. Habituellement, vous ne pouvez passer un rappel unique..

Exemple: Exécution d'un thread et de donner une fonction de callback qui est appelée lorsque le thread se termine.

Un observateur de vie plus longue et il peut être attaché/détaché à tout moment. Il peut y avoir beaucoup d'observateurs pour la même chose et ils peuvent avoir des durées différentes.

Exemple: affichage des valeurs à partir d'un modèle d'INTERFACE utilisateur et la mise à jour du modèle de la saisie de l'utilisateur.

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