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 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 fonction Handler qui prend un const char* message. Créez une structure Event contenant 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 à 0
    • subscribe : 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 count
    • fire : 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 message
    • alert : affiche [ALERT] suivi du message
    • counter : utilise une variable statique pour compter le nombre de ses appels, puis affiche [COUNT] X, où X est le count actuel
    Lisez un entier indiquant combien de handlers abonner (1, 2 ou 3). Abonnez ce nombre de handlers dans l’ordre : d’abord logger, puis alert (si 2 ou plus), puis counter (si 3). Lisez une chaîne message, puis déclenchez l’event avec ce message.

Votre programme recevra :

  1. Le nombre de handlers à 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 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;
}
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

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