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) يشبه طريقة تفكيرنا الطبيعية، مما يجعل تصميم النظام أوضح.

مثال سريع:

python
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) وتحتاج لنمذجة الكيانات والعلاقات بينها.