Système d'événements
Fait partie de la section Programmation Orientée Objet du Journey C de Coddy. Leçon 61 sur 61.
Défi
FacileConstruisons un système de notifications : une architecture pilotée par les événements dans laquelle plusieurs gestionnaires peuvent s'abonner à un événement et y répondre lorsqu'il se déclenche. Ce modèle constitue la base de la programmation réactive et des frameworks d'interface graphique.
Vous organiserez votre code dans trois fichiers :
event.h: définissez le type de pointeur de fonctionHandlerqui reçoit un messageconst char*. Créez une structureEventcontenant un tableau de 5 gestionnaires au maximum ainsi qu'un compteur de gestionnaires enregistrés. Déclarez les fonctions permettant d'initialiser un événement, d'abonner un gestionnaire et de déclencher l'événement afin de notifier tous les abonnés.event.c: implémentez votre système d'événements :init_event: reçoit un pointeur vers un Event et définit le compteur de gestionnaires à 0subscribe: reçoit un pointeur vers un Event et un Handler, ajoute le gestionnaire au tableau s'il reste de la place (compteur inférieur à 5), puis incrémente le compteurfire: reçoit un pointeur vers un Event et une chaîne de caractères représentant un message, puis appelle chaque gestionnaire enregistré avec ce message, dans l'ordre dans lequel ils ont été abonnés
main.c: créez trois fonctions de gestionnaire différentes qui répondent aux événements de manière unique :logger: affiche[LOG]suivi du messagealert: affiche[ALERT]suivi du messagecounter: utilise une variable statique pour compter le nombre de fois où elle a été appelée, puis affiche[COUNT] X, où X correspond au compteur actuel
Votre programme recevra :
- Le nombre de gestionnaires à abonner (1, 2 ou 3)
- Le message à diffuser
Exemple de sortie lorsque les entrées sont 3 et System started :
[LOG] System started
[ALERT] System started
[COUNT] 1Exemple de sortie lorsque les entrées sont 2 et Warning detected :
[LOG] Warning detected
[ALERT] Warning detectedExemple de sortie lorsque les entrées sont 1 et Hello :
[LOG] HelloCela illustre le polymorphisme au moyen de pointeurs de fonction : le même appel fire déclenche des comportements complètement différents selon les gestionnaires abonnés. Chaque gestionnaire répond à sa manière au même événement, mettant en évidence la nature découplée d'une conception pilotée par les événements.
Essayez vous-même
#include <stdio.h>
#include <string.h>
#include "event.h"
// TODO: Implémenter le gestionnaire logger
// Affiche "[LOG] " suivi du message
void logger(const char* message) {
// TODO: Implémenter
}
// TODO: Implémenter le gestionnaire alert
// Affiche "[ALERT] " suivi du message
void alert(const char* message) {
// TODO: Implémenter
}
// TODO: Implémenter le gestionnaire counter
// Utilise une variable static pour compter les appels
// Affiche "[COUNT] X" où X est le compte actuel
void counter(const char* message) {
// TODO: Implémenter avec une variable static
}
int main() {
// Lire le nombre de gestionnaires à abonner
int num_handlers;
scanf("%d", &num_handlers);
getchar(); // consommer le saut de ligne
// Lire le message
char message[256];
fgets(message, sizeof(message), stdin);
message[strcspn(message, "\n")] = '\0'; // supprimer le saut de ligne
// TODO: Créer et initialiser un Event
// TODO: Abonner les gestionnaires en fonction de num_handlers
// 1 gestionnaire : logger
// 2 gestionnaires : logger, alert
// 3 gestionnaires : logger, alert, counter
// TODO: Déclencher l'événement avec le message
return 0;
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation Orientée Objet
1Bases de la programmation modulaire
Fichiers d'en-têteGardes d'inclusionFichiers sourcesFonctions statiquesRécapitulatif : Calculatrice modulaire4Encapsulation
Concept des pointeurs opaquesDéfinir des structures opaquesGetters et settersValidation dans les settersRécapitulatif : La boîte secrète2Objets et méthodes
Structs comme objetsLe pointeur 'Self'Rigueur du mot-clé constPointeur vs ValeurMéthodes utilitairesRécapitulatif : Point Manager5Projet : Compte bancaire simple
Configuration du projetImplémentation du compte8Polymorphisme
Pointeurs de fonctions dans les structuresSimulation de méthodesLe concept d'interfaceImplémentation d'interfacesItération polymorphiqueRécapitulatif : Greeter11Patrons de conception en C
Patron SingletonPatron FabriquePatron ItérateurRécapitulatif : Logger Factory3Cycle de vie des objets
Pattern de constructeurPattern de destructeurInitialisation sur la pileCopie profondeRécapitulatif : String Wrapper6Héritage par composition
Imbrication de structLa règle du premier membreAccès aux membres parentsUpcastingRécapitulatif : Hiérarchie des formes9Projet : Dessinateur de formes
Aperçu du projetImplémentation du cercleImplémentation du rectangleUtilisation polymorpheConteneur de formesEntraînez-vous par vous-même : Compilateur C en ligne