قبل ما نكمل، خلّينا نفكّر سوا ثانية واحدة.
دا كتاب Advanced web applications Architectureإحنا في المقال اللي فات: (من هناا)
فهمنا يعني إيه Domain Modelوفهمنا ليه الكود القديم كان وحشدلوقتي انتا بتقول طب ما نحاول نصلّح الكود؟
تعالى نحاول سواا…
أول محاولة باستخدام : Table Data Gateway Pattern
أول حل بييجي في دماغ أي حد شغال PHP قديم شوية هو Pattern دا
طب يعني اي ال pattern دا
ببساطة شديدة:
كل Class بيمثل جدول كامل في الداتابيز
والكلاس ده بيبقى مسؤول عن :
👈 ( select , insert , update , delet) و الي هيه Crud Operations يعني بيفكر كده:
جدول → أعمدة → صفوف → SQL
مش بيفكر في:
👈Order
👈Ebook
👈Business Rules
لا… بيفكر داتابيز بس. هنفهم يعني اي الوقتي
--------------------------------------------------------------------------------
يلا بينا علي مثال عملي

لو جيت تبص ع الكود و ضروري تقرأ الكود ضروري جدا
بيروح لجدول ebooks و ال ordersويطلع rows بناءً على criteria
هتقولي يعني اي
هقولك عملنا كل عمليات ال sql هنا و دي اول خطوة
نفترض إننا شغالين PHP Native وعندنا Container و كدا ف عنروح نربط ال getway علشان نستخدمه :
فرضا بس علشان متوهش ازاي استخدمناه عن طريق ebooks_getway && orders_getway

كده:
أي مكان محتاج orders_gateway هياخده جاهز
الكنترولر مش محتاج يعرف SQL
تمام… نخش بقا للمقارنة المهمة 👇

قارن بينهم انتا كدا هتلاقي اي الي حصل !؟
الكنترولر القديم هنا كان بيعمل: مذبحة مسؤوليات.
1- SQL
2- قراءة داتا
3- كتابة داتا
4- Session
5- Business Logic
الكود بعد Table Data Gateway :
خلّينا نكون صُرحا لسه مذبحة مسؤوليات.
و لكن مفيش SQL بس
ايوة و الله هوه دا الي اختلف بس كدا مفيش SQL ف ال Controller
--------------------------------------------------------------------------------
طب المشكلة فين بقا؟
اولا لسه بنتعامل بـ Arrays
سواء ف get book price او insert order

طب تعالي نشوف يعني اي!؟
ف الget book price
افترضنا إن index 0 موجود او مش موجود
افترضنا إن price موجود او مش موجودمفيش اي معنى الكود هيضرب و خلاص مفيش أي حماية
ف الInsert Order بقا
لسه قادر ادخل fake data
لسه قادر احط ال quantity ب السالب
نفس الكلام مفيش اي معنى الكود هيضرب و خلاص مفيش أي حماية
ثانيا مفيش Domain Model
اسأل OrdersGateway:
انت Order؟
يرد عليك:
لأ، أنا مش Order، ومش فاهم أصلًا يعني إيه Order كبزنس.
أنا مجرد class مسؤولة عن التعامل مع جدول اسمه orders في قاعدة البيانات.دوري إني أستقبل منك أوامر زي:(insert , select , update , delete)
وأنا أنفذها زي ما هي على الجدول،
من غير ما أسألك ليه، ولا أراجع اللي إنت بعتهولي صح ولا غلط.
بالعكس هو كمان هيكمل ويقولك:
إنت بتتعامل معايا عن طريق methods واضحة،
وأنا بالمقابل أخبي عنك كل التفاصيل اللي تحت: SQL و أسماء الأعمدة و شكل الجداول
من الآخر… اعتبرني abstraction بينك وبين الداتابيز مش أكتر من كده.
"لو مش فاهم يعني اي abstraction روح هناااا"
هتسألني طيب… هو بيمثل إيه بقى؟ هقولك ثالثا بقا
ثالثا Table Oriented Design
الحقيقة المهمة هنا:
OrdersGatewayما بيمثلش الدومين
هو بيمثل طريقة الوصول للداتا،
مش الداتا نفسها.
يعني إيه الكلام ده عمليًا؟
👈معرفش يعني إيه Order
👈معرفش يعني إيه عملية شراء
👈معرفش يعني إيه كمية منطقية
يعني لو إنت:
بعتله quantity = -5 → هياخدها عاديبعتلهindexبدلid→ هيدخله عادي
بعتله داتا ملهاش أي معنى في البزنس → هيسجلها عادي
ليه؟
لأنه مش مسؤوليته يفهم الصح والغلط
هو مسؤوليته الوحيدة:
يوصل للداتا ويحفظها ويرجعها.
الخلاصة المهمة جدًا
OrdersGateway:👈 بيعرف الجدول
👈بيعرف الأعمدة
👈 بيعرف يوصل للداتا
👈 ما يعرفش قوانين البزنس
👈 ما يحميش النظام من الداتا الغلط
وده معناه إن:
لسه مفيش Domain Model
لسه مفيش object يقول:
“الطلب ده ينفع ولا مينفعش”