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

صحة استخدام Const

جزء من قسم البرمجة كائنية التوجه في رحلة C على Coddy. الدرس 8 من 61.

عند كتابة دوال تعمل كأساليب، ينبغي لبعضها تعديل الكائن (مثل player_take_damage)، بينما ينبغي لبعضها الآخر قراءة البيانات فقط دون تغيير أي شيء. تتيح لك الكلمة المفتاحية const فرض هذا التمييز على مستوى المصرّف.

بتمييز مُعامل pointer على أنه const، فإنك تتعهد بأن function لن تُعدّل البيانات التي يشير إليها. إذا حاولتَ عن طريق الخطأ تغيير member، فسيُصدر المترجم خطأً:

typedef struct {
    int x;
    int y;
} Point;

// هذه الدالة يمكنها فقط قراءة النقطة
void point_print(const Point *self) {
    printf("(%d, %d)\n", self->x, self->y);
    // self->x = 10;  // ERROR: لا يمكن التعديل من خلال مؤشر const
}

// هذه الدالة يمكنها تعديل النقطة
void point_move(Point *self, int dx, int dy) {
    self->x += dx;
    self->y += dy;
}

تُخبر وسيطة const Point *self كلًّا من المصرّف والمبرمجين الآخرين بأن point_print عملية «getter» أو عملية للقراءة فقط. ويُسمّى هذا التوافق مع const: استخدام const كلما لم تكن هناك حاجة إلى التعديل.

تساعد هذه الممارسة على اكتشاف الأخطاء مبكرًا. إذا كتبتَ display function وقمتَ عن طريق الخطأ بـ modify أحد الحقول، فسيوقفك المترجم فورًا بدلًا من السماح للخطأ بالتسلل إلى برنامجك.

challenge icon

التحدي

سهل

لنبنِ وحدة Temperature تخزّن قيمة درجة حرارة وتوفر عمليات للقراءة فقط وأخرى للتعديل. سيساعدك هذا على ممارسة استخدام مؤشرات const للتمييز بوضوح بين الدوال التي تقرأ data فقط وتلك التي تغيّرها.

ستنشئ ثلاثة ملفات:

  • temperature.h: Declare بنية Temperature تحتوي على member واحد من النوع double celsius. Declare أيضًا ثلاث دوال:
    • temp_display: تستقبل مؤشر const إلى Temperature وتطبع درجة الحرارة الحالية (للقراءة فقط)
    • temp_adjust: تستقبل مؤشرًا عاديًا إلى Temperature وقيمة double باسم amount، ثم تضيف amount إلى celsius (modifying)
    • temp_to_fahrenheit: تستقبل مؤشر const إلى Temperature وتعيد القيمة المحوّلة إلى Fahrenheit (للقراءة فقط)
    استخدم حواجز include بالرمز TEMPERATURE_H.
  • temperature.c: Implement الدوال الثلاث جميعها. يجب أن تطبع الدالة temp_display بالتنسيق Current: {celsius}C. ويجب أن تعيد الدالة temp_to_fahrenheit القيمة celsius * 9.0 / 5.0 + 32.0. تذكّر أن الدوال التي تستخدم مؤشرات const لا يمكنها تعديل data الخاصة بالبنية.
  • main.c: أنشئ Temperature، ونفّذ العمليات، واعرض النتائج.

ستتلقى مدخلين: قيمة celsius الابتدائية (من النوع double) وقيمة adjustment (من النوع double).

في ملف main:

  1. initialize قيمة Temperature باستخدام قيمة celsius الابتدائية
  2. Call الدالة temp_display لعرض درجة الحرارة الابتدائية
  3. Call الدالة temp_adjust لتعديل درجة الحرارة بمقدار adjustment
  4. Call الدالة temp_display again لعرض درجة الحرارة المحدّثة
  5. اطبع تحويل Fahrenheit باستخدام temp_to_fahrenheit

اطبع النتائج بهذا التنسيق:

Current: {celsius}C
Current: {celsius}C
Fahrenheit: {fahrenheit}F

استخدم %.1f لجميع قيم درجات الحرارة لعرض منزلة عشرية واحدة.

على سبيل المثال، باستخدام قيمة ابتدائية 20.0 وadjustment بقيمة 5.0، سيكون الناتج:

Current: 20.0C
Current: 25.0C
Fahrenheit: 77.0F

جرّب بنفسك

#include <stdio.h>
#include "temperature.h"

int main() {
    double initial_celsius, adjustment;
    scanf("%lf", &initial_celsius);
    scanf("%lf", &adjustment);
    
    // TODO: أنشئ هيكل Temperature وقم بتهيئته بـ initial_celsius
    
    // TODO: استدعِ temp_display لعرض درجة الحرارة الابتدائية
    
    // TODO: استدعِ temp_adjust لتعديل درجة الحرارة بمقدار adjustment
    
    // TODO: استدعِ temp_display مرة أخرى لعرض درجة الحرارة المحدّثة
    
    // TODO: اطبع تحويل الفهرنهايت باستخدام temp_to_fahrenheit
    // التنسيق: "Fahrenheit: %.1fF\n"
    
    return 0;
}
quiz iconاختبر نفسك

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

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم C عبر الإنترنت