صحة استخدام 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 أحد الحقول، فسيوقفك المترجم فورًا بدلًا من السماح للخطأ بالتسلل إلى برنامجك.
التحدي
سهللنبنِ وحدة 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 (للقراءة فقط)
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:
- initialize قيمة
Temperatureباستخدام قيمة celsius الابتدائية - Call الدالة
temp_displayلعرض درجة الحرارة الابتدائية - Call الدالة
temp_adjustلتعديل درجة الحرارة بمقدار adjustment - Call الدالة
temp_displayagain لعرض درجة الحرارة المحدّثة - اطبع تحويل 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;
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
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 عبر الإنترنت