Menu
Coddy logo textTech

סיכום: Factory לרישום יומנים

חלק מהיחידה תכנות מונחה עצמים במסלול ה-C של Coddy. שיעור 57 מתוך 61.

challenge icon

אתגר

קל

בואו נבנה מפעל לוגר: מערכת שמדגימה את העוצמה שבשילוב תבנית המפעל עם פולימורפיזם. המפעל שלך יצור מימושים שונים של לוגר על סמך דגל תצורה, ויאפשר לקוד לעבור בין פלט מפורט למסוף לבין רישום שקט באמצעות "dummy", בלי לשנות את אופן השימוש בלוגרים.

תארגן את הקוד שלך בשלושה קבצים:

  • logger.h: הגדר מבנה Logger שמתפקד כממשק. הוא צריך להכיל מצביע לפונקציה בשם log, שמקבלת Logger* והודעת const char*. הצהר על פונקציית המפעל שלך create_logger, שמקבלת דגל מספר שלם (1 למסוף, 0 ל-dummy) ומחזירה Logger*. הצהר גם על פונקציה free_logger לניקוי.
  • logger.c: ממש את שני סוגי הלוגר הקונקרטיים. ConsoleLogger מכיל את Logger כאיבר הראשון שלו, ויש לו פונקציית רישום שמדפיסה הודעות בתבנית [LOG] message. גם DummyLogger מכיל את Logger, אבל פונקציית הרישום שלו אינה עושה דבר. היא פשוט חוזרת בלי להדפיס. צור פונקציות בנאי לכל סוג, שמקצות זיכרון ומחברות את פונקציית הרישום המתאימה. לאחר מכן ממש את create_logger כמפעל שבודק את הדגל ומחזיר את סוג הלוגר המתאים כ-Logger*. ממש את free_logger כדי לשחרר את הזיכרון.
  • main.c: קרא מספר שלם (1 או 0) כדי לקבוע איזה לוגר ליצור. השתמש במפעל שלך כדי ליצור את הלוגר המתאים, ואז קרא לפונקציית log שלו עם שתי הודעות: "Starting application" ו-"Shutting down". לבסוף, שחרר את הלוגר.

התוכנית שלך תקבל קלט אחד: מספר שלם שמציין את סוג הלוגר (1 למסוף, 0 ל-dummy).

פלט לדוגמה כאשר הקלט הוא 1:

[LOG] Starting application
[LOG] Shutting down

פלט לדוגמה כאשר הקלט הוא 0:

(אין פלט: לוגר ה-dummy מתעלם בשקט מכל ההודעות)

האלגנטיות כאן היא ש-main.c משתמש בלוגר באותו אופן, בלי קשר לסוג שהוא מקבל. המפעל מחליט מה ליצור, והפולימורפיזם מבטיח שהתנהגות נכונה תתבצע. התבנית הזאת חשובה מאין כמוה ביישומים אמיתיים, שבהם ייתכן שתרצה רישום מפורט במהלך הפיתוח, אך פעולה שקטה בסביבת ייצור.

נסו בעצמכם

#include <stdio.h>
#include "logger.h"

int main() {
    // קראו את דגל סוג ה-logger (1 עבור console, 0 עבור dummy)
    int flag;
    scanf("%d", &flag);
    
    // TODO: השתמשו ב-factory כדי ליצור את ה-logger המתאים
    
    // TODO: קראו לפונקציית log של ה-logger עם "Starting application"
    
    // TODO: קראו לפונקציית log של ה-logger עם "Shutting down"
    
    // TODO: שחררו את ה-logger
    
    return 0;
}

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר C אונליין