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