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 handlers peuvent s’abonner à un event et 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 sur trois fichiers :
event.h: définissez le type de pointeur de fonctionHandlerqui prend unconst char*message. Créez une structureEventcontenant un array de 5 handlers au maximum ainsi qu’un count de handlers enregistrés. Déclarez les fonctions permettant d’initialiser un event, d’abonner un handler et de déclencher l’event afin de notifier tous les abonnés.event.c: implémentez votre système d’event :init_event: prend un pointeur vers Event et définit le count de handlers à 0subscribe: prend un pointeur vers Event et un Handler, ajoute le handler à l’array s’il reste de la place (count inférieur à 5), puis incrémente le countfire: prend un pointeur vers Event et une chaîne message, puis appelle chaque handler enregistré avec ce message dans l’ordre où ils ont été abonnés
main.c: créez trois fonctions handler différentes qui répondent aux events de manière unique :logger: affiche[LOG]suivi du messagealert: affiche[ALERT]suivi du messagecounter: utilise une variable statique pour compter le nombre de ses appels, puis affiche[COUNT] X, où X est le count actuel
Votre programme recevra :
- Le nombre de handlers à 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 démontre le polymorphisme באמצעות des pointeurs de fonction : le même appel fire déclenche des comportements complètement différents selon les handlers auxquels l’abonnement a été effectué. Chaque handler répond à sa manière au même event, ce qui illustre 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 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 cercleImplémentation du rectangleUtilisation polymorpheConteneur de formesEntraînez-vous par vous-même : Compilateur C en ligne