Sistema de Eventos
Parte da seção Object Oriented Programming do Journey de C da Coddy — lição 61 de 61.
Desafio
FácilVamos construir um Sistema de Notificação — uma arquitetura orientada a eventos onde múltiplos manipuladores (handlers) podem se inscrever em um evento e responder quando ele for disparado. Este padrão é a base da programação reativa e de frameworks de interface gráfica (GUI).
Você organizará seu código em três arquivos:
event.h: Defina o tipo de ponteiro de funçãoHandlerque recebe uma mensagemconst char*. Crie uma structEventque contém um array de até 5 handlers e uma contagem de handlers registrados. Declare funções para inicializar um evento, inscrever um handler e disparar o evento para notificar todos os inscritos.event.c: Implemente seu sistema de eventos:init_event— recebe um ponteiro para Event e define a contagem de handlers como 0subscribe— recebe um ponteiro para Event e um Handler, adiciona o handler ao array se houver espaço (contagem menor que 5) e incrementa a contagemfire— recebe um ponteiro para Event e uma string de mensagem, então chama cada handler registrado com essa mensagem na ordem em que foram inscritos
main.c: Crie três funções de handler diferentes que respondem aos eventos de maneiras únicas:logger— imprime[LOG]seguido pela mensagemalert— imprime[ALERT]seguido pela mensagemcounter— usa uma variável estática para contar quantas vezes foi chamada, então imprime[COUNT] Xonde X é a contagem atual
Seu programa receberá:
- O número de handlers para inscrever (1, 2 ou 3)
- A mensagem a ser transmitida
Exemplo de saída quando as entradas são 3 e System started:
[LOG] System started
[ALERT] System started
[COUNT] 1Exemplo de saída quando as entradas são 2 e Warning detected:
[LOG] Warning detected
[ALERT] Warning detectedExemplo de saída quando as entradas são 1 e Hello:
[LOG] HelloIsso demonstra o polimorfismo através de ponteiros de função — a mesma chamada fire aciona comportamentos completamente diferentes dependendo de quais handlers estão inscritos. Cada handler responde à sua maneira ao mesmo evento, demonstrando a natureza desacoplada do design orientado a eventos.
Experimente você mesmo
#include <stdio.h>
#include <string.h>
#include "event.h"
// TODO: Implementar o manipulador logger
// Imprime "[LOG] " seguido pela mensagem
void logger(const char* message) {
// TODO: Implementar
}
// TODO: Implementar o manipulador alert
// Imprime "[ALERT] " seguido pela mensagem
void alert(const char* message) {
// TODO: Implementar
}
// TODO: Implementar o manipulador counter
// Usa uma variável static para contar as chamadas
// Imprime "[COUNT] X" onde X é a contagem atual
void counter(const char* message) {
// TODO: Implementar com uma variável static
}
int main() {
// Lê o número de manipuladores para se inscrever
int num_handlers;
scanf("%d", &num_handlers);
getchar(); // consome a nova linha
// Lê a mensagem
char message[256];
fgets(message, sizeof(message), stdin);
message[strcspn(message, "\n")] = '\0'; // remove a nova linha
// TODO: Criar e inicializar um Event
// TODO: Inscrever os manipuladores com base em num_handlers
// 1 manipulador: logger
// 2 manipuladores: logger, alert
// 3 manipuladores: logger, alert, counter
// TODO: Disparar o evento com a mensagem
return 0;
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Object Oriented Programming
1Fundamentos da Programação Modular
Arquivos de CabeçalhoInclude GuardsArquivos-FonteFunções EstáticasRecapitulação: Calculadora Modular4Encapsulamento
Conceito de Ponteiros OpacosDefinindo Structs OpacasGetters e SettersValidação em SettersRecapitulação: Caixa Secreta2Objetos e Métodos
Structs como ObjetosO Ponteiro 'Self'Const CorrectnessPonteiro vs ValorMétodos AuxiliaresRecapitulação: Point Manager5Projeto: Conta Bancária Simples
Configuração do ProjetoImplementação da Conta3Ciclo de Vida de Objetos
Padrão de ConstrutorPadrão de DestrutorInicialização na StackCópia ProfundaRecapitulação: String Wrapper6Herança via Composição
Incorporação de StructsA Regra do Primeiro MembroAcessando Membros PaiUpcastingRecapitulação: Hierarquia de Formas9Projeto: Desenhador de Formas
Visão Geral do ProjetoImplementação do Círculo