نمط المنشئ (Constructor Pattern)
جزء من قسم البرمجة كائنية التوجه في رحلة C على Coddy. الدرس 12 من 61.
في لغات مثل Java أو C++، تنشئ الكائنات باستخدام البُناة: دوال خاصة تقوم تلقائيًا بـ allocate الذاكرة وتهيئة الحقول. لا تحتوي C على هذه الميزة، لكن يمكننا محاكاتها باستخدام نمط بسيط: دالة create_.
عادةً ما تنفّذ function المُنشئ في C ثلاثة أمور: تخصّص memory باستخدام malloc، وتُهيّئ جميع field إلى قيم مناسبة، وتُعيد pointer إلى الكائن الجديد:
typedef struct {
char *name;
int age;
} Person;
Person *create_person(const char *name, int age) {
Person *p = malloc(sizeof(Person));
p->name = malloc(strlen(name) + 1);
strcpy(p->name, name);
p->age = age;
return p;
}
تُرجع function قيمة pointer لأن الكائن موجود على heap، وليس على stack. وهذا يعني أنه يستمر بعد أن تُرجع function، ويمكن تمريره بحرية. يستخدم المستدعي ذلك كما يلي:
Person *alice = create_person("Alice", 30);
printf("%s is %d years old\n", alice->name, alice->age);
لاحظ كيف يتعامل المُنشئ مع جميع التفاصيل المعقدة: تخصيص البنية، وتخصيص مساحة للسلسلة النصية، ونسخ البيانات. يكتفي المتصل بتوفير القيم الأولية ويتلقى كائنًا جاهزًا للاستخدام. يؤدي ذلك إلى حصر منطق الإنشاء في مكان واحد، مما يجعل شيفرتك أكثر تنظيمًا وأقل عرضة للأخطاء.
التحدي
سهللنبنِ وحدة Book تستخدم نمط المُنشئ لإنشاء كائنات الكتب على الكومة. ستتدرّب على كتابة create_ function تتولى جميع عمليات Allocate وتهيئة memory، وتُعيد pointer جاهزًا للاستخدام.
ستنشئ ثلاثة ملفات:
book.h: Declare بنيةBookبعضوين:char *title(وهو pointer إلى سلسلة نصية مخصّصة dynamically) وint pages. Declare أيضًا function المُنشئcreate_bookالتي تستقبل سلسلة عنوان وعدد الصفحات، ثم تُعيد pointer إلى Book newly تم إنشاؤه. استخدم include guards مع الرمزBOOK_H.book.c: Implement functioncreate_book. يجب أن يقوم المُنشئ بـ Allocate memory لبنية Book نفسها، ثم Allocate memory منفصلة لسلسلة العنوان (remember مراعاة null terminator)، وCopy العنوان إلى memory الجديدة، وتعيين field الصفحات، ثم return الـ pointer إلى Book الجديدة.main.c: استخدم المُنشئ create_book لإنشاء كتاب وعرض information الخاصة به.
ستتلقى inputين: عنوان الكتاب (سلسلة نصية) وعدد الصفحات (عدد صحيح).
في ملف main، استخدم create_book لإنشاء كتاب جديد باستخدام القيم provided، ثم Print information الخاصة به بهذا format:
Title: {title}
Pages: {pages}على سبيل المثال، عند استخدام inputين The C Programming Language و272، سيكون الناتج:
Title: The C Programming Language
Pages: 272remember أن المُنشئ يغلف جميع منطق الإنشاء: يقدّم المستدعي القيم الأولية فحسب، ويتلقى كائنًا مهيّأً بالكامل وجاهزًا للاستخدام.
REQUIRED OUTPUT FORMAT:جرّب بنفسك
#include <stdio.h>
#include <stdlib.h>
#include "book.h"
int main() {
char title[256];
int pages;
// اقرأ الإدخال
fgets(title, sizeof(title), stdin);
// أزل سطر جديد إن وُجد
for (int i = 0; title[i]; i++) {
if (title[i] == '\n') {
title[i] = '\0';
break;
}
}
scanf("%d", &pages);
// TODO: استخدم create_book لإنشاء كتاب جديد بالقيم المقدمة
// TODO: اطبع معلومات الكتاب بالتنسيق المطلوب:
// Title: {title}
// Pages: {pages}
// TODO: لا تنسَ تحرير الذاكرة المخصصة عند الانتهاء
return 0;
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1أساسيات البرمجة التركيبية
ملفات الترويسةحواجز التضمينملفات المصدرالدوال الساكنةمراجعة: آلة حاسبة تركيبية4التغليف (Encapsulation)
مفهوم الـ Opaque Pointersتعريف الـ Opaque Structsالـ Getters والـ Settersالتحقق من البيانات في الـ Settersملخص: الصندوق السري2الكائنات والأساليب
الـ Structs ككائناتمؤشر 'Self'صحة استخدام Constالمؤشر مقابل القيمةالأساليب المساعدةملخص: Point Manager5مشروع: حساب بنكي بسيط
إعداد المشروعتنفيذ الحساب3دورة حياة الكائن
نمط المنشئ (Constructor Pattern)نمط الهادم (Destructor Pattern)تهيئة الـ Stackالنسخ العميق (Deep Copy)مراجعة: String Wrapper6الوراثة عبر التركيب
تضمين الـ Structقاعدة العضو الأولالوصول إلى أعضاء الأبعملية الـ Upcastingمراجعة: هرمية الأشكال9مشروع: رسّام الأشكال
نظرة عامة على المشروعتنفيذ الدائرةتنفيذ المستطيلاستخدام تعدد الأشكالحاوية الأشكالتدرّب بنفسك: مترجم C عبر الإنترنت