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

مراجعة: Logger Factory

جزء من قسم البرمجة كائنية التوجه في رحلة C على Coddy. الدرس 57 من 61.

challenge icon

التحدي

سهل

لنبنِ Logger Factory: نظامًا يوضّح قوة الجمع بين نمط Factory وتعدّد الأشكال. ستنشئ factory تطبيقات logger مختلفة استنادًا إلى flag للإعدادات، مما يسمح للكود بالتبديل بين مخرجات console المفصّلة وتسجيل "dummy" الصامت دون تغيير طريقة استخدام logger.

ستنظّم كودك عبر ثلاثة ملفات:

  • logger.h: عرّف بنية Logger التي تعمل كواجهة. يجب أن تحتوي على مؤشّر دالة لـ log يأخذ Logger* ورسالة من النوع const char*. صرّح بدالة factory، وهي create_logger، التي تأخذ flag من النوع integer (‏1 لـ console و0 لـ dummy) وتُرجع Logger*. صرّح أيضًا بدالة free_logger لإجراء Cleanup.
  • logger.c: نفّذ نوعين ملموسين من logger. يضمّن ConsoleLogger بنية Logger بوصفها أول عضو فيه، ويحتوي على دالة log تطبع الرسائل بالتنسيق [LOG] message. يضمّن DummyLogger أيضًا بنية Logger، لكن دالة log الخاصة به لا تفعل شيئًا. فهي تعود ببساطة دون طباعة. أنشئ دوال Constructor لكل نوع لتخصيص الذاكرة وربط دالة log المناسبة. ثم نفّذ create_logger بوصفها factory تتحقق من flag وتُرجع نوع logger المناسب على هيئة Logger*. نفّذ free_logger لتحرير الذاكرة.
  • main.c: اقرأ integer (‏1 أو 0) لتحديد logger الذي يجب إنشاؤه. استخدم factory لإنشاء logger المناسب، ثم استدعِ دالة log الخاصة به مع رسالتين: "Starting application" و"Shutting down". وأخيرًا، حرّر logger.

سيستقبل برنامجك مُدخلًا واحدًا: integer يشير إلى نوع logger (‏1 لـ console و0 لـ dummy).

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

[LOG] Starting application
[LOG] Shutting down

مثال على المخرجات عندما يكون المُدخل 0:

(لا توجد مخرجات: يتجاهل dummy logger جميع الرسائل بصمت)

تكمن الأناقة هنا في أن main.c يستخدم logger بالطريقة نفسها بغضّ النظر عن النوع الذي يستلمه. يقرّر factory ما يجب إنشاؤه، ويضمن تعدّد الأشكال تنفيذ السلوك الصحيح. هذا النمط لا يُقدّر بثمن في التطبيقات الحقيقية، حيث قد ترغب في تسجيل مفصّل أثناء التطوير، لكن في تشغيل صامت في بيئة الإنتاج.

جرّب بنفسك

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

int main() {
    // اقرأ علامة نوع المسجل (1 لوحدة التحكم، 0 للوهمي)
    int flag;
    scanf("%d", &flag);
    
    // TODO: استخدم المصنع لإنشاء المسجل المناسب
    
    // TODO: Call the logger's log function with "Starting application"
    
    // TODO: Call the logger's log function with "Shutting down"
    
    // TODO: حرّر المسجل
    
    return 0;
}

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم C عبر الإنترنت