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