Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

نظام الأحداث

جزء من قسم Object Oriented Programming في رحلة C على Coddy — الدرس 61 من 61.

challenge icon

التحدي

سهل

لنقم ببناء Notification System — وهي بنية تعتمد على الأحداث حيث يمكن لعدة معالجات (handlers) الاشتراك في حدث والاستجابة عند إطلاقه. هذا النمط هو العمود الفقري للبرمجة التفاعلية وأطر عمل واجهة المستخدم الرسومية (GUI).

ستقوم بتنظيم الكود الخاص بك عبر ثلاثة ملفات:

  • event.h: قم بتعريف نوع مؤشر الدالة Handler الذي يأخذ رسالة من نوع const char*. أنشئ هيكل Event يحتوي على مصفوفة تصل إلى 5 معالجات وعداد للمعالجات المسجلة. صرّح عن دوال لتهيئة الحدث، والاشتراك بمعالج، وإطلاق الحدث لإخطار جميع المشتركين.
  • event.c: قم بتنفيذ نظام الأحداث الخاص بك:
    • init_event — يأخذ مؤشر Event ويضبط عداد المعالجات على 0
    • subscribe — يأخذ مؤشر Event و Handler، ويضيف المعالج إلى المصفوفة إذا كانت هناك مساحة (العداد أقل من 5)، ويزيد العداد
    • fire — يأخذ مؤشر Event وسلسلة نصية للرسالة، ثم يستدعي كل معالج مسجل مع تلك الرسالة بالترتيب الذي تم الاشتراك به
  • main.c: أنشئ ثلاث دوال معالجة مختلفة تستجيب للأحداث بطرق فريدة:
    • logger — يطبع [LOG] متبوعاً بالرسالة
    • alert — يطبع [ALERT] متبوعاً بالرسالة
    • counter — يستخدم متغيراً ساكناً (static) لعد المرات التي تم استدعاؤه فيها، ثم يطبع [COUNT] X حيث X هو العداد الحالي
    اقرأ عدداً صحيحاً يشير إلى عدد المعالجات التي سيتم الاشتراك بها (1، 2، أو 3). اشترك بهذا العدد من المعالجات بالترتيب: أولاً logger، ثم alert (إذا كان 2 فأكثر)، ثم counter (إذا كان 3). اقرأ سلسلة نصية للرسالة، ثم أطلق الحدث مع تلك الرسالة.

سيتلقى برنامجك:

  1. عدد المعالجات للاشتراك بها (1، 2، أو 3)
  2. الرسالة المراد بثها

مثال على المخرجات عندما تكون المدخلات 3 و System started:

[LOG] System started
[ALERT] System started
[COUNT] 1

مثال على المخرجات عندما تكون المدخلات 2 و Warning detected:

[LOG] Warning detected
[ALERT] Warning detected

مثال على المخرجات عندما تكون المدخلات 1 و Hello:

[LOG] Hello

يوضح هذا تعدد الأشكال (polymorphism) من خلال مؤشرات الدوال — حيث يؤدي استدعاء fire نفسه إلى إطلاق سلوكيات مختلفة تماماً اعتماداً على المعالجات المشتركة. يستجيب كل معالج بطريقته الخاصة لنفس الحدث، مما يبرز الطبيعة المنفصلة (decoupled) للتصميم المعتمد على الأحداث.

جرّب بنفسك

#include <stdio.h>
#include <string.h>
#include "event.h"

// TODO: تنفيذ معالج logger
// يطبع "[LOG] " متبوعة بالرسالة
void logger(const char* message) {
    // TODO: تنفيذ
}

// TODO: تنفيذ معالج alert
// يطبع "[ALERT] " متبوعة بالرسالة
void alert(const char* message) {
    // TODO: تنفيذ
}

// TODO: تنفيذ معالج counter
// يستخدم static variable لعد الاستدعاءات
// يطبع "[COUNT] X" حيث X هو العدد الحالي
void counter(const char* message) {
    // TODO: التنفيذ باستخدام static variable
}

int main() {
    // قراءة عدد الـ handlers للاشتراك
    int num_handlers;
    scanf("%d", &num_handlers);
    getchar(); // استهلاك السطر الجديد
    
    // قراءة الرسالة
    char message[256];
    fgets(message, sizeof(message), stdin);
    message[strcspn(message, "\n")] = '\0'; // إزالة السطر الجديد
    
    // TODO: إنشاء وتهيئة Event
    
    // TODO: الاشتراك في الـ handlers بناءً على num_handlers
    // معالج واحد: logger
    // معالجان: logger، alert
    // 3 معالجات: logger، alert، counter
    
    // TODO: إطلاق الـ event مع الرسالة
    
    return 0;
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Object Oriented Programming