Chapter 12: Objects & Classes - How Programmers Model the World
الفصل 12: الكائنات والفئات (Objects & Classes) - كيف يُمَثِّل المبرمجون العالم
من الفوضى إلى النظام: العقلية التي غيرت البرمجة
تخيل أنك تبني تطبيقًا لإدارة المستخدمين. في البداية، الأمور بسيطة. لديك اسم المستخدم، عمره، وبريده الإلكتروني.
let userName = "Ahmed";
let userAge = 30;
let userEmail = "[email protected]";
let isAdmin = true;
الآن، ماذا لو كان لديك مستخدم ثانٍ؟ وثالث؟ ستجد نفسك تكتب userName2, userName3… فوضى عارمة. وماذا عن الوظائف المتعلقة بهم؟ دالة لطباعة معلومات المستخدم، دالة لتغيير بريده الإلكتروني… كل شيء منفصل ومبعثر.
هذه هي البرمجة في العصور المظلمة. كتابة كود بهذه الطريقة تشبه محاولة بناء سيارة عن طريق رمي قطع المحرك والإطارات والمقاعد في كومة واحدة على الأرض. قد تعمل، لكنها ستكون كارثة في الصيانة والتطوير.
هنا يأتي دور العقلية التي غيرت كل شيء: البرمجة كائنية التوجه (Object-Oriented Programming - OOP). والفكرة الجوهرية خلفها بسيطة بشكل مدهش: بدلاً من التفكير في البيانات (المتغيرات) والسلوك (الدوال) كشيئين منفصلين، لماذا لا نجمع كل ما يتعلق بـ “شيء” واحد في حاوية واحدة؟
هذه الحاوية هي ما نسميه الكائن (Object).
1. المخطط والمنتج: الفئة (Class) والكائن (Object)
لنفهم الفكرة، دعنا نستخدم مثالاً من العالم الحقيقي: صناعة السيارات.
قبل أن يصنعوا سيارة واحدة، يقوم المهندسون برسم مخطط (Blueprint). هذا المخطط يحدد كل شيء:
- الخصائص (Properties): ما هو لونها؟ كم عدد الأبواب؟ ما هو نوع المحرك؟
- الوظائف (Methods): كيف تعمل؟ (التشغيل، التسارع، التوقف).
هذا المخطط ليس سيارة. لا يمكنك قيادته. إنه مجرد فكرة، تصميم على ورق. في عالم البرمجة، هذا المخطط هو ما نسميه الفئة (Class).
الفئة هي القالب الذي نصف فيه كيف سيبدو “الشيء” الخاص بنا وكيف سيتصرف. لنقم بإنشاء فئة User:
class User:
# هذا هو المُنشئ (Constructor)، يتم استدعاؤه عند إنشاء كائن جديد
def __init__(self, name, age, email):
# هذه هي الخصائص (Properties)
self.name = name
self.age = age
self.email = email
self.is_logged_in = False
# هذه هي التوابع (Methods)
def login(self):
self.is_logged_in = True
print(f"{self.name} has logged in.")
def get_info(self):
return f"Name: {self.name}, Age: {self.age}, Email: {self.email}"
لقد أنشأنا الآن مخطط User. لم ننشئ أي مستخدم حقيقي بعد. لقد وضعنا القواعد فقط.
2. من المصنع إلى الطريق: إنشاء الكائنات (Objects)
الآن بعد أن أصبح لدينا مخطط السيارة (الفئة User)، يمكننا أن نبدأ الإنتاج في المصنع. كل سيارة ننتجها من هذا المخطط هي سيارة حقيقية ومستقلة. قد تكون واحدة حمراء، والأخرى زرقاء، لكنها جميعًا تتبع نفس التصميم الأساسي.
في البرمجة، كل “سيارة” ننتجها تسمى كائن (Object) أو نسخة (Instance) من الفئة.
لنقم بإنشاء بعض المستخدمين باستخدام فئة User التي صممناها:
# user_ahmed هو كائن (Object) من الفئة User
user_ahmed = User("Ahmed", 30, "[email protected]")
# user_fatima هو كائن آخر، مستقل تمامًا
user_fatima = User("Fatima", 25, "[email protected]")
الآن لدينا كائنان. كل واحد منهما له خصائصه الخاصة وبياناته المنفصلة، لكنهما يشتركان في نفس السلوك (التوابع). يمكننا الآن التفاعل مع هذه الكائنات:
# الوصول إلى الخصائص (Properties)
print(user_ahmed.name) # سيطبع "Ahmed"
print(user_fatima.email) # سيطبع "[email protected]"
# استدعاء التوابع (Methods)
user_ahmed.login() # سيطبع "Ahmed has logged in."
print(user_ahmed.is_logged_in) # سيطبع True
print(user_fatima.is_logged_in) # سيطبع False (لأننا لم نسجل دخولها بعد)
لاحظ كيف أصبح الكود نظيفًا ومنطقيًا. كل ما يتعلق بـ user_ahmed موجود داخل user_ahmed. لا مزيد من المتغيرات المبعثرة. هذا هو جوهر التنظيم في البرمجة الحديثة.
3. لماذا هذا مهم؟ قوة التجريد (Abstraction)
قد تقول: “يبدو هذا كثيرًا من العمل الإضافي لمجرد تنظيم بعض المتغيرات”. لكن الفائدة الحقيقية تظهر في المشاريع الكبيرة، وتتجلى في مبدأ يسمى التجريد (Abstraction).
عندما تقود سيارتك، أنت لا تفكر في كيفية عمل محرك الاحتراق الداخلي، أو كيفية نقل الطاقة عبر ناقل الحركة. أنت فقط تدير المفتاح (تستدعي تابع startEngine()) وتضغط على دواسة الوقود (تستدعي تابع accelerate()). كل التعقيد الداخلي مخفي عنك. أنت تتعامل مع واجهة بسيطة.
هذا هو التجريد. الكائنات تسمح لنا بإخفاء التفاصيل المعقدة داخلها.
عندما استخدمنا user_ahmed.login()، لم نكن بحاجة إلى معرفة كيف يتم تحديث حالة تسجيل الدخول بالضبط. هل يتم حفظها في قاعدة بيانات؟ هل يتم إرسال إشعار؟ كل هذا “مُجرَّد” بعيدًا عنا. نحن فقط نستدعي التابع، وهو يقوم بالعمل.
هذا يجعل الكود:
- أسهل في الاستخدام: المبرمجون الآخرون (أو أنت في المستقبل) يمكنهم استخدام فئاتك دون الحاجة إلى فهم كل سطر من تفاصيلها الداخلية.
- أسهل في الصيانة: إذا أردت تغيير طريقة عمل
login()(مثلاً، إضافة تسجيل للعملية)، يمكنك تغييرها داخل الفئةUserمرة واحدة فقط. كل الكائنات التي تستخدمها ستستفيد من التحديث تلقائيًا، دون الحاجة لتغيير أي كود في الأماكن التي تستدعيlogin(). - أكثر أمانًا: يمكنك حماية البيانات المهمة داخل الكائن ومنع تغييرها بطرق غير متوقعة.
التفكير بالكائنات والفئات هو نقلة نوعية. أنت لم تعد مجرد “كاتب أوامر”، بل أصبحت “مصمم أنظمة”.
4. الخلاصة: أنت الآن مهندس برمجيات
إتقان الكائنات والفئات هو الخط الفاصل بين الهاوي والمحترف. إنه ليس مجرد أسلوب كتابة كود، بل هو نموذج عقلي لحل المشاكل.
عندما تواجه مشكلة معقدة، ابدأ في تقسيمها إلى “أشياء”. ما هي الكيانات الرئيسية في نظامك؟ “مستخدم”، “منتج”، “طلب شراء”، “مقالة”؟ لكل “شيء” من هذه الأشياء، ما هي خصائصه (بياناته) وما هو سلوكه (وظائفه)؟
بمجرد أن تبدأ في التفكير بهذه الطريقة، ستجد أن بناء البرامج المعقدة يصبح أشبه بتجميع قطع الليغو. كل قطعة (كائن) مصممة جيدًا ومستقلة، وتتفاعل مع القطع الأخرى بطرق واضحة ومحددة.
لقد تجاوزت الآن مرحلة كتابة الأوامر البسيطة. لقد دخلت عالم هندسة البرمجيات (Software Engineering). أنت لا تبني أكواخًا من الطين بعد الآن؛ أنت تصمم ناطحات سحاب.
في الفصل القادم: سنتعمق في أحد أكثر المفاهيم إثارة للعقل في البرمجة، والذي يبدو كالسحر في البداية: العودية (Recursion). استعد لرؤية الدوال وهي تستدعي نفسها.