الدوال الساكنة
جزء من قسم البرمجة كائنية التوجه في رحلة C على Coddy. الدرس 4 من 61.
عندما تقسّم الشيفرة عبر عدة files، تكون كل function معرَّفة في source file مرئيةً لـ other files افتراضيًا. لكن أحيانًا تحتاج إلى helper function ينبغي استخدامها only داخليًا: function لا ينبغي لـ other files الوصول إليها أو حتى معرفة وجودها.
الكلمة المفتاحية static، عند تطبيقها على function، تقيّد إمكانية رؤيتها إلى file الذي عُرّفت فيه. ينشئ هذا function خاصة لا يمكن استخدام called عليها من source files أخرى، حتى إذا حاول شخص ما استخدام Declare لها.
// math_utils.c
#include "math_utils.h"
// مساعد خاص - مرئي فقط في هذا الملف
static int square(int x) {
return x * x;
}
// دالة عامة - يمكن استدعاؤها من main.c
int sum_of_squares(int a, int b) {
return square(a) + square(b);
}
في هذا المثال، تم التصريح عن sum_of_squares في الترويسة، ويمكن استخدامها في أي مكان. أما square فهي موسومة بـ static، ولذلك لا توجد إلا داخل math_utils.c. إذا حاولت main.c استدعاء square() مباشرةً، فسيُصدر الرابط خطأً: فالدالة ببساطة لا وجود لها خارج ملفها.
هذه هي طريقة C لتحقيق التغليف على مستوى file. تتيح لك الدوال static إخفاء تفاصيل التنفيذ، مع الحفاظ على Public interface نظيفًا أثناء استخدام أي منطق helper تحتاج إليه داخليًا.
التحدي
سهللنبنِ حاسبة مسافة تستخدم دالة مساعدة Private لحساب مربع عدد: وهي تفصيل ينبغي أن يظل مخفيًا عن بقية برنامجك.
ستنشئ أربعة ملفات:
distance.h: ملف الترويسة الذي يعلن عن دالة Public واحدة هيdistance_squared، والتي تأخذ أربعة أعداد صحيحة (x1, y1, x2, y2) تمثل نقطتين وتُرجع عددًا صحيحًا. استخدم حواجز التضمين بالرمزDISTANCE_H.distance.c: ملف المصدر الذي يحتوي على التنفيذ. أنشئ دالة مساعدةstaticتُسمىsquare، وتأخذ عددًا صحيحًا وتُرجع مربعه. يجب أن تكون هذه الدالة المساعدة مرئية only داخلdistance.c. ثم Implement الدالةdistance_squaredusing دالتك المساعدة static لحساب (x2-x1)² + (y2-y1)².main.c: ملف main الذي يضمّن الترويسة ويستخدم الدالة Public. يجب ألا تكون الدالة المساعدةsquareقابلة للوصول هنا؛ إذ إنdistance_squaredفقط هي المتاحة.
تحسب الدالة distance_squared مربع المسافة الإقليدية بين نقطتين. ومن خلال إبقاء الدالة square static، فإنك تخفي تفصيل التنفيذ هذا عن أي كود خارج distance.c.
ستتلقى أربعة مدخلات من نوع integer: x1 وy1 وx2 وy2.
اطبع مربع المسافة بهذا التنسيق:
Squared distance: {result}على سبيل المثال، بالنسبة إلى النقطتين (0, 0) و(3, 4)، سيكون الناتج:
Squared distance: 25جرّب بنفسك
#include <stdio.h>
#include "distance.h"
int main() {
int x1, y1, x2, y2;
scanf("%d", &x1);
scanf("%d", &y1);
scanf("%d", &x2);
scanf("%d", &y2);
// TODO: استدعِ distance_squared مع إحداثيات الإدخال
// and print the result in the format: "Squared distance: {result}"
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 عبر الإنترنت