## 💻 البرمجة الشيئية (Object-Oriented Programming - OOP)
0799455189
**تعريف:**
**OOP** هي **نموذج برمجة** (Programming Paradigm) يركز على تنظيم الكود حول **الكائنات (Objects)** بدلاً من الوظائف والإجراءات. يتم تصميم الكائنات لتمثل الكيانات الموجودة في العالم الحقيقي، حيث يجمع كل كائن بين **البيانات (Data)** و**السلوك (Behavior/Methods)** الذي يعمل على هذه البيانات.
### 🔑 أهم المصطلحات والمفاهيم (الأركان الأربعة لـ OOP)
* **1. التغليف (Encapsulation):** هو دمج البيانات والوظائف (الخصائص والطرق) ضمن وحدة واحدة تُسمى **الفئة (Class)**، مع إخفاء التفاصيل الداخلية للكائن وحماية البيانات من الوصول أو التعديل الخارجي المباشر. يتم الوصول إليها فقط عبر الواجهات (الطرق العامة) المحددة للكائن.
* **2. التجريد (Abstraction):** هو إظهار المعلومات الضرورية فقط للمستخدم (المطور الآخر) وإخفاء التفاصيل التنفيذية المعقدة. يسمح للمطور بالتركيز على **ماذا** يفعل الكائن بدلاً من **كيف** يفعله.
* **3. الوراثة (Inheritance):** هي آلية تسمح لفئة جديدة (الفئة المشتقة/الفرعية) باكتساب خصائص وسلوكيات فئة موجودة (الفئة الأساسية/الأصل). يسهل هذا **إعادة استخدام الكود (Reusability)** ويُنشئ علاقة "هو نوع من" (is-a) بين الفئات.
* **4. تعدد الأشكال (Polymorphism):** يعني "أشكال متعددة". يسمح للكائنات من فئات مختلفة بالاستجابة لنفس الرسالة أو استدعاء نفس الطريقة (Method) بطرق مختلفة، مما يزيد من مرونة الكود.
### 💡 مثال توضيحي: OOP
تصميم نظام لأشكال هندسية.
| المفهوم | مثال التوضيح |
| :--- | :--- |
| **الفئة (Class)** | `Shape` (الشكل)، `Circle` (الدائرة)، `Rectangle` (المستطيل). |
| **الكائن (Object)** | دائرة معينة بنصف قطر 5، مستطيل بأبعاد 10x20. |
| **الوراثة** | فئة `Circle` ترث من فئة `Shape`، لتكتسب طريقة `calculate_area()`. |
| **تعدد الأشكال** | كل من `Circle` و `Rectangle` يطبق طريقة `calculate_area()`، ولكن بطريقة حساب مختلفة تتناسب مع شكلهما. |
---
## 🧱 التصميم الموجه بالمجال (Domain-Driven Design - DDD)
**تعريف:**
**DDD** هي **منهجية معمارية وتصميم (Architectural and Design Approach)** تركز على ربط وتنظيم تطوير البرمجيات بشكل وثيق مع **مجال العمل (Business Domain)** المعقد ومتطلباته. يهدف إلى إنشاء نموذج برمجي (Domain Model) يعكس بدقة العمليات والمفاهيم الحقيقية للمجال، بالتعاون الوثيق مع **خبراء المجال (Domain Experts)**.
### 🔑 أهم المصطلحات والمفاهيم
| المصطلح | التعريف |
| :--- | :--- |
| **المجال (Domain)** | منطقة المشكلة أو الأعمال المحددة التي يهدف البرنامج إلى حلها (مثل: التجارة الإلكترونية، نظام مصرفي، إدارة المخزون). |
| **اللغة الشاملة (Ubiquitous Language)** | لغة مشتركة وواضحة ومتفق عليها بين المطورين وخبراء المجال، وتُستخدم بشكل ثابت في كل من الكود والمحادثات والوثائق. |
| **السياق المحدود (Bounded Context)** | جزء منطقي ومحدد من المجال حيث يكون نموذج المجال الخاص به (واللغة الشاملة المرتبطة به) صحيحًا ومتسقًا. يهدف إلى تجزئة الأنظمة المعقدة (مثل: سياق الطلبات، سياق العملاء). |
| **الكيان (Entity)** | كائن في نموذج المجال يتم تعريفه من خلال **هويته الفريدة (Unique Identity)** وليس بخصائصه. يبقى الكيان هو نفسه حتى لو تغيرت خصائصه (مثل: `Customer` برقم تعريف عميل ثابت). |
| **كائن القيمة (Value Object)** | كائن يُعرّف بخصائصه ولا يمتلك هوية فريدة. إذا كانت قيم جميع خصائصه متطابقة مع كائن قيمة آخر، فإنهما يعتبران متساويين وقابلين للاستبدال (مثل: `Address` العنوان، أو `Money` مبلغ مالي). |
| **التجميع (Aggregate)** | مجموعة من الكيانات وكائنات القيمة المرتبطة ببعضها والتي يتم التعامل معها كوحدة واحدة للحفاظ على **اتساق البيانات (Data Consistency)**. يتم الوصول إليه دائمًا عبر كيان واحد يُسمى **جذر التجميع (Aggregate Root)**. |
---
## ⚖️ الفروق الجوهرية: DDD مقابل OOP
الفرق الأساسي هو في **مستوى التركيز** والهدف:
| الميزة | DDD (التصميم الموجه بالمجال) | OOP (البرمجة الشيئية) |
| :--- | :--- | :--- |
| **المستوى** | **منهجية معمارية وتصميم** رفيعة المستوى. | **نموذج برمجة** منخفض المستوى. |
| **التركيز الأساسي** | **مجال العمل ومتطلباته**؛ بناء نموذج يعكس الواقع العملي. | **تنظيم الكود**؛ تجميع البيانات والسلوك في كائنات. |
| **الهدف الرئيسي** | إدارة التعقيد في الأنظمة الكبيرة والمعقدة لتمثل أعمالاً حقيقية. | تحسين جودة الكود من حيث إعادة الاستخدام والصيانة والمرونة. |
| **العلاقة** | **يمكن استخدام OOP كأداة لتطبيق DDD.** غالبًا ما يتم استخدام الفئات (Classes) والكائنات (Objects) في OOP لتكوين الكيانات (Entities) وكائنات القيمة (Value Objects) والتجميعات (Aggregates) في DDD. | يمكن استخدامها في أي مجال، حتى بدون التركيز على نموذج مجال معقد. |
**باختصار:** DDD هو الإطار الاستراتيجي الذي يحدد **ماذا** يجب أن يكون الكود، بينما OOP هو الأداة التكتيكية التي تساعد في تحديد **كيف** يتم بناء هذا الكود بشكل منظم.
### 💡 مثال يوضح كيفية الاستخدام المشترك
لنأخذ مثالاً لنظام حجز رحلات الطيران:
* **منظور DDD (التصميم الاستراتيجي):**
* نحدد **السياقات المحدودة**: `BookingContext` (سياق الحجز)، `FlightContext` (سياق الرحلات)، `PaymentContext` (سياق الدفع).
* نحدد **اللغة الشاملة**: `FlightNumber`, `Passenger`, `Reservation`, `Ticket`.
* في `BookingContext`، نحدد **التجميع** الذي يمثله كيان `Reservation` ليكون **جذر التجميع (Aggregate Root)**، ويحتوي على قائمة من كيانات `Passenger` وكائن قيمة `PaymentDetails`.
* **منظور OOP (التصميم التكتيكي داخل السياق):**
* نقوم بإنشاء **فئات (Classes)** لتمثيل هذه المفاهيم.
* `class Reservation`: تستخدم مبدأ **التغليف** لإخفاء آلية تغيير حالتها (مثل: من "معلق" إلى "مؤكد") وتوفير طرق عامة مثل `Confirm()` و `Cancel()`.
* `class Address` (عنوان): ننشئها كـ **كائن قيمة (Value Object)** باستخدام OOP، حيث لا تحتاج إلى هوية فريدة وتُعرف بمحتواها (الشارع، المدينة، الرمز البريدي).
* `class Passenger` (مسافر): ننشئها كـ **كيان (Entity)** باستخدام OOP، حيث تحتوي على هوية فريدة (رقم جواز السفر/الهوية) وتستخدم **الوراثة** إذا كان هناك أنواع مختلفة من الركاب (مثل: `ChildPassenger` يرث من `Passenger`).
0799455189