مفهوم MVC أو (Model-View-Controller) الذي يرافق أغلب الأطر البرمجية.
هل هناك طريقة مبسطة لفهمه ؟
بالتأكيد تعرف جملة الطباعة الموجودة في أي لغة برمجة بهذا الشكل
name="ahmed"
print("Hello %s", name)
عند تحليل هذه الجملة ستجدها مكونة من ثلاث أشياء هي:
1- "Hello %s" هذا الجزء هو ما سيظهر أمام المستخدم بالطبع بعد تغيير %s ل ahmed. هذا الجزء المرئي يسمي view وهو القالب لما سيظهر. في حالة جملة الطباعة السابقة فهذا القالب بسيط جدا فلا توجد مشكلة عند كتابته بداخل الكود ولكن في المواقع نحتاج إلي قوالب معقدة أكثر لهذا نضع القوالب في ملفات خارجية لنفرض علي سبيل المثال قالب للصفحة الرئيسة للموقع يسمي index.html عبارة عن
<html>
<head></head>
<body>
<h1> Hello %s </h1>
</body>
</html>
ونكتب جملة الطباعة مرة أخرى بهذا الشكل
printfile("index.html", name)
بدون ذلك كنا سنضطر لكتابة كل شئ داخل الكود مثل
print("<html><head></head><body><h1> Hello %s </h1> </body></html>", name)
وهذا كان سيجعل فهم الكود وإصلاح الأخطاء أصعب بكثير بالإضافة إلى عدم قابلية إعادة الاستخدام
2- الجزء الثاني وهو name هذا الجزء هو ال model وهو البيانات أو المعلومات التي تريد عرضها داخل القالب للمستخدم مرة أخرى هذا ال model بسيط جدا مجرد string ماذا لو أردنا كتابة كل معلومات المستخدم مثل الأسم والسن ووو
يمكن ذلك عن طريق عمل class تحمل معلومات المستخدم
Class Person{
String name;
Int age;
}
ونعيد كتابة جملة الطباعة لتصبح
print("Hello %s, your age is %s", person.name,person.age)
كما تري فهي جملة طباعة واحدة فقط لكن يمكنها طباعة عدد لا نهائ من المستخدمين
3- الجزء الثالث وهي دالة الطباعة ذات نفسها print وتسمي ال controller لأنها تتحكم في شكل ال view النهائي وفي حالة التطبيق الفعلي لل mvc فهي قادرة أيضا على التحكم وتعديل بيانات الmodel
إذا ال mvc ماهي الا طريقة لتقسيم الكود إلي قوالب مرئية views - بيانات models - كود لربط القوالب بالبيانات controllers
لفهم الـ MVC ككل ينبغي أولاً فهم كل مكوّن من مكوّناته على حِدا.
عندما تتعامل مع نظام برمجي فحتماً ستتعامل مع بيانات يتم تخزينها أو استرجاعها من قاعدة البيانات (أو ربما -وقليلاً جداً- من ملفات)، هذه البيانات لا بد أن تكون منظّمة ولها هيكلية محددة بحيث تسمح لك دائماً أن تتعامل مع نفس الشيء بنفس الطريقة دون الحاجة لتغييرٍ في بُنيتها.
الـ model يمثّل بُنية وهيكلية هذه البيانات والأمور المتعلّقة بالكيان الواحد وعلاقته بالكيانات الأخرى.
فمثلاً إذا كان لديك كيان User، فمن خلال هذا الـ model تستطيع أن تبنيَ الهيكلية المناسبة لهؤلاء الـ users وعلاقتهم بكيانات أخرى مثل كيانات الحسابات الشخصية أو الممتلكات أو الأقسام التي يعملون بها .. الخ.
إذاً فالـ model هو تجميع للخصائص المتعلقة بكيانٍ محددٍ (في مثال الـ users فالخصائص مثلاً هي الاسم والكنية والبلد والعمر ... الخ)، وتجميع للعلاقات مع الكيانات الأخرى (كأن يكون للمستخدم "عدّة" حسابات بنكية ويعمل في "عدّة" أقسام ضمن الشركة ولكنّه ينبغي أن ينتمي لشركةٍ "واحدة" فقط).
الـ controllers هي كوحدة التحكم التي تقوم بالربط والتعريف وإجراء العمليات المناسبة على البيانات من أجل ربطها مع بعضها وتخزينها أو استرجاعها أو حذفها أو تعديلها أو نقلها وإرسالها أو .. أو .. الخ
أي أنّ الـ controllers عبارة عن مجموعة functions يتم تنفيذها حسب الطلب لإجراء عملية معيّنة متكاملة، حيث يتم من خلال هذه العملية استخدام الـ models المعرّفة مسبقاً والتي تحدّثنا عنها في الأعلى أنّها تكون مهيكلة ومنظّمة.
وكمثالٍ على العملية المتكاملة التي تتم في الـ controller سنفرض أنّك تريد تسجيل مستخدم جديد ضمن النظام البرمجي، فهنا ستقوم في الـ controller -وتحديداً في إحدى الـ functions التي ستقوم بإنشائها فيه- ستقوم بتعريف object أو instance من الـ model المعرّف مسبقاً من قِبَلك وهو الـ user، وستقوم بإسناد قِيَمٍ للخصائص المعرّفة في الـ model من قبل (مثل الاسم والكنية والبلد ...)، وستقوم بربط هذا الـ user الجديد بـ objects أو instances من models أخرى كالحسابات البنكية والأقسام والشركات .. ، وربما تحتاج لحفظ ملفات على السيرفر من خلال تنفيذ function آخر موجود في نفس الـ controller.
إذاً فالعملية المتكاملة عبارة عن تنفيذ function أو سلسلة من الـ functions بهدف الوصول للغاية المحددة.
أمّا الـ views فهي صفحات العرض التي يراها المستخدمون عند تصفحهم واستخدامهم للنظام البرمجي القائم على MVC، فهم بالنهاية يرون الأزرار والقوائم والفقرات ويتفاعلون مع بعض المكوّنات.
صفحات الـ views هذه ليست إلا واجهة يتم من خلالها عرض المكوّنات التي يراها/يتفاعل معها المستخدم وبذات الوقت تقوم بعرض البيانات المخزّنة في الـ models.
فإذا قمتَ بتسجيل مستخدم جديد في النظام فأنتَ غالباً بعد نهاية التسجيل ستقوم بإظهار صفحة view لتعرض فيها البيانات التي تمّ تخزينها في الـ model الذي قمتَ بإنشائه وتخزينه في قاعدة البيانات.
إذاً فالـ model هو بُنية لحفظ وتنسيق بيانات الكيان الواحد، والـ controller لإجراء العمليات التي تستخدم الـ models وتتعامل معها، والـ views لعرض الصفحات التي يراها المستخدم.
ممّا سبق نستطيع أن نتعرّف على كيفية تواصل هذه الطبقات الثلاثة مع بعضها:
1- المستخدم للنظام البرمجي يرى الـ views ويتفاعل مع مكوّناتها (أزرار وقوائم ...).
2- من خلال الضغط على الأزرار أو العناصر الأخرى يتم استدعاء functions موجودة في الـ controller من أجل القيام بعمليات محددة.
3- هذه العمليات تستخدم الـ models من أجل إضافة بيانات جديدة أو التعديل على بيانات سابقة أو حذفها أو ربطها ببيانات أخرى.
4- عند الانتهاء من تنفيذ function موجود ضمن controller فلا بدّ من إظهار شيء للمستخدم يدل على أنّ العملية قد تمّت بنجاح أو قد حصل مشكلة يجب حلّها، لذلك يتم إعادة صفحة view.
5- صفحة الـ view هذه ربما تعرض بعض البيانات المتعلقة بـ model معيّن والتي تمّ تنفيذ بعض العمليات عليها في الـ function الموجود ضمن الـ controller
وهكذا ...
فالعملية إذاً عبارة عن سلسلة من عرض الصفحات وتنفيذ الأوامر واستخدام الـ models بهدف تحقيق عملية متكاملة تخدم المستخدم النهائي.
لو أخذنا الصفحة هذه كمثال فالشريط العلوي، الأزرار، الألوان تمثّل الـ View و كما ترى فالصفحة تحتوي على عنوان مساهمتك و محتواها و هذه معلومات قادمة في هذه الحالة من قاعدة بيانات و هذا هو الـ Model لكن لا يمكننا عرض أي معلومات لأي شخص مع قاعدة البيانات لذلك الـ Controller عرف أنّني ضغطت على زر للدخول إلى هذه المساهمة و جلب لي معلوماتها من الـ Model ليعرضها الـ View في نسق معيّن.
التعليقات