محاولة تصليح الكود… بطريقة غلط

أحمد رمضان

. 3 د قراءة

قبل ما نكمل، خلّينا نفكّر سوا ثانية واحدة.

دا كتاب 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 يقول:
“الطلب ده ينفع ولا مينفعش” 



من الاخر بقا ده مش Domain Model ده Database Abstraction



وده سبب إن Table Data Gateway خطوة مؤقتة حل شكلي حل تقني شوية  مش الحل النهائي الي هيفكرنا ب البيزنس 


اوعي عقلك يقولك ال repository pattern and model

الكلام دا لسه قدام هنفهمه كويس اوي اصبر ي صديقي