الأصناف والكائنات
حتى الآن تعلمنا كيف نستخدم أنواع البيانات المُدمجة في روبي مثل الأرقام والنصوص والمصفوفات. لكن ماذا لو أردنا إنشاء أنواع بيانات خاصة بنا؟ هنا تأتي البرمجة الكائنية (Object-Oriented Programming)!
ما هي البرمجة الكائنية؟
البرمجة الكائنية هي أسلوب برمجي يُنظّم الشيفرة حول الكائنات بدلاً من الدوال فقط. الكائن يجمع بين:
- البيانات (الخصائص/الصفات)
- السلوكيات (الدوال/الأفعال)
مثال من الحياة الواقعية
فكّر في سيارة:
- الخصائص: اللون، الماركة، السرعة القصوى، عدد الأبواب
- السلوكيات: تشغيل، إيقاف، تسريع، فرملة
في البرمجة الكائنية، نُنشئ "قالباً" (الصنف) يصف السيارة، ثم نُنشئ "نسخاً" (كائنات) منه.
كل شيء في روبي كائن!
في روبي، كل شيء هو كائن:
ما هو الصنف (Class)؟
الصنف هو قالب أو مُخطط يصف:
- ما هي البيانات التي سيحتويها الكائن
- ما هي السلوكيات التي يمكن للكائن القيام بها
فكّر في الصنف كـ وصفة طبخ والكائن كـ الطبق الناتج.
إنشاء صنف بسيط
ملاحظات:
- اسم الصنف يبدأ بحرف كبير (CamelCase)
- نستخدم
classلتعريف الصنف - نستخدم
endلإغلاقه
إنشاء كائن من الصنف
متغيرات النسخة (Instance Variables)
متغيرات النسخة تُخزّن البيانات الخاصة بكل كائن. تبدأ بـ @:
ملاحظات مهمة:
@nameخاص بكل كائن (كل شخص له اسمه الخاص)- متغيرات النسخة تبقى محفوظة طوال حياة الكائن
- لا يمكن الوصول لها مباشرة من خارج الكائن
دوال النسخة (Instance Methods)
الدوال المُعرّفة داخل الصنف تُسمى دوال النسخة. كل كائن يمكنه استدعاءها:
مثال شامل: صنف الطالب
الفرق بين الصنف والكائن
| الصنف (Class) | الكائن (Object) |
|---|---|
| قالب/مُخطط | نسخة من القالب |
| يُعرّف الخصائص والسلوكيات | يحتوي على قيم فعلية |
| واحد فقط | يمكن إنشاء عدد غير محدود |
| لا يُخزّن بيانات | يُخزّن بياناته الخاصة |
class Person | person1 = Person.new |
لماذا نستخدم الأصناف؟
1. التنظيم
بدلاً من متغيرات منفصلة:
مع الأصناف:
2. إعادة الاستخدام
الصنف يُكتب مرة ويُستخدم عدة مرات:
3. الكبسلة (Encapsulation)
إخفاء التفاصيل الداخلية:
أمثلة عملية
مثال 1: صنف الكتاب
مثال 2: صنف المنتج
مثال 3: صنف اللاعب
أخطاء شائعة
1. نسيان @ لمتغيرات النسخة
2. استدعاء دالة على الصنف بدل الكائن
3. نسيان new عند إنشاء الكائن
4. محاولة الوصول لمتغير النسخة مباشرة
جدول ملخص
| المفهوم | الوصف | مثال |
|---|---|---|
| الصنف | قالب لإنشاء كائنات | class Person; end |
| الكائن | نسخة من الصنف | person = Person.new |
| متغير النسخة | بيانات خاصة بالكائن | @name = "أحمد" |
| دالة النسخة | سلوك الكائن | def greet; end |
| new | إنشاء كائن جديد | Person.new |
| class | معرفة نوع الكائن | obj.class |
تمرين: إنشاء صنف Person
حان وقت التطبيق! في محرر الشيفرة على اليسار:
المطلوب:
- أنشئ صنف
Personيحتوي على:- دالة
set_infoتستقبلnameوage - دالة
get_nameتُرجع الاسم - دالة
get_ageتُرجع العمر - دالة
introduceتطبع: "مرحباً، أنا [الاسم] وعمري [العمر] سنة"
- دالة
- أنشئ كائناً وعيّن له اسم "فاطمة" وعمر 25
- استدعِ دالة
introduce
الناتج المتوقع:
تلميحات:
- ابدأ بـ
class Personوأغلق بـend - استخدم
@nameو@ageلتخزين البيانات - استخدم دمج المتغيرات في
introduce:puts "مرحباً، أنا #{@name} وعمري #{@age} سنة" - لا تنسَ
Person.newلإنشاء الكائن
تذكّر: الصنف هو القالب والكائن هو النسخة. متغيرات النسخة (
@) تُخزّن بيانات كل كائن بشكل مستقل. في الدرس القادم سنتعلم طريقة أسهل لتعيين البيانات باستخدامinitializeوالموصّلات!