Sistema de Eventos
Parte da seção Programação Orientada a Objetos do Journey de C da Coddy. Lição 61 de 61.
Desafio
FácilVamos criar um Sistema de Notificações: uma arquitetura orientada a eventos na qual vários manipuladores podem se inscrever em um evento e responder quando ele é disparado. Esse padrão é a base da programação reativa e dos frameworks de GUI.
Você organizará seu código em três arquivos:
event.h: Defina o tipo de ponteiro para funçãoHandler, que recebe uma mensagemconst char*. Crie uma structEventque armazena um array de até 5 manipuladores e uma contagem dos manipuladores registrados. Declare funções para inicializar um evento, inscrever um manipulador 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 manipuladores como 0subscribe: recebe um ponteiro para Event e um Handler, adiciona o manipulador ao array se houver espaço (contagem menor que 5) e incrementa a contagemfire: recebe um ponteiro para Event e uma string de mensagem, depois chama cada manipulador registrado com essa mensagem, na ordem em que foram inscritos
main.c: Crie três funções manipuladoras diferentes que respondam aos eventos de maneiras únicas:logger: imprime[LOG]seguido da mensagemalert: imprime[ALERT]seguido da mensagemcounter: usa uma variável estática para contar quantas vezes foi chamada e, em seguida, imprime[COUNT] X, em que X é a contagem atual
Seu programa receberá:
- O número de manipuladores a serem inscritos (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 por meio de ponteiros para funções: a mesma chamada fire aciona comportamentos completamente diferentes, dependendo dos manipuladores inscritos. Cada manipulador 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: Implemente o manipulador logger
// Imprime "[LOG] " seguido da mensagem
void logger(const char* message) {
// TODO: Implemente
}
// TODO: Implemente o manipulador alert
// Imprime "[ALERT] " seguido da mensagem
void alert(const char* message) {
// TODO: Implemente
}
// TODO: Implemente o manipulador counter
// Usa uma variável estática para contar as chamadas
// Imprime "[COUNT] X", em que X é a contagem atual
void counter(const char* message) {
// TODO: Implemente com uma variável estática
}
int main() {
// Leia o número de manipuladores a serem inscritos
int num_handlers;
scanf("%d", &num_handlers);
getchar(); // consome a quebra de linha
// Leia a mensagem
char message[256];
fgets(message, sizeof(message), stdin);
message[strcspn(message, "\n")] = '\0'; // remove a quebra de linha
// TODO: Crie e inicialize um Event
// TODO: Inscreva os handlers com base em num_handlers
// 1 handler: logger
// 2 handlers: logger, alert
// 3 handlers: logger, alert, counter
// TODO: Dispare 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 Programação Orientada a Objetos
1Fundamentos da Programação Modular
Arquivos de cabeçalhoProteções de inclusãoArquivos-fonteFunções estáticasRevisão: calculadora modular4Encapsulamento
Conceito de ponteiros opacosDefinindo structs opacasGetters e settersValidação em settersRevisão: caixa secreta2Objetos e métodos
Structs como objetosO ponteiro 'Self'Correção de constPonteiro vs. valorMétodos auxiliaresRevisão: Gerenciador de pontos5Projeto: Conta Bancária Simples
Configuração do ProjetoImplementação da Conta3Ciclo de vida do objeto
Padrão de construtorPadrão de destrutorInicialização da pilhaCópia profundaRevisão: wrapper de String6Herança por composição
Incorporação de structRegra do primeiro membroAcessando membros do tipo paiUpcastingRevisão: hierarquia de formas9Projeto: Desenhador de Formas
Visão geral do projetoImplementação do círculoImplementação do retânguloUso polimórficoContêiner de formasPratique por conta própria: Compilador de C online