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

Birden fazla işleyicinin (handler) bir olaya abone olabildiği ve olay tetiklendiğinde yanıt verebildiği olay güdümlü (event-driven) bir mimari olan Bildirim Sistemi inşa edelim. Bu desen, reaktif programlamanın ve GUI çerçevelerinin temel taşıdır.

Kodunuzu üç dosya halinde düzenleyeceksiniz:

  • event.h: Bir const char* mesajı alan Handler fonksiyon göstericisi (function pointer) türünü tanımlayın. En fazla 5 işleyiciden oluşan bir dizi ve kayıtlı işleyici sayısını tutan bir Event yapısı (struct) oluşturun. Bir olayı başlatmak, bir işleyiciyi abone yapmak ve tüm aboneleri bilgilendirmek için olayı tetiklemek üzere fonksiyonları bildirin.
  • event.c: Olay sisteminizi uygulayın:
    • init_event — bir Event göstericisi alır ve işleyici sayısını 0 olarak ayarlar
    • subscribe — bir Event göstericisi ve bir Handler alır, eğer yer varsa (sayı 5'ten azsa) işleyiciyi diziye ekler ve sayıyı artırır
    • fire — bir Event göstericisi ve bir mesaj dizesi alır, ardından kayıtlı her işleyiciyi abone olma sırasına göre bu mesajla çağırır
  • main.c: Olaylara benzersiz şekillerde yanıt veren üç farklı işleyici fonksiyonu oluşturun:
    • logger[LOG] ve ardından mesajı yazdırır
    • alert[ALERT] ve ardından mesajı yazdırır
    • counter — kaç kez çağrıldığını saymak için statik bir değişken kullanır, ardından [COUNT] X yazdırır (burada X mevcut sayıdır)
    Kaç işleyicinin abone edileceğini belirten bir tam sayı okuyun (1, 2 veya 3). Bu kadar işleyiciyi sırasıyla abone yapın: önce logger, sonra alert (2+ ise), sonra counter (3 ise). Bir mesaj dizesi okuyun, ardından olayı bu mesajla tetikleyin.

Programınız şunları alacaktır:

  1. Abone edilecek işleyici sayısı (1, 2 veya 3)
  2. Yayınlanacak mesaj

Girdiler 3 ve System started olduğunda örnek çıktı:

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

Girdiler 2 ve Warning detected olduğunda örnek çıktı:

[LOG] Warning detected
[ALERT] Warning detected

Girdiler 1 ve Hello olduğunda örnek çıktı:

[LOG] Hello

bu, fonksiyon göstericileri aracılığıyla polimorfizmi gösterir — aynı fire çağrısı, hangi işleyicilerin abone olduğuna bağlı olarak tamamen farklı davranışları tetikler. Her işleyici aynı olaya kendi yöntemiyle yanıt vererek olay güdümlü tasarımın ayrıştırılmış (decoupled) doğasını sergiler.

Kendin dene

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

// TODO: logger işleyicisini uygula
// "[LOG] " ve ardından mesajı yazdırır
void logger(const char* message) {
    // TODO: Uygula
}

// TODO: alert işleyicisini uygula
// "[ALERT] " ve ardından mesajı yazdırır
void alert(const char* message) {
    // TODO: Uygula
}

// TODO: counter işleyicisini uygula
// Çağrıları saymak için bir static 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 işleyici sayısını oku
    int num_handlers;
    scanf("%d", &num_handlers);
    getchar(); // yeni satır karakterini 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 değerine göre işleyicileri (handlers) abone et
    // 1 işleyici: logger
    // 2 işleyici: logger, alert
    // 3 işleyici: logger, alert, counter
    
    // TODO: Olayı (event) mesajla birlikte 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