Menu
Coddy logo textTech

Olay Sistemi

Coddy'nin C Journey'sinin Object Oriented Programming bölümünün bir parçası. Ders 61 / 61.

challenge icon

Görev

Kolay

Bir Notification System oluşturalım: birden fazla handler'ın bir event'e subscribe olabildiği ve event fire olduğunda yanıt verebildiği event-driven bir mimari. Bu pattern, reactive programming'in ve GUI framework'lerinin temelini oluşturur.

Codunuzu üç dosyada organize edeceksiniz:

  • event.h: Handler function pointer type'ını define edin; bu type, const char* message alır. En fazla 5 handler ve kayıtlı handler'ların count değerini tutan bir Event struct'ı Create edin. Bir event'i initialize etmek, bir handler'a subscribe olmak ve tüm subscriber'ları notify etmek için event'i fire etmek üzere function'lar declare edin.
  • event.c: Event system'inizi Implement edin:
    • init_event: bir Event pointer alır ve handler count değerini 0 olarak ayarlar
    • subscribe: bir Event pointer ve bir Handler alır, yer varsa (count 5'ten küçükse) handler'ı array'e ekler ve count değerini artırır
    • fire: bir Event pointer ve bir message string alır, ardından her kayıtlı handler'ı subscribe oldukları order içinde bu message ile calls eder
  • main.c: event'lere benzersiz şekillerde yanıt veren üç farklı handler function'ı Create edin:
    • logger: message'in ardından [LOG] Prints
    • alert: message'in ardından [ALERT] Prints
    • counter: kaç kez çağrıldığını count etmek için static bir variable kullanır, ardından X'in current count olduğu [COUNT] X değerini Prints
    Kaç handler'a subscribe olunacağını (1, 2 veya 3) belirten bir integer Read edin. Bu sayıda handler'a şu order ile subscribe olun: önce logger, ardından alert (2+ ise), sonra counter (3 ise). Bir message string Read edin, ardından event'i bu message ile fire edin.

Programınız şunları alacak:

  1. Subscribe olunacak handler sayısı (1, 2 veya 3)
  2. Broadcast edilecek message

Input'lar 3 ve System started olduğunda örnek output:

[LOG] System started
[ALERT] System started
[COUNT] 1

Input'lar 2 ve Warning detected olduğunda örnek output:

[LOG] Warning detected
[ALERT] Warning detected

Input'lar 1 ve Hello olduğunda örnek output:

[LOG] Hello

Bu, function pointer'lar aracılığıyla polymorphism'i gösterir: aynı fire call'ı, hangi handler'lara subscribe olunduğuna bağlı olarak tamamen farklı davranışları tetikler. Her handler aynı event'e kendi yöntemiyle yanıt verir ve event-driven design'ın decoupled yapısını sergiler.

Kendin dene

#include <stdio.h>
#include <string.h>
#include "event.h"

// TODO: logger handler'ı uygula
// "[LOG] " yazdırır, ardından mesajı
void logger(const char* message) {
    // TODO: Uygula
}

// TODO: alert handler'ı uygula
// "[ALERT] " yazdırır, ardından mesajı
void alert(const char* message) {
    // TODO: Uygula
}

// TODO: counter handler'ı uygula
// Çağrıları saymak için static bir değişken kullanır
// "[COUNT] X" yazdırır, burada X mevcut sayıdır
void counter(const char* message) {
    // TODO: static değişken ile uygula
}

int main() {
    // Abone olunacak handler sayısını oku
    int num_handlers;
    scanf("%d", &num_handlers);
    getchar(); // yeni satırı tüket
    
    // Mesajı oku
    char message[256];
    fgets(message, sizeof(message), stdin);
    message[strcspn(message, "\n")] = '\0'; // yeni satırı kaldır
    
    // TODO: Bir Event oluştur ve başlat
    
    // TODO: num_handlers'a göre işleyicileri abone et
    // 1 işleyici: logger
    // 2 işleyici: logger, alert
    // 3 işleyici: logger, alert, counter
    
    // TODO: Olayı mesaj ile tetikle
    
    return 0;
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Object Oriented Programming bölümündeki tüm dersler

Kendi başına pratik yap: Online C derleyicisi