Olay Sistemi
Coddy'nin C Journey'sinin Object Oriented Programming bölümünün bir parçası. Ders 61 / 61.
Görev
KolayBir 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:Handlerfunction 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 birEventstruct'ı 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 ayarlarsubscribe: 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ırfire: 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]Printsalert: message'in ardından[ALERT]Printscounter: kaç kez çağrıldığını count etmek için static bir variable kullanır, ardından X'in current count olduğu[COUNT] Xdeğerini Prints
Programınız şunları alacak:
- Subscribe olunacak handler sayısı (1, 2 veya 3)
- Broadcast edilecek message
Input'lar 3 ve System started olduğunda örnek output:
[LOG] System started
[ALERT] System started
[COUNT] 1Input'lar 2 ve Warning detected olduğunda örnek output:
[LOG] Warning detected
[ALERT] Warning detectedInput'lar 1 ve Hello olduğunda örnek output:
[LOG] HelloBu, 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;
}
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şisiKendi başına pratik yap: Online C derleyicisi