لما الـ SQL يبقى في كل حتة… والقصة تضيع

أحمد رمضان

. 3 د قراءة

قبل ما نكمل،

دا كتاب Advanced web applications Architecture 

لو لسه مقريتش المقدمة،

ارجع اقراها من هنا 👈 (هناا)

علشان الفصل ده مبني عليها



دلوقتي يلا نمسك أول مثال في الشابتر والكتاب قاصد يبدأ بمثال وحش معماريًا مش علشان يعلّمك تكتب كده،لكن علشان تحس بالمشكلة بنفسك.

بص على الكود ده كويس جدا

تعالي نحكي القصة اللي الكود ده بيعملها من خلال اننا لو شيلنا الـ SQL والـ syntax


القصة ببساطة كده:


المستخدم اختار Ebook بالـ ID
السيستم راح للداتابيز يسأل   :  سعره كام؟
السيستم راح يحسب              : الكمية × السعر
حضّر شوية بيانات و راح        : خزّنهم في جدول orders
بعد كدا                                   : خد الـ ID اللي الداتابيز ولّدته و راح خزّنه في الـ Session

دي قصة Order

بس المشكلة؟

1 - القصة مدفونة تحت SQL      (كلها اوامر زي SELECT , LAST_INSERT_ID,  INSERT)
2 - مش متسماة
👈 order عبارة عن array 
3 - مش واضحة                         
👈 بعمل implode كتير 
👈و كمان جزء حساب ال quantity and total price مكتوب SQL كدا


4 - ومش قابلة للاختبار

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

ليه الكود ده وحش؟ (بنفس منطق الكتاب)

1 - مش عارف السيناريو اسأل نفسك:
فين CreateOrder؟
فين SaveOrder؟
فين OrderPlaced؟
مش موجودين الكود ما بيحكيش بينفّذ ودي مشكلة كبيرة.
2 - التفاصيل قتلت المعنى بدل ما تشوف حاجة زي:
انتا شايف  INSERT و implode و escape و LAST_INSERT_ID
Implementation Details
طغت على القصة نفسها إنت بتفهم إزاي لكن مش فاهم ليه

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

و هرجع اسألك تاني هوه فين الـ Order أصلًا؟

هتقولي دا 

هرد عليك و اقولك تاني 

👈 Array
👈 ملوش معنى
👈 مفيش قوانين
👈 مفيش حماية
👈 يقبل أي قيمة

ده مش Domain Model ده ب المعني الحرفي مجرد شوية داتا مرمية.


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

هنا نوقف عند نقطة مهمة جدًا وهيه سؤال بيقول 

هل سمعت قبل كده عن 

High-level modules و Low-level modules !!!؟؟؟


High-level

👈ده البزنس
👈القرارات
👈القواعد
👈السيناريوهات

Low-level

👈SQL
👈Database
👈Session
👈Framework


ارجع بص ع الكود تاني كدا هتلاقي إن الاتنين متلخبطين في بعض.


Controller هنا مسؤول عن إيه بالظبط هل مطلوب منه 


يفهم البزنس ويحسب السعر و يكتب SQL ويتعامل مع Session ويتعامل مع HTTP

هتلاقي اصلا الدومين مستخبي والـ Infrastructure مسيطر وده كسر مباشر لكل اللي اتعلمناه في Chapter 1

خصوصًا مبدأ:

Dependency Inversion Principle

اللي بيقول: High-level ما يعتمدش على Low-level الاتنين يعتمدوا على Abstraction

لكن هنا؟

البزنس ماسك في SQL بإيده

طب Domain Model الصح يعمل إيه؟


الكتاب عايزك توصل للفكرة :

الأول بيتكلم SQL

التاني بيتكلم Order


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

من الاخر عاوزين بدل ما نفك شفرة الكود و نقعد نقول دا فين و منين 

يكون البزنس واضح من أسماء الميثودز من الاخر الكود بيحكي قصته بنفسه

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


ليه الكتاب مهتم قوي بالـ Domain Model؟

1 - علشان تفهم القصة ف لما تشوف 

تعرف اه انا عاوز الtotal amount

افضل من 

2 - علشان يحمي الداتا من الغلط منا ممكن اعمل كدا و كدا كدا array بتقبل اي حاجة


3 - علشان يفصل البزنس عن التكنولوجيا و هوه اننا نعرف نفرق بين High-level modules و Low-level modules


و نقول تاني و تالت و عاشر 


الدومين ميعرفش SQL و ميعرفش MySQL و ميعرفش Session و ميعرفش Laravel
هو بس يعرف أنا Order وليّ قوانين
من غير فلسفة 
Domain Model هو قلب السيستم بيمثل مفاهيم البزنس وقوانينه ومش تابع لأي Database أو Framework.



و اخيرا 

في الشابتر ده: هنركّز بس على إخفاء تفاصيل الحفظ نخلي فيه خطوة واحدة اسمها: "save order"

أما: تغيير DB  و تغيير HTTP و تغيير UI دي قصتها تيجي في Chapter 3 و 4 ان شاء الله 


روح للمقال الي بعده من هنا علشان نبدأ نحسن الكود