Menu
Coddy logo textTech

Olay Sistemi

Coddy'nin C Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 61 / 61.

challenge icon

Görev

Kolay

Bir Bildirim Sistemi oluşturalım: birden çok işleyicinin bir olaya abone olabildiği ve olay gerçekleştiğinde yanıt verebildiği, olay güdümlü bir mimari. Bu desen, reaktif programlamanın ve GUI çerçevelerinin temelini oluşturur.

Kodunuzu üç dosya arasında düzenleyeceksiniz:

  • event.h: Handler türünde bir mesaj alan const char* işaretçi türünü tanımlayın. En fazla 5 işleyiciden oluşan bir dizi ve kayıtlı işleyicilerin sayısını tutan bir Event yapısı oluşturun. Bir olayı başlatmak, bir işleyiciye abone olmak ve tüm aboneleri bilgilendirmek için olayı tetiklemek üzere işlev bildirimleri oluşturun.
  • event.c: Olay sisteminizi uygulayın:
    • init_event: bir Event işaretçisi alır ve işleyici sayısını 0 olarak ayarlar
    • subscribe: bir Event işaretçisi ve bir Handler alır, yer varsa (sayı 5'ten küçükse) işleyiciyi diziye ekler ve sayıyı artırır
    • fire: bir Event işaretçisi 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 işlevi oluşturun:
    • logger: mesajın önüne [LOG] ekleyerek yazdırır
    • alert: mesajın önüne [ALERT] ekleyerek yazdırır
    • counter: kaç kez çağrıldığını saymak için statik bir değişken kullanır, ardından geçerli sayının X olduğu [COUNT] X ifadesini yazdırır
    Abone olunacak işleyici sayısını (1, 2 veya 3) belirten bir tamsayı okuyun. Bu kadar işleyiciye sırayla abone olun: önce logger, ardından alert (2 veya daha fazlaysa), sonra counter (3 ise). Bir mesaj dizesi okuyun, ardından olayı bu mesajla tetikleyin.

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

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

Girdilerin 3 ve System started olduğu durumdaki örnek çıktı:

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

Girdilerin 2 ve Warning detected olduğu durumdaki örnek çıktı:

[LOG] Warning detected
[ALERT] Warning detected

Girdilerin 1 ve Hello olduğu durumdaki örnek çıktı:

[LOG] Hello

Bu, işlev işaretçileri aracılığıyla çok biçimliliği 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ış 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.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online C derleyicisi