Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

مقدمة في أنماط التصميم

جزء من قسم 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.

challenge icon

التحدي

سهل

لنقم ببناء نظام بسيط لتنسيق الرسائل يوضح كيف تساعد أنماط التصميم في تنظيم الكود. ستحدد فئة النمط التي ينتمي إليها كل مكون وترى كيف تعمل الأجزاء المختلفة من النظام معاً.

ستقوم بتنظيم الكود الخاص بك عبر ثلاثة ملفات:

  • 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"

?>
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Object Oriented Programming