الخلاصة : إعادة ترتيب الكود وفصل الدومين عن البنية التحتية

أحمد رمضان

. 2 د قراءة

الاول لو عاوز تعرف الفرق بين 

و لو عاوز تعرف الفرق بين

- Core Code

- Infrastructure Code


خش هناا



البداية: المشكلة القديمة

في الأول، الكود كان كله Mixed بين الدومين والداتا.

مثال: كود Controller بيعمل حاجتين مع بعض:

يحسب قواعد البزنس (Business Rules) زي total price أو quantity
ويعمل SQL مباشرة ويخزن في قاعدة البيانات

ده غلط لأنه

Core code: اللي بيعبر عن الدومين (Business Logic)
Infrastructure code: اللي بيتعامل مع الداتابيز أو أي نظام خارجي
لما الكود كله متخلط، يبقى صعب نفهمه، صعب نعمل عليه Unit Test، وصعب نغير أي حاجة من غير ما نكسر حاجات تانية.



2 كمل المقدمة من هنا 

-----------------------------------------------------------------------------------------

الخطوة الأولى: Table Gateway


إدخال Table Gateway

ده حل وسط بين الكود القديم والفصل الحقيقي،

بحيث:

الكود لسه مربوط بالداتا
بس حاولنا نفصل شوية عن الدومين

يعني 

فصلنا الـ DB access من الـ Controller
لسه فيه coupling مع DB
لسه الكود مرتبط بـ PDO أو ORM

يعني المشكلة: الكود لسه مربوط بـ relational DB وده مش مثالي.

-----------------------------------------------------------------------------------------


الحل الحقيقي: Entity + Repository + Value Object


بعد كده استخدمنا Entity و Repository

الـ Entity بس بتحكي حكاية البزنس
Rules + Behavior + Invariants جوه الكائن
مفيش أي ذكر لـ DB أو ORM
يمكن تعمل new Order(...) من غير DB



Repository Interface

مجرد واجهة (Interface) مفيهاش DB أو Framework، بس بتحدد طرق التعامل مع Entity، زي save() أو getById().
Interface = مجرد Abstract
أي كود Client يتعامل مع Repository مش مع DB مباشرة

يسمح لنا نفصل Core عن Infrastructure
EntityManagerInterface = Doctrine ORM

Core code (Entity) مش مربوط بالـ DB، بيشتغل لوحده



Repository Implementation

هو اللي بيتعامل فعليًا مع DB أو أي نظام خارجي، بيطبق الواجهة.
الـ Repository بيعمل كل حاجة مرتبطة بـ DB

👈 الـ Entity مش عارف حاجة عن DB
👈لو غيرت DB → تعدّل Repository بس

الدومين = Safe & Testable




Value Object للـ ID

الـ OrderId بيغلف الـ ID
بيخلي الـ Entity ما تهتمش بالداتابيز
أي تغيير في طريقة التخزين = ما يلمسش الدومين
علشان الكائن يبقى متكامل ومايحصلش مشاكل لو اتكرر ID
علشان الكائن يشتغل Consistently حتى من غير DB
كائن نفسه مسؤول عن حماية الهوية، مش DB أو Repository




الفرق بين Active Record و Data Mapper في كود واحد


ليه Data Mapper أفضل للـ Domain Model؟

Core مفصول عن Infrastructure
Unit Testing حقيقي بدون DB
الدومين يحمي نفسه
أي تغييرات في ORM أو DB = Repository بس بيتعدل




مقالات ذات صلة

المزيد من أحمد رمضان