الكلاس اللي بيعمل كل حاجة

أحمد رمضان

. 4 د قراءة

Advanced Web Application Architecture

Chapter: The Domain Model

– Active Record versus Data Mapper (2.8)

أولًا: نبذة سريعة عن اللي فات (نرجّعك على السكة ي صديقي)


إحنا طول الفصول اللي فاتت كنا ماشيين على Pattern واضح جدًا اسمه 

Data Mapper

يعني إي 

يعني عندي الEntity (زي Order) الObject ده دومين خالص

بمعني 

انه مالوش أي علاقة مباشرة بالداتابيز لو حبيت أخزنه ميمسكش في DB و ميعرفش SQL و ميعرفش ORM

يبعته لمين؟

للRepository
الـ Repository يعمل اي بقا يطلع الداتا و يروح يعمل SQL و يتعامل هوه مع الداتابيز


ملاحظة مهمة حصلت قبل كده (ونقفلها صح)

إحنا قبل كده طلعنا OrderId خليناه Value Object وخلينا الـ Order يتخلق كامل حتى بالـ ID

لكن لما خرجنا برّه الدومين واضطرينا نحط الـ ID في session

اضطرّينا نحوله من OrderId لـ string و ده صح

ليه؟

لأن Session = Infrastructure والدومين ما يطلعش برّه غير Primitive Types كده ملف الـ ID اتقفل صح والدنيا بقت نضيفة.


ثانيًا: يعني إيه Mapping؟ 

إحنا قلنا قبل كده Mapping = Mapping entity data to table columns

يعني

تحويل بيانات الـ Entity من Object
لشكل مناسب للداتابيز (Array / Rows)

ليه؟

الدومين بيتكلم Object و الداتابيز بتفهم Rows
أنا كلمت البزنس بلغته
دلوقتي محتاج أكلم الداتابيز بلغتها
وده بالظبط دور الـ Data Mapper.


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

خلصنا مراجعة سريعا تعالي بقا 


Active Record يعني إيه؟


العنوان هنا مهم جدًا لأنه

مش مقارنة Frameworks دي عبارة عن مقارنة فلسفة تصميم

يعني إيه Active Record؟

Active Record = فلسفة مختلفة تمامًا عن Data Mapper
الفكرة ببساطة الـ Entity نفسها تخزّن نفسها تحذف نفسها تجيب نفسها من الداتابيز

يعني الـ Order

👈 order->save
👈 order->delete
👈 Order::find(1)

الـ Object هنا نشِط

مش مستني Repository مش غلبان بيعرف يعمل كل حاجة وعلشان كده اسمه Active Record



تعالي نشوف مثال 


Order ورثت من كلاس Framework الclass ده مديها Super Powers

و هنا نقدر نقول انك مجبر تعتمد على


class خارجي أو framework أو ORM علشان الـ Entity تشتغل أصلًا.


طب تعالي نستخدمه

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

وده بالظبط اللي بيحصل في Laravel Eloquent

وعشان كده Laravel بيقول Model مش Entity.

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


طب ليه Laravel Model مش Entity و ليه Spring Boot يقول Entity؟

Laravel

👈  Model = Active Record
👈  DB-first
👈  CRUD-first
👈  الـ ORM جوّه الموديل

Spring Boot / Symfony

👈  Entity = Domain-first
👈  ORM حواليها
👈  Repository أساسي
👈  مش اختلاف أسماء دااا اختلاف فلسفة


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


ليه Active Record محتاج Framework أو ORM و ليه لازم يعتمد ع حاجة


لأن الكلاس نفسه بيعرف

الـ Entity نفسها عارفة حاجات مش من مسؤوليتها
زي الTable و الColumns و الPersistence و الSQL (ضمنيًا)

و مش بس كدا

إدي كمان عارفة زاي تتحفظ و إزاي تتحذف و إزاي تتجاب من DB

يعني

الكلاس مش Domain بس دا عبارة عن الكلاس Domain + Persistence + Infrastructure

وده يخليه

👈 مينفعش يشتغل لوحده
👈 محتاج ORM
👈 محتاج Config
👈 محتاج Framework شغال 


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


ليه Active Record خطر على الدومين؟




المشكلة الأولى: كسر العزلة (Isolation)

لما Order يبقى Active Record
يبقى محتاج DB و ORM و Config و كمان Framework شغال

يعني إيه؟

يعني Order مش Object مستقل
ده Object مربوط بالبيئة اللي حواليه.

المفروض إيه اللي يحصل؟

المفروض تقدر تعمل

و كل دا من من غير DB و من غير ORM و من غير Framework

هتعرف هتقولي هقولك ليه؟

هتقولي علشان الدومين = منطق مش بنية تحتية هوه
مش هتعرف تختبر الدومين إلا لما تشغّل الدنيا كلها

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

المشكلة الثانية: ربط الدومين بالفريم ورك

Order بقى Laravel-ish او ممكن Doctrine-ish او انا عامل واحدة ف البيت Framework-specific

غيرت Framework؟

 إعادة كتابة كل حاجة 

الدومين بقى:

Extension للفريم ورك مش Core Business.


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


المشكلة التالتة: كسر Encapsulation

أي Client يقدر 

يحفظ او يحذف او يعدل او يجيب داتا من الداتابيز

يعني

مفيش Gate و مفيش Control و مفيش Policy
من الاخر الدومين بقى مفتوح على البحري.


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

السؤااااااااال بقااااااا  طب Data Mapper عمل إيه مختلف؟


من الاخر يعني كل البلاوي اللي فاتت بتاعة Active Record مش موجودة هنا.

ليه؟

علشان ببساطة… قسمنا الشغل صح.

خلّينا نمشيها واحدة واحدة

عندي Entity بتعمل إيه؟

الـ Entity في Data Mapper

فيها Rules
فيها Behavior
فيها Invariants (حاجات مينفعش تتكسر)

يعني إيه Invariants بالمصري؟

يعني الOrder مينفعش يتأكد وهو فاضي
Amount مينفعش يبقى بالسالب
Quantity لازم > 0
كل دي قوانين بزنس مش شغل DB.

فالـ Entity

مش بيحفظ ولا بيحذف ولا يعرف Table ولا ليه علاقة ب ORM


من الاخر خالص بقا كائن بيفكّر مش كائن بيخزّن


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

طب لو المشروع Active Record كله؟


عادي Laravel مبنية عليه اصلا كامل 

لو الفريق مبسوط وسريع وماشي تمام


بس التزم بالقواعد دي و الي هيه قواعد تخفيف مصايب Active Record


1️⃣ صمّم AR Entity كـ Entity بجد مش Getter/Setter Machine مش DB Row لابس بدلة OOP

2️⃣ افصل Read Model عن Write Model
Model للتعديل وModel تاني للعرض

3️⃣ متتنقلش بين Entities هات الـ ID واستخدم Repository

4️⃣ تجاهل save() و delete() من برا خلي التعامل الرسمي عبر Repository


من الاخر استعمالك Repository ف laravel 



كدا هتخلي الدومين بيتعامل مع Repository مش مع ORM حتى لو تحتها Active Record