Sistema di eventi
Fa parte della sezione Programmazione orientata agli oggetti del percorso C di Coddy. Lezione 61 di 61.
Sfida
FacileCostruiamo un sistema di notifiche: un’architettura basata sugli eventi in cui più gestori possono iscriversi a un evento e rispondere quando viene attivato. Questo modello è alla base della programmazione reattiva e dei framework per GUI.
Organizzerai il codice in tre file:
event.h: definisci il tipo puntatore a funzioneHandler, che accetta un messaggioconst char*. Crea una strutturaEventche contenga un array con un massimo di 5 gestori e il numero di gestori registrati. Dichiara le funzioni per inizializzare un evento, iscrivere un gestore e attivare l’evento per notificare tutti gli iscritti.event.c: implementa il tuo sistema di eventi:init_event: accetta un puntatore a Event e imposta a 0 il numero di gestorisubscribe: accetta un puntatore a Event e un Handler, aggiunge il gestore all’array se c’è spazio (numero inferiore a 5) e incrementa il numerofire: accetta un puntatore a Event e una stringa di messaggio, quindi chiama ogni gestore registrato passandogli quel messaggio, nell’ordine in cui si sono iscritti
main.c: crea tre diverse funzioni gestore che rispondono agli eventi in modi distinti:logger: stampa[LOG]seguito dal messaggioalert: stampa[ALERT]seguito dal messaggiocounter: usa una variabile statica per contare quante volte è stata chiamata, quindi stampa[COUNT] X, dove X è il conteggio attuale
Il programma riceverà:
- Il numero di gestori da iscrivere (1, 2 o 3)
- Il messaggio da trasmettere
Esempio di output quando gli input sono 3 e System started:
[LOG] System started
[ALERT] System started
[COUNT] 1Esempio di output quando gli input sono 2 e Warning detected:
[LOG] Warning detected
[ALERT] Warning detectedEsempio di output quando gli input sono 1 e Hello:
[LOG] HelloQuesto mostra il polimorfismo tramite puntatori a funzione: la stessa chiamata a fire attiva comportamenti completamente diversi, a seconda dei gestori iscritti. Ogni gestore risponde a modo suo allo stesso evento, illustrando la natura disaccoppiata della progettazione basata sugli eventi.
Provalo tu
#include <stdio.h>
#include <string.h>
#include "event.h"
// TODO: Implementare il gestore logger
// Stampa "[LOG] " seguito dal messaggio
void logger(const char* message) {
// TODO: Implementare
}
// TODO: Implementare il gestore alert
// Stampa "[ALERT] " seguito dal messaggio
void alert(const char* message) {
// TODO: Implementare
}
// TODO: Implementare il gestore counter
// Usa una variabile statica per contare le chiamate
// Stampa "[COUNT] X", dove X è il conteggio corrente
void counter(const char* message) {
// TODO: Implementare con una variabile statica
}
int main() {
// Leggi il numero di gestori da sottoscrivere
int num_handlers;
scanf("%d", &num_handlers);
getchar(); // consuma il carattere di nuova riga
// Leggi il messaggio
char message[256];
fgets(message, sizeof(message), stdin);
message[strcspn(message, "\n")] = '\0'; // rimuovi il carattere di nuova riga
// TODO: Crea e inizializza un Event
// TODO: Registra gli handler in base a num_handlers
// 1 handler: logger
// 2 handler: logger, alert
// 3 handler: logger, alert, counter
// TODO: Attiva l'evento con il messaggio
return 0;
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Basi di programmazione modulare
File di intestazioneGuardie di inclusioneFile sorgenteFunzioni staticheRipasso: calcolatrice modulare4Incapsulamento
Il concetto di puntatori opachiDefinire struct opacheGetter e setterLa convalida nei setterRiepilogo: scatola segreta2Oggetti e metodi
Le struct come oggettiIl puntatore 'Self'Correttezza constPuntatore o valoreMetodi di supportoRiepilogo: gestore di punti5Progetto: Conto bancario semplice
Configurazione del progettoImplementazione del conto8Polimorfismo
Puntatori a funzione nelle structSimulare i metodiIl concetto di interfacciaImplementare le interfacceIterazione polimorficaRiepilogo: Greeter11Pattern di progettazione in C
Pattern SingletonPattern FactoryPattern IteratorRiepilogo: Factory di Logger3Ciclo di vita degli oggetti
Pattern del costruttorePattern del distruttoreInizializzazione sullo stackCopia profondaRiepilogo: wrapper di stringhe6Ereditarietà tramite composizione
Incorporamento delle structLa regola del primo membroAccesso ai membri della classe baseUpcastingRiepilogo: gerarchia di forme9Progetto: Disegnatore di forme
Panoramica del progettoImplementazione del cerchioImplementazione del rettangoloUtilizzo polimorficoContenitore di formeEsercitati da solo: Compilatore C online