Système d'événements
Fait partie de la section Object Oriented Programming du Journey C de Coddy — leçon 61 sur 61.
Défi
FacileConstruisons un Système de Notification — une architecture pilotée par les événements où plusieurs gestionnaires peuvent s'abonner à un événement et réagir lorsqu'il se déclenche. Ce modèle est la colonne vertébrale de la programmation réactive et des frameworks GUI.
Vous organiserez votre code sur trois fichiers :
event.h: Définissez le type de pointeur de fonctionHandlerqui prend un messageconst char*. Créez une structureEventqui contient un tableau allant jusqu'à 5 gestionnaires et un compteur de gestionnaires enregistrés. Déclarez les fonctions pour initialiser un événement, abonner un gestionnaire et déclencher l'événement pour notifier tous les abonnés.event.c: Implémentez votre système d'événements :init_event— prend un pointeur Event et initialise le compteur de gestionnaires à 0subscribe— prend un pointeur Event et un Handler, ajoute le gestionnaire au tableau s'il y a de la place (compteur inférieur à 5), et incrémente le compteurfire— prend un pointeur Event et une chaîne de message, puis appelle chaque gestionnaire enregistré avec ce message dans l'ordre où ils ont été abonnés
main.c: Créez trois fonctions de gestionnaire différentes qui répondent aux événements de manières uniques :logger— affiche[LOG]suivi du messagealert— affiche[ALERT]suivi du messagecounter— utilise une variable statique pour compter combien de fois elle a été appelée, puis affiche[COUNT] Xoù X est le 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] HelloCeci démontre le polymorphisme à travers les 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, illustrant la nature découplée de la conception pilotée par les événements.
Essayez vous-même
#include <stdio.h>
#include <string.h>
#include "event.h"
// TODO: Implementer le gestionnaire logger
// Affiche "[LOG] " suivi du message
void logger(const char* message) {
// TODO: Implementer
}
// TODO: Implementer le gestionnaire alert
// Affiche "[ALERT] " suivi du message
void alert(const char* message) {
// TODO: Implementer
}
// TODO: Implementer 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: Implementer 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 Object Oriented Programming
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 cercle