Callback Fonksiyonlarla Event-Driven Mimari Kurma

Event-driven mimariler modern yazılımda sık karşılaşılan bir desendir. Bir olay meydana geldiğinde, bunu dinleyen fonksiyonlar otomatik çalışır. Callback fonksiyonları bu mekanizmanın temelini oluşturur.

C/C++ ile basit bir event sistemi kurmak için, olay türlerini tanımlayıp, her olay için kayıtlı callback'leri çağırırız. Örneğin, bir düğmeye basıldığında veya bir dosya yüklendiğinde ilgili fonksiyonların tetiklenmesini sağlayabiliriz.

Aşağıda, bir event manager sistemi ve ona bağlı callback'leri gösteren çalışan örnek vardır:

1 <iostream>
2 <vector>
3 <functional>
4 <map>
5
6using namespace std;
7
8class EventManager {
9private:
10map<string, vector<function<void(const string&)>>> listeners;
11
12public:
13// Olay dinleyicisi kaydet
14void on(const string& event, function<void(const string&)> callback) {
15listeners[event].push_back(callback);
16}
17
18// Olay tetikle
19void emit(const string& event, const string& data = "") {
20if (listeners.find(event)!= listeners.end()) {
21for (auto& callback: listeners[event]) {
22callback(data);
23}
24}
25}
26};
27
28int main() {
29EventManager manager;
30
31// Olay dinleyicileri kaydet
32manager.on("userLogin", [](const string& data) {
33cout << "[LOGIN] Kullanıcı giriş yaptı: " << data << endl;
34});
35
36manager.on("userLogin", [](const string& data) {
37cout << "[LOG] Giriş kaydedildi." << endl;
38});
39
40manager.on("userLogout", [](const string& data) {
41cout << "[LOGOUT] Kullanıcı çıkış yaptı: " << data << endl;
42});
43
44manager.on("fileUpload", [](const string& data) {
45cout << "[UPLOAD] Dosya yüklendi: " << data << endl;
46});
47
48// Olayları tetikle
49manager.emit("userLogin", "ahmet123");
50manager.emit("fileUpload", "document.pdf");
51manager.emit("userLogout", "ahmet123");
52
53return 0;
54}

Beklenen çıktı:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1[LOGIN] Kullanıcı giriş yaptı: ahmet123
2[LOG] Giriş kaydedildi.
3[UPLOAD] Dosya yüklendi: document.pdf
4[LOGOUT] Kullanıcı çıkış yaptı: ahmet123

Kod çalıştırmak için:

1g++ -std=c++11 -o event_system event_system.cpp./event_system

Burada `map` ile olay adlarını callback listelerine eşleştiriyoruz. `function<>` ise lambda veya normal fonksiyonları saklayabilir. Bir olay tetiklendiğinde, o olay için kayıtlı tüm callback'ler sırayla çalışır.

Sık yapılan hata: Aynı olay için birden fazla callback kaydetmek ve hangisinin çalışacağını tahmin etmek. Yukarıdaki örnek gösteriyor ki, tüm callback'ler çalışır, bunu göz önüne alarak tasarla. Ayrıca, callback içinde exception fırlatma riski varsa, try-catch ile koruma ekle.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz