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

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

جزء من قسم البرمجة كائنية التوجه في رحلة 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.

challenge icon

التحدي

سهل

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

ستنظّم شيفرتك عبر ثلاثة ملفات:

  • MessageFormatter.php: أنشئ interface باسم MessageFormatter يعرّف عقدًا لتنسيق الرسائل. يجب أن يحتوي على method واحدة هي format(string $message): string. يمثّل هذا category behavioral. وهو يعرّف how تتواصل objects وتعالج البيانات.
  • Formatters.php: ضمّن ملف MessageFormatter وأنشئ classين يطبّقان interface:
    • UppercaseFormatter: تعيد method format() الخاصة به message بعد تحويلها إلى أحرف كبيرة
    • BracketFormatter: تضع method format() الخاصة به 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"

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

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

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم PHP عبر الإنترنت