Publisher/Subscriber Flashcards

1
Q

Dans quel contexte le patron “observateur-observé” devient-il difficile à gérer?

A

Le patron “observateur-observé” devient difficile à gérer lorsque les observateurs varient fréquemment en nombre. Dans ce cas, il devient rapidement complexe pour les sujets de maintenir leurs listes d’observateurs à jour.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Pourquoi la gestion des abonnements observateurs-observés peut-elle devenir problématique dans un jeu de grande envergure?

A

Dans les jeux de grande envergure en continu (sans chargement de scènes ou de niveaux), il n’est pas possible de charger tous les acteurs au début. Par conséquent, gérer les abonnements entre observateurs et sujets peut devenir extrêmement complexe.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Quelle est la principale différence entre le patron “observateur-observé” et le patron “publish-subscribe”?

A

Dans le patron “publish-subscribe”, un observateur (subscriber) ne s’abonne plus directement à un sujet, mais plutôt à un événement. Les sujets notifient un publisher qu’un événement s’est produit, et ce publisher relaie l’information à tous les subscribers abonnés à cet événement.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Dans le patron “publish-subscribe”, à quoi s’abonne un subscriber?

A

Un subscriber s’abonne à un événement spécifique, et non à un sujet comme dans le patron “observateur-observé”.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Donnez un exemple concret illustrant le fonctionnement du patron “publish-subscribe”.

A

Dans le domaine de la musique, les fans (subscribers) peuvent s’abonner aux nouvelles de leurs groupes préférés. Lorsqu’une nouvelle est publiée (par le groupe ou un festival), le publisher envoie cette information à tous les fans abonnés aux nouvelles de ce groupe.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Comment définit-on généralement les événements dans une implémentation du patron “publish-subscribe”?

A

Les événements sont généralement définis à l’aide d’une énumération (enum), par exemple:

enum class Event {
VALUE_CHANGED,
BOMB_EXPLODED,
OTHER_EVENT,
// etc
};

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Quelles sont les principales méthodes de la classe Publisher?

A

Les principales méthodes de la classe Publisher sont:

  • addSubscriber(Subscriber& o, Event event):
    pour ajouter un subscriber à un événement
  • removeSubscriber(Subscriber& o, Event event):
    pour retirer un subscriber d’un événement
  • notifySubscribers(Event event, const void* data):
    pour notifier tous les subscribers d’un événement spécifique
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Quelle structure de données est appropriée pour stocker les subscribers dans la classe Publisher et pourquoi?

A

Un std::multimap<Event, std::reference_wrapper<Subscriber>> est approprié car il permet de regrouper plusieurs "valeurs" (les subscribers) pour une seule "clé" (un Event). Cela facilite la recherche des subscribers par événement.</Subscriber>

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Pourquoi le Publisher stocke-t-il des références aux subscribers plutôt que des pointeurs?

A

Il serait incohérent de permettre l’ajout de pointeurs directement alloués avec new, car les subscribers sont des acteurs qui ont d’autres rôles dans le jeu, ils ne font pas seulement observer. Ils existent indépendamment du système de notification.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Quel type de paramètre est utilisé dans la méthode notifySubscribers pour transmettre des données avec l’événement?

A

La méthode utilise un paramètre de type const void*, ce qui permet de passer n’importe quel type d’information (chaînes de caractères, nombres, objets, etc.).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Comment un acteur peut-il notifier les subscribers qu’un événement s’est produit?

A

Un acteur peut notifier les subscribers en appelant la méthode notifySubscribers du publisher, en spécifiant l’événement et en fournissant éventuellement des données supplémentaires:

publisher.notifySubscribers(Event::VALUE_CHANGED, “any data here”);

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Donnez deux exemples de données qui peuvent être passées lors de la notification d’un événement.

A

Une chaîne de caractères: publisher.notifySubscribers(Event::VALUE_CHANGED, “any data here”);
Un nombre: publisher.notifySubscribers(Event::OTHER_EVENT, (void*)123);

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Comment un subscriber peut-il interpréter correctement les données reçues lors d’une notification?

A

Comme seuls les subscribers abonnés à un événement spécifique reçoivent la notification, ils peuvent facilement transtyper le paramètre dans le bon type sans avoir à tester préalablement le sujet:

void ConcreteSubscriber::notify(Event event, const void* data) {
switch (event) {
case Event::VALUE_CHANGED:
std::cout &laquo_space;“Valeur de la chaine: “ &laquo_space;(char*)data &laquo_space;std::endl;
break;
// …
}
}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Quel est l’avantage principal du patron “publish-subscribe” par rapport au patron “observateur-observé”?

A

L’avantage principal est le découplage entre les émetteurs d’événements et les récepteurs. Les subscribers ne connaissent pas les sources des événements, et les émetteurs ne savent pas qui recevra leurs notifications, ce qui simplifie grandement la gestion des abonnements dans des systèmes dynamiques.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Comment un acteur peut-il se passer lui-même comme donnée lors de la notification d’un événement?

A

Un acteur peut se passer lui-même en utilisant le pointeur this:
publisher.notifySubscribers(Event::ACTOR_CHANGED, this);

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Pourquoi est-il important que les subscribers connaissent à l’avance le type de données associé à chaque événement?

A

Comme les données sont transmises sous forme de void*, les subscribers doivent connaître le type correct pour effectuer la conversion appropriée. Sans cette connaissance, ils risqueraient d’interpréter incorrectement les données, ce qui pourrait causer des comportements inattendus ou des plantages.

17
Q

En quoi le patron “publish-subscribe” facilite-t-il la gestion des événements dans un jeu où les acteurs sont créés et détruits dynamiquement?

A

Comme les abonnements se font aux événements et non aux acteurs, peu importe si un acteur est créé ou détruit, seuls les subscribers intéressés par un événement spécifique sont notifiés. Cela élimine la nécessité de maintenir des listes d’observateurs pour chaque sujet et simplifie grandement la gestion des abonnements.

18
Q

Comment implémenter la méthode removeSubscriber dans la classe Publisher?

A

void Publisher::removeSubscriber(Subscriber& o, Event event) {
auto range = subscribers.equal_range(event);
for (auto it = range.first; it != range.second; ) {
if (&(it->second.get()) == &o) {
it = subscribers.erase(it);
} else {
++it;
}
}
}

19
Q

Quelle serait une signature typique pour la méthode notify de la classe Subscriber?

A

virtual void notify(Event event, const void* data) = 0;

Cette méthode est généralement déclarée virtuelle pure dans une classe de base Subscriber, permettant aux classes dérivées d’implémenter leur propre logique de traitement des événements.

20
Q

Quel est l’intérêt d’utiliser un multimap plutôt qu’une simple map pour stocker les subscribers?

A

Un multimap permet d’associer plusieurs valeurs (subscribers) à une même clé (événement), ce qui est essentiel puisque plusieurs subscribers peuvent être intéressés par le même événement. Une map simple ne permettrait d’associer qu’un seul subscriber à chaque événement.