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#include <iostream>2#include <vector>3#include <functional>4#include <map>56using namespace std;78class EventManager {9private:10map<string, vector<function<void(const string&)>>> listeners;1112public:13// Olay dinleyicisi kaydet14void on(const string& event, function<void(const string&)> callback) {15listeners[event].push_back(callback);16}1718// Olay tetikle19void emit(const string& event, const string& data = "") {20if (listeners.find(event)!= listeners.end()) {21for (auto& callback: listeners[event]) {22callback(data);23}24}25}26};2728int main() {29EventManager manager;3031// Olay dinleyicileri kaydet32manager.on("userLogin", [](const string& data) {33cout << "[LOGIN] Kullanıcı giriş yaptı: " << data << endl;34});3536manager.on("userLogin", [](const string& data) {37cout << "[LOG] Giriş kaydedildi." << endl;38});3940manager.on("userLogout", [](const string& data) {41cout << "[LOGOUT] Kullanıcı çıkış yaptı: " << data << endl;42});4344manager.on("fileUpload", [](const string& data) {45cout << "[UPLOAD] Dosya yüklendi: " << data << endl;46});4748// Olayları tetikle49manager.emit("userLogin", "ahmet123");50manager.emit("fileUpload", "document.pdf");51manager.emit("userLogout", "ahmet123");5253return 0;54}Beklenen çıktı:
1[LOGIN] Kullanıcı giriş yaptı: ahmet1232[LOG] Giriş kaydedildi.3[UPLOAD] Dosya yüklendi: document.pdf4[LOGOUT] Kullanıcı çıkış yaptı: ahmet123Kod çalıştırmak için:
1g++ -std=c++11 -o event_system event_system.cpp./event_systemBurada `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.
0 yorum