2010-01-27 4 views
1

J'essaie de comprendre quand il est approprié d'utiliser des événements. Il me semble qu'un événement peut être considéré comme un déclencheur SQL. Ensuite, est-il correct d'utiliser un événement déclenché par un objet de domaine pour en modifier un autre, ou cela impliquera-t-il un manque de conception bien pensée si nous utilisons des événements pour modifier les états d'autres objets? Ou devrait-il y avoir une classe de médiateurs à travers laquelle ces objets devraient se modifier mutuellement? Comment puis-je décider?Utilisation d'événements pour modifier des objets de domaine

Y a-t-il des compromis dont je devrais me préoccuper ici, comme comment l'utilisation des événements affectera la testabilité?

+0

Eh bien, j'apprends seulement sur ce site ... et oui, votre réponse a été utile, donc je vais l'upvote. Merci. –

+0

Oui, j'ai vu ça sur ton profil. Nous avons tous besoin d'apprendre des choses de temps en temps :-) – KLE

Répondre

2

Les événements sont conçus pour découpler une zone d'une autre.

Cela implique parfois comportement asynchrone, qui peut être une fonctionnalité supplémentaire, mais n'est pas obligatoire. Par exemple, si vous souhaitez fournir une rétroaction rapide à l'utilisateur dans une interface graphique, et qu'une partie de votre code s'exécute trop lentement (sauf si elle doit être terminée avant de fournir des commentaires), l'appel normal peut exécuter des codes rapides et créer un événement pour les autres, puis fournir des commentaires de l'interface graphique sans attendre que l'événement soit réellement traité. Cet événement est stocké dans une file d'attente et un ou plusieurs threads traitent cette file d'attente à leur propre rythme.

Pour les événements synchrones, il est vraiment utile pour la communication inter-module, où les deux modules ne sont pas dépendants l'un de l'autre au moment de la compilation. Les deux peuvent connaître une classe d'événements, et un « routeur d'événement »:

  • un module crée un événement et appelez le routeur,
  • le routeur sait (de la configuration précédente) quel autre module devrait recevoir, et l'envoyer au module de réception.

Ni le module connaissent l'autre, donc le concept de découplage. Très bien si les deux doivent être maintenus séparément :-)


De nombreuses variantes existent, pour certains sujets tels que:

  • diffusion vers plusieurs récepteurs
  • fail-over (si le récepteur est temporairement arrêté, il recommence, l'événement sera délivré lorsque le récepteur sera en marche et enregistré à nouveau)
  • audit: un module technique peut recevoir des événements ciblés à d'autres modules, et les connecter
  • ...

Modification des objets de domaine via des événements semble un peu étrange. Le découplage mentionné plus haut est-il vraiment justifié? Cependant, je ne donnerais pas d'avis définitif avant de comprendre plus précisément ce que vous avez en tête.

+0

Après avoir lu votre message, je pense que l'utilisation des événements n'est pas justifiée dans mon cas. Je ne suis pas sûr de comprendre la partie où vous parlez de «communication inter-module», mais c'est peut-être une autre question. –

+0

@Abhijeet OK pour les événements. J'ai essayé d'améliorer un peu la partie que vous avez mentionnée, mais je suis d'accord avec vous: une discussion complète sur le découplage dans une question par elle-même (et qui existe probablement déjà sur StackOverflow! ;-)). – KLE

Questions connexes