هنالك العديد من الطرق لهيكلة الكود والمضروع في تطبيقك ويمكنك وضع أقل ما يمكنك من جهد في التفكير للهيكلة. ولكن عادة ما يكون من الجيد اتباع نماذج تصميم معروفة لأنها ستجعل الكود أسهل للإدارة وأسهل فهماً للغير.
واحدة من النماذج الأكثر استخداماً هو نموذج المصنع. هذا النموذج عبارة عن كلاس يقوم بإنشاء الكائنات التي تود استخدامها. مثال بسيط لهذا النموذج:
هذا الكود يقوم باستخدام الكائن Automobile. هنالك فائدتان مرجوتان من بناء برمجيتك على هذا النحو. الأولى وهي انه عندما تحتاج لتغيير أو إعادة تسمية أو استبدال كلاس Automobile لاحقاً يمكنك فعل هذا ببساطة بتعديل الكود الموجود في المصنع بدلاً من تعديله في كل مكان يتم فيه استخدامه في المشروع. الفائدة الثانية وهي عندما تقوم بإنشاء كائن يقوم بمهمة معقدة يمكن أن يقوم بكل العمل المعقد في المصنع بدلاً من تكراره في كل مرة تنوي فيها انشاء كائن جديد.
استخدام هذا النموذج ليس دائماً ضرورياً أو خيار حكيم. المثال المستخدم هنا هو مثال بسيط يقوم فيه المصنع بإضافة تعقيد غير ضروري. ولكن إذا كنت تقوم بإنشاء مشروع كبير أو معقد عندها قد يوفر لك حلاً للعديد من المشاكل التي قد تواجهك وتحلها باستخدام المصنع.
عندما تقوم بتصميم تطبيق ويب عادة ما قد تحتاج بأن تنشئ بنائية تتيح الوصول فقط عن طريق نسخة واحدة من كلاس معين. وهذه ما يقوم به النموذج الوحيد.
TODO: NEED NEW SINGLETON CODE EXAMPLE
الكود أعلاه يقوم ببناء النموذج الوحيد باستخدام متغير ثابت
و استخدام عملية ثابتة getInstance()
.
لاحظ الآتي:
__construct()
معرفة بأنها محمية Protected
لمنع إنشاء كائنات جديدة خارج الكلاس عبر استخدام العبارة new
.__clone()
معرفة بأنها خاصة Private لمنع
استنساخ كائنات من الكلاس باستخدام العبارة clone
.__wakeup()
معرفة أيضاً بانها خاصة Private لمنع
عملية فك الترميز unserializing لكائن الكلاس باستخدام الدالة العامة unserialize()
يمكن إنشاء كائن جديد باستخدام late static binding في الدالة الثابتة
getInstance()
بالكلمة الدلالية static
. ويتيح للكلاسات الفرعية من الكلاس الفرعي كما في المثال.نموذج الوحيد مفيد عندما نريد ان نتأكد بأن هنالك كائن واحد من كلاس معين في دورة حياة الطلب في تبيق الويب. هذا عادة ما يحدث عندما نريد كائن عام ككائنات الضبط مثلاً أو المصادر المشتركة مثل صف العمليات.
يجب عليكن أن تتوخى الحذر في استخدام هذا النموذج، لأنه بطبيعته يقوم بتوفير نفسه بشكل عام في التطبيق ككل مما يقلل سهولة اختباره. عادة ما يتم استخدام حقن التوابع (ويجب استخدامه) بدلا من كلاس الوحيد. استخدام حقن التوابع يعني أنه لا يتم تعريف أي ربط ضروري بداخل تصميم التطبيق، لأن الكائن يقوم باستخدام مصادر عامة أو مشتركة لا تتطلب الضرور بمعرفة الكلاس المعرف.
مع النموذج الإستراتيجي تقوم بتغليف مجموع أوامر ولوغريثمات سوياً مما يتيح للكلاس المستهلك المسؤول من إنشاء لوغاريثمية معينة بدون معرفة محتوى وطريقة عمل التنفيذ الفعلي. هنالك عدة طرق لنموذج الإستراتيجي أبسطها:
الكود الأول نموذج يوضح عائلة اللوغريثمات، يمكن استخدام مصفوفة مرمزة وبضع JSON او مصفوفة:
بتغليف اللوغاريثمية اعلاه انت تقوم بعمل كون واضح ونظيف يمكن المطورين الاخرين اضافة أنواع مخرجات بسهولة دون التأثير على كود العميل.
سترى كيف يمكن إخراج كلاس يطبق واجهة OutputInterface هذا يفيد بشيئين أولهما أنه يتيح عقد مبسط يجب أن يقوم بإتباعه في تطبيق المخرجات. ثانيهما أنه بتطبيق الواجهة سترى في الفاصل التالي أنه يمكن أن تقوم بإدراج Type Hinting للتأكد من العميل يقوم باستخدام هذه التصرفات من النوع الصحيح في هذه الحالة ‘OutputInterface’.
الكود التالي يوضح نداء كلاس العميل وكيف يمكن استخدام واحدة من اللوغريثمات والقيام بسلوك افضل في التنفيذ:
بنداء كلاس العميل أعلاس سيقوم الميز الخاصة والتي سيتم انسابها في وقت النتفيذ من النوع ‘OutputInterface’ لحظة اسناد هذه الميزة سيتم استدعاء الدالة loadOutput() والتي ستقوم باستدعاء الدالة load() في الكلاس المنشأ من نوع المخرج الذي تم اسناده.
نموذج التحكم الأمامي هو عندما تريد أن يكون لديك مدخل واحدة لنقطة في تطبيقك مثلا (index.php) بدوره يقوم بإدارة كل الطلبات. هذا الكون هو المسؤول من إدراج كل التوابع ومعالجة الطلبات وإرسال الرد إلى المتصفح. المتحكم الأمامي مفيد لأنه يقوم بنمذجة الكود وإعطائه مكان مركزي للربط مع الكود الذي يجب أن يعمل في كل طلب مثل تعقيم المدخلات.
وأقربائه مثل HMVC و MVVM يتيحوا لك أن تقوم بتجزئة الكود إلى كائنات وعناصر منطقية تقوم بخدمة هدف محدد. الموديل يقوم بتوفير الوصول للبيانات وفيه يتم استرجاع البيانات واسترجعها بصيغة يمكن التعامل معها عبر التطبيق. المتحكم يقوم بإدارة الطلبات ومعالجة البيانات المسترجعة من الموديل وإدراج العرض ثم ارساله في الرد. والعرض يقوم بعرض القوالب (Markup أو XML) والتي تقوم بارسال الرد للمتصفح.
يعد هذا من النماذج المعمارية الأكثر استخداماً وشهرة PHP frameworks.
تعرف المزيد عن هذا النموذج وأشباهه: