Menu
CoddyTech

Sistema de Eventos

Parte da seção Programação Orientada a Objetos do Journey de C da Coddy. Lição 61 de 61.

challenge icon

Desafio

Fácil

Vamos 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ção Handler, que recebe uma mensagem const char*. Crie uma struct Event que 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 0
    • subscribe: recebe um ponteiro para Event e um Handler, adiciona o manipulador ao array se houver espaço (contagem menor que 5) e incrementa a contagem
    • fire: 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 mensagem
    • alert: imprime [ALERT] seguido da mensagem
    • counter: usa uma variável estática para contar quantas vezes foi chamada e, em seguida, imprime [COUNT] X, em que X é a contagem atual
    Leia um número inteiro que indique quantos manipuladores devem ser inscritos (1, 2 ou 3). Inscreva essa quantidade de manipuladores nesta ordem: primeiro logger, depois alert (se forem 2 ou mais) e, em seguida, counter (se forem 3). Leia uma string de mensagem e, depois, dispare o evento com essa mensagem.

Seu programa receberá:

  1. O número de manipuladores a serem inscritos (1, 2 ou 3)
  2. 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] 1

Exemplo de saída quando as entradas são 2 e Warning detected:

[LOG] Warning detected
[ALERT] Warning detected

Exemplo de saída quando as entradas são 1 e Hello:

[LOG] Hello

Isso 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;
}
quiz iconTeste seus conhecimentos

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

Pratique por conta própria: Compilador de C online