Skip to Content

DDD .. OOP

## 💻 البرمجة الشيئية (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


Odoo ERP