Sistema de eventos
Parte de la sección Object Oriented Programming del Journey de C de Coddy — lección 61 de 61.
Desafío
FácilVamos a construir un Sistema de Notificaciones — una arquitectura dirigida por eventos donde múltiples manejadores pueden suscribirse a un evento y responder cuando este se dispara. Este patrón es la columna vertebral de la programación reactiva y de los frameworks de GUI.
Organizarás tu código en tres archivos:
event.h: Define el tipo de puntero a funciónHandlerque recibe un mensajeconst char*. Crea una estructuraEventque contenga un arreglo de hasta 5 manejadores y un contador de manejadores registrados. Declara funciones para inicializar un evento, suscribir un manejador y disparar el evento para notificar a todos los suscriptores.event.c: Implementa tu sistema de eventos:init_event— recibe un puntero a Event y establece el contador de manejadores en 0subscribe— recibe un puntero a Event y un Handler, añade el manejador al arreglo si hay espacio (contador menor que 5) e incrementa el contadorfire— recibe un puntero a Event y una cadena de mensaje, luego llama a cada manejador registrado con ese mensaje en el orden en que fueron suscritos
main.c: Crea tres funciones manejadoras diferentes que respondan a los eventos de formas únicas:logger— imprime[LOG]seguido del mensajealert— imprime[ALERT]seguido del mensajecounter— utiliza una variable estática para contar cuántas veces ha sido llamada, luego imprime[COUNT] Xdonde X es el conteo actual
Tu programa recibirá:
- El número de manejadores a suscribir (1, 2 o 3)
- El mensaje a transmitir
Ejemplo de salida cuando las entradas son 3 y System started:
[LOG] System started
[ALERT] System started
[COUNT] 1Ejemplo de salida cuando las entradas son 2 y Warning detected:
[LOG] Warning detected
[ALERT] Warning detectedEjemplo de salida cuando las entradas son 1 y Hello:
[LOG] HelloEsto demuestra el polimorfismo a través de punteros a funciones — la misma llamada a fire activa comportamientos completamente diferentes dependiendo de qué manejadores estén suscritos. Cada manejador responde a su manera al mismo evento, mostrando la naturaleza desacoplada del diseño dirigido por eventos.
Pruébalo tú mismo
#include <stdio.h>
#include <string.h>
#include "event.h"
// TODO: Implementar el manejador logger
// Imprime "[LOG] " seguido del mensaje
void logger(const char* message) {
// TODO: Implementar
}
// TODO: Implementar el manejador alert
// Imprime "[ALERT] " seguido del mensaje
void alert(const char* message) {
// TODO: Implementar
}
// TODO: Implementar el manejador counter
// Usa una variable static para contar las llamadas
// Imprime "[COUNT] X" donde X es el conteo actual
void counter(const char* message) {
// TODO: Implementar con una variable static
}
int main() {
// Leer el número de manejadores a suscribir
int num_handlers;
scanf("%d", &num_handlers);
getchar(); // consumir el salto de línea
// Leer el mensaje
char message[256];
fgets(message, sizeof(message), stdin);
message[strcspn(message, "\n")] = '\0'; // eliminar el salto de línea
// TODO: Crear e inicializar un Event
// TODO: Suscribir manejadores basados en num_handlers
// 1 manejador: logger
// 2 manejadores: logger, alert
// 3 manejadores: logger, alert, counter
// TODO: Disparar el evento con el mensaje
return 0;
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Object Oriented Programming
1Fundamentos de programación modular
Archivos de cabeceraGuardas de inclusiónArchivos fuenteFunciones estáticasRepaso: Calculadora modular4Encapsulamiento
Concepto de punteros opacosDefinición de structs opacosGetters y SettersValidación en settersResumen: Caja secreta7Punteros a funciones
Declaración de punteros a funcionesLlamada a punteros a funcionesTypedef para punteros a funcionesPasar funciones como argumentosRepaso: Dispatch de calculadora10Contenedores genéricos
Repaso de punteros voidWrapper genéricoSwap genéricoComparación genéricaRepaso: Array genérico2Objetos y métodos
Structs como objetosEl puntero 'Self'Const CorrectnessPuntero vs. ValorMétodos auxiliaresResumen: Point Manager5Proyecto: Cuenta bancaria simple
Configuración del proyectoImplementación de la cuenta3Ciclo de vida de los objetos
Patrón ConstructorPatrón DestructorInicialización en StackCopia profundaResumen: String Wrapper6Herencia mediante composición
Incrustación de StructsLa regla del primer miembroAcceso a miembros padreUpcastingResumen: Jerarquía de formas9Proyecto: Dibujador de figuras
Descripción general del proyectoImplementación del círculo