Menu
Coddy logo textTech

Système d'événements

Fait partie de la section Programmation Orientée Objet du Journey C de Coddy. Leçon 61 sur 61.

challenge icon

Défi

Facile

Construisons 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 fonction Handler qui reçoit un message const char*. Créez une structure Event contenant 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 à 0
    • subscribe : 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 compteur
    • fire : 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 message
    • alert : affiche [ALERT] suivi du message
    • counter : 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
    Lisez un entier indiquant le nombre de gestionnaires à abonner (1, 2 ou 3). Abonnez ce nombre de gestionnaires dans l'ordre : d'abord logger, puis alert (si 2 ou plus), puis counter (si 3). Lisez une chaîne de caractères représentant un message, puis déclenchez l'événement avec ce message.

Votre programme recevra :

  1. Le nombre de gestionnaires à abonner (1, 2 ou 3)
  2. Le message à diffuser

Exemple de sortie lorsque les entrées sont 3 et System started :

[LOG] System started
[ALERT] System started
[COUNT] 1

Exemple de sortie lorsque les entrées sont 2 et Warning detected :

[LOG] Warning detected
[ALERT] Warning detected

Exemple de sortie lorsque les entrées sont 1 et Hello :

[LOG] Hello

Cela 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;
}
quiz iconTestez-vous

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

Entraînez-vous par vous-même : Compilateur C en ligne