Olay Sistemi
Coddy'nin C Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 61 / 61.
Görev
KolayBir 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:Handlertüründe bir mesaj alanconst 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 birEventyapı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 ayarlarsubscribe: 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ırfire: 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ıralert: mesajın önüne[ALERT]ekleyerek yazdırırcounter: 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] Xifadesini yazdırır
Programınız şunları alacaktır:
- Abone olunacak işleyicilerin sayısı (1, 2 veya 3)
- Yayınlanacak mesaj
Girdilerin 3 ve System started olduğu durumdaki örnek çıktı:
[LOG] System started
[ALERT] System started
[COUNT] 1Girdilerin 2 ve Warning detected olduğu durumdaki örnek çıktı:
[LOG] Warning detected
[ALERT] Warning detectedGirdilerin 1 ve Hello olduğu durumdaki örnek çıktı:
[LOG] HelloBu, 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;
}
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
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