مش كل حاجة تتحفظ وخلاص: إدخال الريبو لحماية منطق البزنس

أحمد رمضان

. 2 د قراءة

Advanced Web Application Architecture

Chapter: The Domain Model – Introducing a Repository (2.4)

في النقط اللي فاتت من الكتاب، اتكلمنا عن مفاهيم مهمة جدًا:

Domainهو المجال اللي التطبيق شغال فيه (بيع كتب – حجز – توصيل… إلخ) Modelهو التمثيل المنطقي للحكاية اللي البزنس عايز يحكيهاGatewayطريقة نشيل بيها الـ SQL من الكود، وكل Class يمثل جدول كامل في الداتابيز

Entity

لما نقول Order

إحنا مش بنقول row في جدول إحنا بنقول: Order = طلب حقيقي في البزنس عنده:

Email
Quantity
Amount
ومحمي بقواعد (Assertions) مينفعش يبقى مش تمام----------------------------------------------------------------------------------------

المشكلة الحقيقية (بعد ما “ظبطنا الدنيا”)

بعد ما عملنا:

Order Object
Assertions
Domain Rules

كنا متوقعين إن الدنيا بقت تمام…

بس لأ 

لسه بنحفظ الداتا كده:


ليه دي مشكلة حقيقية؟ ركز معايا كدا


👈 المشكلة اي إن الاتنين مش بيتكلموا نفس اللغة.


عندنا Order Object وده كيان من الدومين

👈 محكوم بقواعد البزنس، ومبني على معنى حقيقي زي م اتفقنا 

وعندنا OrdersGateway وده جزء تقني بحت

👈 مايعرفش غير الـ arrays والـ SQL.


يعني اي برضو ؟؟؟؟

إن الاتنين مش بيتكلموا نفس اللغة. إحنا بنحاول نعمل إيه؟
الحاجة اللي عايزين نحفظها: Object
الحاجة اللي بتعرف تحفظ فعلًا: Array
الدومين شغال بـ Objects
التخزين شغال بـ Arrays
والـ Controller واقف في النص، بيحوّل من ده لده


ليه ده خطر؟

لأن التحويل ده معناه إن:

👈 قواعد الدومين خرجت برّه الدومين
👈 جزء من منطق البزنس بقى في الـ Controller
👈 مفيش ضمان إن كل Order اتحفظ كان سليم فعلًا
أي حد ييجي بعدك ممكن:
👈 ينسى حقل
👈 يغير قيمة
👈 يتجاوز Assertion
👈 أو يبعت Array غلط


والـ Gateway هيحفظ… من غير ما يسأل.

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

السيستم شكله نضيف من برّه بس من جوّه غير متناسق الدومين مفروض محمي لكن الحماية بتتكسر عند أول تعامل مع التخزين والـ Order يفقد معناه ويبقى مجرد Array وده بالظبط اللي الكتاب عايز يمنعه.

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


طيب نعمل إيه؟ (تفكير الكتاب)

الكتاب قال حاجة ذكية جدًا:


Act as if it already exists
تصرّف كأن الأداة الصح موجودة

خلينا نتخيل حاجة اسمها Order Saver


مسؤولة بس عن حفظ Order
متستقبلش Array
تستقبل Order Object


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


وده فتح الباب لفكرة أكبر… و هوه Repository Pattern


Repository بتعمل إيه؟ (من الآخر)


الـ Repository مجرد طبقة وسيطة بين عالمين:

👈 Domain → Objects، Rules، Business Logic
👈 Database → Tables، Rows، Arrays، SQL


دورها بسيط ركزززززززز

👈 تخلي الدومين يشتغل Objects
👈 والتخزين يحصل برا الدومين من غير ما الدومين يبوظ بتفاصيل DB


يعني إيه طبقة وسيطة؟


الدومين يتعامل مع Order مش عارف
Database ولا SQL ولا Gateway ولا MySQL ولا PostgreSQL

الدومين شايف حاجة واحدة بس:

Order Repository


هتسأل يعني بيعمل اي برضووووووو؟؟؟؟؟؟

بكل بسااااطة مش بتفكر و مش بتطبق Business Rules

كل الي بتعمله
👈 حفظ الـ Entity و بعدين استرجاعها
👈 ترجمة من Object → Storage و العكس Storage → Object


تيجي بقا نشوف الكود النهائي 







لو عاوز تسأل بقا ليه interface مش class و الاسئلة الوجودية دي هتلاقي اجابات هنا