Olay Sistemi
Coddy'nin C Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 61 / 61.
Görev
KolayBirden 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: Birconst char*mesajı alanHandlerfonksiyon 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 birEventyapı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 ayarlarsubscribe— bir Event göstericisi ve bir Handler alır, yer varsa (sayı 5'ten azsa) işleyiciyi diziye ekler ve sayıyı artırırfire— 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ıralert—[ALERT]ve ardından mesajı yazdırırcounter— kaç kez çağrıldığını saymak için statik bir değişken kullanır, ardından[COUNT] Xyazdırır (burada X mevcut sayıdır)
Programınız şunları alacaktır:
- Abone edilecek işleyici sayısı (1, 2 veya 3)
- Yayınlanacak mesaj
Girdiler 3 ve System started olduğunda örnek çıktı:
[LOG] System started
[ALERT] System started
[COUNT] 1Girdiler 2 ve Warning detected olduğunda örnek çıktı:
[LOG] Warning detected
[ALERT] Warning detectedGirdiler 1 ve Hello olduğunda örnek çıktı:
[LOG] Hellobu, 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;
}
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
1Modüler Programlama Temelleri
Başlık DosyalarıInclude Guard'larKaynak DosyalarıStatik FonksiyonlarÖzet: Modüler Hesap Makinesi4Kapsülleme
Opaque Pointer KavramıOpaque Struct TanımlamaGetter ve Setter MetotlarıSetter Metotlarında DoğrulamaÖzet: Gizli Kutu2Nesneler ve Metotlar
Nesne Olarak Struct'lar'Self' İşaretçisiConst Doğruluğuİşaretçi vs DeğerYardımcı MetotlarÖzet: Point Manager5Proje: Basit Banka Hesabı
Proje KurulumuHesabın Oluşturulması3Nesne Yaşam Döngüsü
Constructor DeseniDestructor DeseniStack İlklendirmeDerin KopyalamaÖzet: String Wrapper6Kompozisyon Yoluyla Kalıtım
Struct Gömmeİlk Üye KuralıÜst Üyelere ErişimUpcastingÖzet: Şekil Hiyerarşisi