105 votes

Pourquoi utiliser le modèle Publish/Subscribe (en JS/jQuery) ?

Un collègue m'a fait découvrir le modèle de publication et d'abonnement (en JS/jQuery), mais j'ai du mal à me faire à l'idée de pourquoi on utiliserait ce modèle plutôt que le JavaScript/jQuery "normal".

Par exemple, auparavant, j'avais le code suivant...

$container.on('click', '.remove_order', function(event) {
    event.preventDefault();
    var orders = $(this).parents('form:first').find('div.order');
    if (orders.length > 2) {
        orders.last().remove();
    }
});

Et je pourrais voir le mérite de faire ça à la place, par exemple...

removeOrder = function(orders) {
    if (orders.length > 2) {
        orders.last().remove();
    }
}

$container.on('click', '.remove_order', function(event) {
    event.preventDefault();
    removeOrder($(this).parents('form:first').find('div.order'));
});

Parce qu'il introduit la possibilité de réutiliser le removeOrder fonctionnalité pour différents événements, etc.

Mais pourquoi décider de mettre en œuvre le modèle de publication/abonnement et se donner la peine de le faire, si cela revient au même ? (Pour info, j'ai utilisé jQuery tiny pub/sub )

removeOrder = function(e, orders) {
    if (orders.length > 2) {
        orders.last().remove();
    }
}

$.subscribe('iquery/action/remove-order', removeOrder);

$container.on('click', '.remove_order', function(event) {
    event.preventDefault();
    $.publish('iquery/action/remove-order', $(this).parents('form:first').find('div.order'));
});

J'ai lu des articles sur ce modèle, mais je n'arrive pas à imaginer pourquoi cela serait nécessaire. Les tutoriels que j'ai vus qui expliquent comment pour mettre en œuvre ce modèle ne couvrent que des exemples aussi basiques que les miens.

J'imagine que l'utilité du pub/sub se révélerait dans une application plus complexe, mais je ne peux pas en imaginer une. Je crains de passer complètement à côté de l'essentiel, mais j'aimerais bien le savoir s'il y en a un !

Pouvez-vous expliquer succinctement pourquoi et dans quelles situations ce modèle est avantageux ? Est-il utile d'utiliser le modèle pub/sub pour les extraits de code comme mes exemples ci-dessus ?

1voto

Peheje Points 2969

Le document "Les nombreux visages de la publication/abonnement" est une bonne lecture et l'une des choses qu'ils soulignent est le découplage en trois "dimensions". Voici mon résumé brut, mais veuillez également vous référer à l'article.

  1. Découplage spatial. Les parties qui interagissent n'ont pas besoin de se connaître. L'éditeur ne sait pas qui écoute, combien écoutent, ni ce qu'ils font de l'événement. Les abonnés ne savent pas qui produit ces événements, combien de producteurs il y a, etc.
  2. Découplage temporel. Les parties qui interagissent ne doivent pas nécessairement être actives au même moment pendant l'interaction. Par exemple, un abonné peut être déconnecté pendant qu'un éditeur publie des événements, mais il peut y réagir lorsqu'il se connecte.
  3. Découplage de la synchronisation. Les éditeurs ne sont pas bloqués lorsqu'ils produisent des événements et les abonnés peuvent être notifiés de manière asynchrone par des rappels lorsqu'un événement auquel ils ont souscrit arrive.

0voto

Simon Miller Points 146

Réponse simple La question initiale cherchait une réponse simple. Voici ma tentative.

Javascript ne fournit pas de mécanisme permettant aux objets de code de créer leurs propres événements. Vous avez donc besoin d'une sorte de mécanisme d'événement. Le pattern Publish / subscribe répondra à ce besoin, et c'est à vous de choisir le mécanisme qui convient le mieux à vos propres besoins.

Maintenant nous pouvons voir un besoin pour le modèle pub/sub, alors préféreriez-vous avoir à gérer les événements DOM différemment de la façon dont vous gérez vos événements pub/sub ? Dans un souci de réduction de la complexité, et pour d'autres concepts tels que la séparation des préoccupations (SoC), vous pourriez voir l'avantage de tout uniformiser.

Paradoxalement, un plus grand nombre de codes crée une meilleure séparation des préoccupations, ce qui permet d'atteindre des pages web très complexes.

J'espère que quelqu'un trouvera cette discussion suffisamment bonne sans entrer dans les détails.

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