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 tabanlı 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şleyici içeren 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 etmek 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, 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 (1, 2 veya 3) belirten bir tam sayı okuyun. Bu kadar işleyiciyi sırasıyla abone edin: ö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 tabanlı 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ı 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şleyicilere abone ol
    // 1 işleyici: logger
    // 2 işleyici: logger, alert
    // 3 işleyici: logger, alert, counter
    
    // TODO: Mesaj ile olayı tetikle (Fire)
    
    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