Menu
Coddy logo textTech

Système d'événements

Fait partie de la section Object Oriented Programming du Journey C de Coddy — leçon 61 sur 61.

challenge icon

Défi

Facile

Construisons 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 fonction Handler qui prend un message const char*. Créez une structure Event qui 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 à 0
    • subscribe — 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 compteur
    • fire — 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 message
    • alert — affiche [ALERT] suivi du message
    • counter — utilise une variable statique pour compter combien de fois elle a été appelée, puis affiche [COUNT] X où X est le compteur actuel
    Lisez un entier indiquant combien de gestionnaires abonner (1, 2 ou 3). Abonnez ce nombre de gestionnaires dans l'ordre : d'abord logger, puis alert (si 2+), puis counter (si 3). Lisez une chaîne de 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

Ceci 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;
}
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 Object Oriented Programming