מערכת אירועים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-C של Coddy. שיעור 61 מתוך 61.
אתגר
קלבואו נבנה מערכת התראות: ארכיטקטורה מונחית־אירועים שבה כמה מטפלים יכולים להירשם לאירוע ולהגיב כשהוא מופעל. הדפוס הזה הוא הבסיס לתכנות תגובתי ולמסגרות עבודה של ממשקי משתמש גרפיים.
תארגנו את הקוד שלכם בשלושה קבצים:
event.h: הגדירו את טיפוס מצביע הפונקציהHandler, שמקבל הודעתconst char*. צרו מבנהEventשמכיל מערך של עד 5 מטפלים ומונה של המטפלים הרשומים. הצהירו על פונקציות לאתחול אירוע, לרישום מטפל ולהפעלת האירוע כדי להודיע לכל הנרשמים.event.c: ממשו את מערכת האירועים שלכם:init_event: מקבלת מצביע ל־Event ומגדירה את מספר המטפלים ל־0subscribe: מקבלת מצביע ל־Event ו־Handler, מוסיפה את המטפל למערך אם יש מקום (המספר קטן מ־5), ומגדילה את המספרfire: מקבלת מצביע ל־Event ומחרוזת הודעה, ואז קוראת לכל מטפל רשום עם ההודעה הזאת, לפי סדר הרישום שלהם
main.c: צרו שלוש פונקציות מטפל שונות שמגיבות לאירועים בדרכים ייחודיות:logger: מדפיסה[LOG]ואחריו את ההודעהalert: מדפיסה[ALERT]ואחריו את ההודעהcounter: משתמשת במשתנה סטטי כדי לספור כמה פעמים היא נקראה, ואז מדפיסה[COUNT] X, כאשר X הוא המספר הנוכחי
התוכנית שלכם תקבל:
- את מספר המטפלים שיש לרשום (1, 2 או 3)
- את ההודעה להפצה
פלט לדוגמה כאשר הקלט הוא 3 ו־System started:
[LOG] System started
[ALERT] System started
[COUNT] 1פלט לדוגמה כאשר הקלט הוא 2 ו־Warning detected:
[LOG] Warning detected
[ALERT] Warning detectedפלט לדוגמה כאשר הקלט הוא 1 ו־Hello:
[LOG] Helloהדוגמה הזאת מדגימה פולימורפיזם באמצעות מצביעי פונקציות: אותה קריאה ל־fire מפעילה התנהגויות שונות לחלוטין, בהתאם למטפלים שנרשמו. כל מטפל מגיב בדרכו שלו לאותו אירוע, וכך מודגם האופי המנותק של תכנון מונחה־אירועים.
נסו בעצמכם
#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
// משתמש במשתנה סטטי כדי לספור קריאות
// מדפיס "[COUNT] X" כאשר X הוא מספר הקריאות הנוכחי
void counter(const char* message) {
// TODO: לממש באמצעות משתנה סטטי
}
int main() {
// לקרוא את מספר המטפלים שיש לרשום
int num_handlers;
scanf("%d", &num_handlers);
getchar(); // לקלוט את תו סוף השורה
// לקרוא את ההודעה
char message[256];
fgets(message, sizeof(message), stdin);
message[strcspn(message, "\n")] = '\0'; // הסר את תו השורה החדשה
// TODO: צור ואתחל Event
// TODO: רשום מטפלים בהתאם ל-num_handlers
// 1 מטפל: logger
// 2 מטפלים: logger, alert
// 3 מטפלים: logger, alert, counter
// TODO: הפעל את האירוע עם ההודעה
return 0;
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
4כימוס
המושג של מצביעים אטומיםהגדרת מבנים אטומיםפונקציות Get ו-Setאימות ב-Settersסיכום: הקופסה הסודית2אובייקטים ומתודות
מבנים כאובייקטיםמצביע 'Self'נכונות constמצביע לעומת ערךמתודות עזרחזרה: מנהל נקודות5פרויקט: חשבון בנק פשוט
הגדרת הפרויקטמימוש החשבוןתרגלו בעצמכם: קומפיילר C אונליין