مقدمة في أنماط التصميم
جزء من قسم Object Oriented Programming في رحلة PHP على Coddy — الدرس 70 من 91.
أنماط التصميم هي حلول مجربة لمشاكل شائعة يواجهها المطورون بشكل متكرر عند بناء البرمجيات. وبدلاً من إعادة اختراع العجلة في كل مرة، يمكنك تطبيق هذه القوالب الراسخة لحل تحديات مماثلة في الكود الخاص بك.
فكر في أنماط التصميم كأنها وصفات طعام. تماماً كما يتبع الطاهي وصفة لتحضير طبق تم إتقانه بمرور الوقت، يستخدم المطورون أنماط التصميم لهيكلة أكوادهم بطرق تم اختبارها وتحسينها من قبل عدد لا يحصى من المبرمجين قبلهم.
تُصنف أنماط التصميم عادةً إلى ثلاث فئات:
| الفئة | الغرض | الأمثلة |
|---|---|---|
| إنشائية | كيفية إنشاء الكائنات | Singleton, Factory |
| هيكلية | كيفية تكوين الكائنات | Adapter, Decorator |
| سلوكية | كيفية تواصل الكائنات | Observer, Strategy |
لقد كنت تستخدم الأنماط بالفعل طوال هذه الدورة التدريبية دون أن تدرك ذلك. فعندما قمت بإنشاء abstract classes مع methods يجب على child classes تنفيذها، كنت تطبق شكلاً من أشكال نمط Template Method. وعندما استخدمت interfaces لتحديد contracts، كنت تمهد لنمط Strategy pattern.
تعلم أنماط التصميم يمنحك لغة مشتركة مع المطورين الآخرين. فبدلاً من شرح هيكل معقد بالتفصيل، يمكنك ببساطة قول "لقد استخدمت نمط Factory هنا" وسيفهم المطورون ذوو الخبرة نهجك على الفور. في الدروس التالية، سنقوم بتنفيذ العديد من الأنماط الأساسية في PHP.
التحدي
سهللنقم ببناء نظام بسيط لتنسيق الرسائل يوضح كيف تساعد أنماط التصميم في تنظيم الكود. ستحدد فئة النمط التي ينتمي إليها كل مكون وترى كيف تعمل الأجزاء المختلفة من النظام معاً.
ستقوم بتنظيم الكود الخاص بك عبر ثلاثة ملفات:
MessageFormatter.php— أنشئ واجهة (interface) تسمىMessageFormatterتحدد عقداً لتنسيق الرسائل. يجب أن تحتوي على طريقة واحدةformat(string $message): string. يمثل هذا الفئة behavioral — فهي تحدد كيفية تواصل الكائنات ومعالجة البيانات.Formatters.php— قم بتضمين ملف MessageFormatter وأنشئ فئتين (classes) تنفذان هذه الواجهة:UppercaseFormatter— تقوم طريقةformat()الخاصة بها بإرجاع الرسالة محولة إلى أحرف كبيرة (uppercase)BracketFormatter— تقوم طريقةformat()الخاصة بها بتغليف الرسالة بين أقواس مربعة مثل[message]
main.php— قم بتضمين ملف Formatters. ستتلقى مدخلين: سلسلة نصية للرسالة ونوع المنسق ("upper"أو"bracket").أنشئ دالة تسمى
processMessageتقبلMessageFormatterوسلسلة نصية للرسالة، ثم تعيد النتيجة المنسقة. لا تحتاج هذه الدالة إلى معرفة المنسق المحدد الذي تتلقاه — فهي تستدعي فقطformat()على أي كائن يتم تمريره إليها.بناءً على نوع المنسق المدخل، أنشئ كائن المنسق المناسب. مرره إلى دالة
processMessageالخاصة بك مع الرسالة، واطبع النتيجة.في سطر جديد، اطبع فئة النمط التي يمثلها هذا الهيكل. بما أننا نحدد سلوكيات قابلة للتبديل من خلال واجهة، اطبع:
Pattern category: Behavioral
يوضح هذا التحدي كيف تسمح لك الواجهات بتبديل التنفيذات دون تغيير الكود الذي يستخدمها — وهو أساس لأنماط مثل Strategy التي ستستكشفها في الدروس القادمة.
ورقة مرجعية
أنماط التصميم هي حلول مجربة لمشاكل البرمجة الشائعة التي توفر قوالب لهيكلة الكود بشكل فعال.
يتم تجميع أنماط التصميم في ثلاث فئات:
| الفئة | الغرض | أمثلة |
|---|---|---|
| إنشائية (Creational) | كيفية إنشاء الكائنات | Singleton, Factory |
| هيكلية (Structural) | كيفية تكوين الكائنات | Adapter, Decorator |
| سلوكية (Behavioral) | كيفية تواصل الكائنات | Observer, Strategy |
توفر أنماط التصميم مفردات مشتركة بين المطورين، مما يسهل التواصل بشأن القرارات المعمارية المعقدة.
جرّب بنفسك
<?php
require_once 'Formatters.php';
// قراءة المدخلات
$message = trim(fgets(STDIN));
$formatterType = trim(fgets(STDIN));
// TODO: قم بإنشاء دالة تسمى processMessage تقبل MessageFormatter
// وسلسلة نصية للرسالة، ثم تعيد النتيجة المنسقة
// TODO: بناءً على $formatterType ("upper" أو "bracket")، قم بإنشاء المنسق المناسب
// TODO: قم باستدعاء processMessage مع المنسق والرسالة، ثم اطبع النتيجة
// TODO: اطبع فئة النمط (pattern category) في سطر جديد
// Format: "Pattern category: Behavioral"
?>يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Object Oriented Programming
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)