الأساليب المساعدة
جزء من قسم البرمجة كائنية التوجه في رحلة C على Coddy. الدرس 10 من 61.
حتى الآن، رأينا دوالًا تعدّل بيانات البنية (مثل player_take_damage) ودوالًا تعرضها ببساطة. لكن هناك فئة مهمة أخرى: دوال تحسب قيمًا مشتقة من أعضاء البنية من دون تغيير أي شيء.
لنفترض بنية Rectangle تخزّن العرض والارتفاع. المساحة غير مخزّنة، بل يتم حسابها عند الطلب:
typedef struct {
double width;
double height;
} Rectangle;
double rectangle_area(const Rectangle *self) {
return self->width * self->height;
}
double rectangle_perimeter(const Rectangle *self) {
return 2 * (self->width + self->height);
}
هذه هي helper methods. تأخذ البيانات الموجودة في البنية وتنتج قيمة جديدة. لاحظ أنها تستخدم مؤشرات const لأنها تقرأ فقط ولا تكتب مطلقًا. تُعاد النتيجة المحسوبة بدلًا من تخزينها في البنية.
Rectangle box = {5.0, 3.0};
printf("Area: %.1f\n", rectangle_area(&box)); // 15.0
printf("Perimeter: %.1f\n", rectangle_perimeter(&box)); // 16.0
يحافظ هذا النمط على هياكلك بسيطة: خزّن البيانات الأساسية فقط، واحسب كل شيء آخر عند الحاجة. كما يضمن أن تكون القيم المشتقة متسقة دائمًا مع الحالة الحالية.
التحدي
سهللنبنِ وحدة Circle تحسب القيم المشتقة من البيانات المخزنة. ستتدرّب على كتابة helper methods: وهي دوال تحسب results من أعضاء البنية دون تعديلها.
ستنشئ ثلاثة ملفات:
circle.h: أعلن عن بنيةCircleتحتوي على عضو واحد هوdouble radius. أعلن أيضًا عن طريقتيhelper:circle_area: تستقبل مؤشرًا من النوعconstإلى Circle وتُرجعareacircle_circumference: تستقبل مؤشرًا من النوعconstإلى Circle وتُرجعcircumference
CIRCLE_H.circle.c: Implement طريقتيhelper. بالنسبة إلى الحسابات، استخدم3.14159كقيمة للعدد pi. صيغةareaهيpi * radius * radius، وصيغةcircumferenceهي2 * pi * radius. يجب أن تقرأ كلتا الدالتينradiusفقط: لا تعدّله أبدًا.main.c: أنشئ Circle واستخدم طريقتيhelperلحساب خصائصه وعرضها.
ستتلقى مُدخلًا واحدًا: radius للدائرة (من النوع double).
في ملفك الرئيسي، هيّئ Circle باستخدام radius المُعطى، ثم استخدم طريقتي helper لحساب area وcircumference وطباعتهما.
اطبع results بهذا التنسيق:
Area: {area}
Circumference: {circumference}استخدم %.2f لكلتا القيمتين لعرض منزلتين عشريتين.
على سبيل المثال، عند استخدام radius بقيمة 5.0، سيكون الناتج:
Area: 78.54
Circumference: 31.42جرّب بنفسك
#include <stdio.h>
#include "circle.h"
int main() {
double radius;
scanf("%lf", &radius);
// TODO: أنشئ Circle struct بالنصف القطر المعطى
// TODO: Use circle_area and circle_circumference helper methods
// لحساب وطباعة النتائج
// تنسيق الطباعة:
// printf("Area: %.2f\n", ...);
// printf("Circumference: %.2f\n", ...);
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 عبر الإنترنت