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

الدوال الساكنة

جزء من قسم Object Oriented Programming في رحلة C على Coddy — الدرس 4 من 61.

عندما تقوم بتقسيم الكود عبر ملفات متعددة، تكون كل دالة محددة في ملف مصدر مرئية للملفات الأخرى بشكل افتراضي. ولكن في بعض الأحيان تحتاج إلى دوال مساعدة يجب استخدامها داخلياً فقط - وهي دوال لا ينبغي للملفات الأخرى الوصول إليها أو حتى معرفة وجودها.

الكلمة المفتاحية static، عند تطبيقها على دالة، تقيد نطاق رؤيتها بالملف الذي عُرّفت فيه. يؤدي هذا إلى إنشاء دالة خاصة لا يمكن استدعاؤها من ملفات المصدر الأخرى، حتى لو حاول شخص ما التصريح عنها.

// 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() مباشرة، سينتج الرابط (linker) خطأً—فالدالة ببساطة غير موجودة خارج ملفها.

هذه هي طريقة لغة C لتحقيق التغليف (encapsulation) على مستوى الملف. تسمح لك الدوال الساكنة (Static functions) بإخفاء تفاصيل التنفيذ، مما يحافظ على نظافة واجهتك العامة مع استخدام أي منطق مساعد تحتاجه داخلياً.

challenge icon

التحدي

سهل

لنقم ببناء حاسبة مسافة تستخدم دالة مساعدة خاصة لحساب مربع الرقم—وهو تفصيل يجب أن يظل مخفياً عن بقية برنامجك.

ستقوم بإنشاء ثلاثة ملفات:

  • distance.h: ملف الرأس الخاص بك الذي يعلن عن دالة عامة واحدة distance_squared تأخذ أربعة أعداد صحيحة (x1, y1, x2, y2) تمثل نقطتين وتعيد عدداً صحيحاً. قم بتضمين حراس التضمين (guards) باستخدام الرمز DISTANCE_H.
  • distance.c: ملف المصدر الخاص بك الذي يحتوي على التنفيذ. قم بإنشاء دالة مساعدة static تسمى square تأخذ عدداً صحيحاً وتعيد مربعه. يجب أن تكون هذه الدالة المساعدة مرئية فقط داخل distance.c. ثم قم بتنفيذ distance_squared باستخدام دالتك المساعدة الستاتيكية لحساب (x2-x1)² + (y2-y1)².
  • main.c: ملفك الرئيسي الذي يتضمن ملف الرأس ويستخدم الدالة العامة. يجب ألا تكون الدالة المساعدة square قابلة للوصول هنا—فقط distance_squared هي المتاحة.

تقوم الدالة distance_squared بحساب مربع المسافة الإقليدية بين نقطتين. من خلال إبقاء الدالة square ستاتيكية، فإنك تخفي تفاصيل التنفيذ هذه عن أي كود خارج distance.c.

ستتلقى أربعة مدخلات من الأعداد الصحيحة: x1، و y1، و x2، و y2.

اطبع مربع المسافة بهذا التنسيق:

Squared distance: {result}

على سبيل المثال، مع النقطتين (0, 0) و (3, 4)، سيكون الناتج:

Squared distance: 25

ورقة مرجعية

تقيد الكلمة المفتاحية static رؤية الدالة في الملف الذي تم تعريفها فيه، مما يؤدي إلى إنشاء دالة خاصة لا يمكن استدعاؤها من ملفات مصدر أخرى.

// مساعد خاص - مرئي فقط في هذا الملف
static int square(int x) {
    return x * x;
}

// دالة عامة - يمكن استدعاؤها من ملفات أخرى
int sum_of_squares(int a, int b) {
    return square(a) + square(b);
}

توفر الدوال الساكنة (Static functions) تغليفاً على مستوى الملف، مما يسمح لك بإخفاء تفاصيل التنفيذ مع الحفاظ على نظافة الواجهة العامة الخاصة بك.

جرّب بنفسك

#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 باستخدام إحداثيات المدخلات
    // واطبع النتيجة بالتنسيق التالي: "Squared distance: {result}"
    
    return 0;
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Object Oriented Programming