مقدمة في أنماط التصميم
جزء من قسم البرمجة كائنية التوجه في رحلة PHP على Coddy. الدرس 70 من 91.
أنماط patterns هي حلول مُثبتة للمشكلات الشائعة التي يواجهها المطورون بشكل متكرر عند بناء البرمجيات. بدلًا من إعادة اختراع العجلة في كل مرة، يمكنك تطبيق هذه القوالب الراسخة لحل تحديات مماثلة في شفرتك الخاصة.
فكّر في أنماط التصميم بوصفها وصفات. فكما يتّبع الطاهي وصفةً لإعداد طبق جرى إتقانه بمرور الوقت، يستخدم المطوّرون أنماط التصميم لتنظيم شيفرتهم بطرق اختبرها وصقلها عدد لا يُحصى من المبرمجين قبلهم.
تُجمَّع Design patterns عادةً ضمن ثلاث فئات:
| الفئة | الغرض | أمثلة |
|---|---|---|
| Creational | How objects يتم إنشاؤها | Singleton, Factory |
| الهيكلية | How objects يتم تركيبها | Adapter, Decorator |
| Behavioral | How objects communicate | Observer, Strategy |
لقد كنت تستخدم الأنماط طوال هذه الدورة التدريبية دون أن تدرك ذلك. عندما أنشأت فئات مجردة مع methods يجب على الفئات الابنة تنفيذها، كنت تطبق شكلاً من نمط Template Method. وعندما استخدمت الواجهات لتعريف العقود، كنت تهيئ لاستخدام نمط Strategy.
يمنحك تعلّم أنماط التصميم مفردات مشتركة مع المطورين الآخرين. بدلًا من شرح بنية معقدة بالتفصيل، يمكنك ببساطة أن تقول "لقد استخدمت نمط Factory هنا"، وسيفهم المطورون ذوو الخبرة نهجك فورًا. في الدروس التالية، سننفّذ عدة أنماط أساسية في PHP.
التحدي
سهللنبنِ نظامًا بسيطًا لتنسيق الرسائل يوضّح how تساعد أنماط التصميم في تنظيم الشيفرة. ستحدّد إلى أي category من الأنماط ينتمي كل مكوّن، وسترى how تعمل الأجزاء المختلفة من النظام معًا.
ستنظّم شيفرتك عبر ثلاثة ملفات:
MessageFormatter.php: أنشئ interface باسمMessageFormatterيعرّف عقدًا لتنسيق الرسائل. يجب أن يحتوي على method واحدة هيformat(string $message): string. يمثّل هذا category behavioral. وهو يعرّف how تتواصل objects وتعالج البيانات.Formatters.php: ضمّن ملف MessageFormatter وأنشئ classين يطبّقان interface:UppercaseFormatter: تعيد methodformat()الخاصة به message بعد تحويلها إلى أحرف كبيرةBracketFormatter: تضع methodformat()الخاصة به message بين قوسين مربعين مثل[message]
main.php: ضمّن ملف Formatters. ستتلقى inputين: message من نوع string وformatter type ("upper"أو"bracket").أنشئ function باسم
processMessageتقبلMessageFormatterوmessage من نوع string، ثم تعيد النتيجة formatted. لا تحتاج هذه function إلى معرفة أي formatter محدد تتلقاه. إنها تستدعي فقطformat()على أي object يتم تمريره إليها.استنادًا إلى input الخاص بـ formatter type، أنشئ formatter object appropriate. مرّره إلى function
processMessageالخاصة بك مع message، ثم اطبع النتيجة.في سطر جديد، اطبع أي category من الأنماط يمثّلها هذا الهيكل. بما أننا نعرّف behaviors قابلة للتبديل من خلال interface، اطبع:
Pattern category: Behavioral
يوضّح هذا التحدي how تتيح لك interfaces تبديل implementations من دون تغيير الشيفرة التي تستخدمها: وهذا أساس لأنماط مثل Strategy التي ستستكشفها في الدروس القادمة.
جرّب بنفسك
<?php
require_once 'Formatters.php';
// اقرأ الإدخال
$message = trim(fgets(STDIN));
$formatterType = trim(fgets(STDIN));
// TODO: أنشئ دالة تسمى processMessage تقبل MessageFormatter
// وسلسلة نصية للرسالة، ثم تُرجع النتيجة المنسّقة
// TODO: بناءً على $formatterType ("upper" أو "bracket")، أنشئ المنسّق المناسب
// TODO: استدعِ processMessage مع المنسّق والرسالة، ثم اطبع النتيجة
// TODO: Print the pattern category on a new line
// Format: "Pattern category: Behavioral"
?>يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1أساسيات OOP
الملفات الخارجيةمقدمة في OOPClasses مقابل Objectsالكلمة المفتاحية $thisالـ Methodsالـ Propertiesالمنشئ (__construct)الهادم (__destruct)مراجعة - آلة حاسبة بسيطة4الوراثة
الوراثة الأساسيةالكلمة المفتاحية parent::إعادة تعريف الدوال (Method Overriding)الكلمة المفتاحية finalالأصناف المجردة (Abstract Classes)مراجعة - هيكلية الموظفين7التغليف (Encapsulation)
العام، المحمي، الخاص (Public, Protected, Private)نظرة متعمقة على معدلات الوصولدوال Getters و Settersإخفاء المعلوماتميزة Constructor Promotion (8.0)مراجعة - نظام سجلات الطلاب10مفاهيم البرمجة كائنية التوجه المتقدمة
التركيب مقابل الوراثةحقن التبعيةالأصناف المجهولةالتعدادات (PHP 8.1)الألياف (PHP 8.1)تعمق في استنساخ الكائناتالمولدات والمكررات13أنماط التصميم - الجزء الثاني
نمط الأمرنمط المحولنمط المزيننمط طريقة القالبنمط الحالةنمط التركيبنمط المستودع2مساحات الأسماء والتحميل التلقائي
مقدمة إلى مساحات الأسماءالكلمة المفتاحية useمعيار التحميل التلقائي PSR-4أداة التحميل التلقائي Composerملخص - مشروع منظم5الواجهات والعقود
مقدمة إلى الواجهاتتنفيذ الواجهاتتنفيذ واجهات متعددةالواجهة مقابل الـ Abstract Classالـ Type Hinting مع الواجهاتملخص - حاسبة الأشكال8الميثودات السحرية (Magic Methods)
مقدمة في الميثودات السحرية__toString و __debugInfo__get, __set, __isset, __unset__call و __callStatic__clone واستنساخ الكائنات__serialize و __unserializeمراجعة - Custom Collection3خصائص الكلاس
خصائص الـ Instance مقابل الخصائص الساكنة (Static)الثوابت في الكلاساتالدوال والخصائص الساكنة (Static)الخصائص الخاصة (Private) والمحمية (Protected)خصائص للقراءة فقط (Readonly) في PHP 8.1مراجعة - مدير الحساب البنكي6تعدد الأشكال (Polymorphism)
مراجعة إعادة تعريف الدوال (Method Overriding)تعدد الأشكال عبر الـ Interfacesتلميح النوع (Type Hinting) وأنواع الاتحاد (Union Types)الربط الاستاتيكي المتأخر (Late Static Binding)ملخص - معالج الدفع (Payment Processor)تدرّب بنفسك: مترجم PHP عبر الإنترنت