What is OOP and Why?
Object-Oriented Programming (OOP) هي نمط برمجي ينظّم الكود حول الكائنات (objects) — وهي حزم تجمع بين البيانات (الخصائص) والسلوك (الدوال) — بدلاً من تنظيمه حول الدوال والمنطق فقط.
الأعمدة الأساسية (Core Pillars):
-
Encapsulation (التغليف) — Bundle data and the methods that operate on it, hiding internal state behind a controlled interface. بالعربي: تجميع البيانات مع الدوال التي تعمل عليها، وإخفاء الحالة الداخلية خلف واجهة محكومة، بحيث لا يصل أحد للبيانات إلا من خلال طرق محددة.
-
Abstraction (التجريد) — Expose only what's necessary, hiding complex implementation details. بالعربي: إظهار ما هو ضروري فقط للمستخدم، وإخفاء تفاصيل التنفيذ المعقّدة. مثل قيادة السيارة دون الحاجة لمعرفة كيف يعمل المحرك داخلياً.
-
Inheritance (الوراثة) — Derive new classes from existing ones, reusing and extending behavior. بالعربي: اشتقاق أصناف (classes) جديدة من أصناف موجودة، فترث خصائصها وسلوكها مع إمكانية التوسعة، مما يوفّر إعادة كتابة الكود.
-
Polymorphism (تعدد الأشكال) — Let different types respond to the same interface in their own way. بالعربي: السماح لأنواع مختلفة بالاستجابة لنفس الاستدعاء كلٌّ بطريقته الخاصة، كما في المثال حيث
speak()تعطي نتيجة مختلفة للكلب والقطة.
لماذا نستخدمها (Why):
-
Modularity (التجزئة) — Self-contained objects are easier to develop, test, and debug in isolation. بالعربي: الكائنات المستقلة أسهل في التطوير والاختبار وإصلاح الأخطاء كلٌّ على حدة.
-
Reusability (إعادة الاستخدام) — Inheritance and composition let you reuse code instead of rewriting it. بالعربي: الوراثة والتركيب يتيحان إعادة استخدام الكود بدل إعادة كتابته من الصفر.
-
Maintainability (سهولة الصيانة) — Changes to one object's internals don't ripple outward if the interface stays stable. بالعربي: تعديل داخل كائن معيّن لا يؤثر على بقية النظام طالما بقيت الواجهة ثابتة.
-
Models reality (محاكاة الواقع) — Mapping problems to objects often mirrors how we naturally think about domains. بالعربي: تمثيل المشكلة على شكل كائنات (مثل
UserأوBankAccountأوCar) يشبه طريقة تفكيرنا الطبيعية، مما يجعل تصميم النظام أوضح.
مثال سريع:
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
raise NotImplementedError
class Dog(Animal):
def speak(self):
return f"{self.name} says Woof"
class Cat(Animal):
def speak(self):
return f"{self.name} says Meow"
for a in [Dog("Rex"), Cat("Mia")]:
print(a.speak()) # نفس الاستدعاء، سلوك مختلف ← polymorphism
ملاحظة: OOP ليست دائماً الخيار الأفضل — الأنماط الوظيفية (functional) أو الإجرائية (procedural) قد تكون أنظف في بعض المسائل — لكنها تتألق في الأنظمة الكبيرة التي تحتوي على حالة (state) وتحتاج لنمذجة الكيانات والعلاقات بينها.