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

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

جزء من قسم البرمجة كائنية التوجه في رحلة C++ على Coddy. الدرس 90 من 104.

design patterns هي حلول مُثبتة وقابلة لإعادة الاستخدام للمشكلات الشائعة التي تنشأ في design البرمجيات. إنها ليست شيفرة تنسخها مباشرةً، بل قوالب أو مخططات تصف كيفية هيكلة الفئات والكائنات لحل تحديات محددة بأناقة.

شاع هذا المفهوم بفضل "Gang of Four" (GoF) في كتابهم الصادر عام 1994، والذي صنّف 23 نمطًا أساسيًا. تُجمّع هذه الأنماط عادةً ضمن ثلاث فئات:

Category الغرض أمثلة
Creational آليات إنشاء Object Singleton، Factory، Builder
هيكلية تركيب Class وObject Adapter، Decorator، Composite
Behavioral تفاعل Object والمسؤولية Observer، Strategy، Command

لماذا تتعلم أنماط التصميم؟ إنها توفر مفردات مشتركة بين المطورين؛ فقولك «استخدم Factory هنا» ينقل فكرة معقدة على الفور. كما أنها تساعدك على تجنب إعادة ابتكار الحلول، وتجعل شفرتك أكثر مرونة وأسهل في الصيانة.

في C++، تستفيد أنماط التصميم من ميزات OOP التي تعلمتها بالفعل: الوراثة، وتعدد الأشكال، والفئات المجرّدة، والقوالب. في الدروس القادمة، ستنفّذ عدة أنماط أساسية وستفهم متى يكون كل نمط منها الأداة المناسبة للمهمة.

challenge icon

التحدي

سهل

لنبنِ مُصنِّفًا بسيطًا لـ pattern يوضح فهمك للفئات الثلاث لـ design pattern. ستنشئ نظامًا يأخذ اسم pattern ويحدد الفئة التي ينتمي إليها، Creational أو Structural أو Behavioral، إلى جانب وصف موجز لغرض تلك الفئة.

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

  • PatternCategory.h: عرّف base class مجردًا باسم PatternCategory يمثل فئة design pattern. يجب أن يحتوي على:
    • method افتراضية محضة getName() تُرجع اسم الفئة كسلسلة نصية
    • method افتراضية محضة getPurpose() تُرجع وصفًا لما تفعله patterns في هذه الفئة
    • مدمّر افتراضي

    ثم أنشئ ثلاث classes مشتقة ترث من PatternCategory:

    • CreationalCategory: تُرجع الاسم "Creational" والغرض "Object creation mechanisms"
    • StructuralCategory: تُرجع الاسم "Structural" والغرض "Class and object composition"
    • BehavioralCategory: تُرجع الاسم "Behavioral" والغرض "Object interaction and responsibility"
  • PatternClassifier.h: أنشئ class باسم PatternClassifier يمكنه تحديد الفئة التي ينتمي إليها pattern معيّن.

    يجب أن يحتوي classifier الخاص بك على method باسم classify يأخذ اسم pattern (سلسلة نصية) ويُرجع مؤشرًا إلى PatternCategory المناسبة. استخدم المؤشرات الذكية (std::unique_ptr) لإدارة memory.

    يجب أن يتعرف classifier على هذه patterns:

    • Creational: Singleton وFactory وBuilder
    • Structural: Adapter وDecorator وComposite
    • Behavioral: Observer وStrategy وCommand

    إذا لم يتم التعرف على اسم pattern، فأعد nullptr.

  • main.cpp: اقرأ input واحدًا: اسم design pattern.

    أنشئ PatternClassifier واستخدمه لتصنيف pattern المُدخل. إذا تم التعرف على pattern، اطبع:

    [PatternName] is a [CategoryName] pattern
    Purpose: [CategoryPurpose]

    إذا لم يتم التعرف على pattern، اطبع:

    Unknown pattern: [PatternName]

على سبيل المثال، مع input هو Singleton:

Singleton is a Creational pattern
Purpose: Object creation mechanisms

مع input هو Observer:

Observer is a Behavioral pattern
Purpose: Object interaction and responsibility

مع input هو Proxy:

Unknown pattern: Proxy

يعزز هذا التحدي الفئات الثلاث لـ design patterns، مع التدريب على inheritance وpolymorphism والمؤشرات الذكية: وهي جميعها مفاهيم أتقنتها بالفعل. تعكس البنية متعددة الملفات الطريقة التي تنظم بها المشاريع الحقيقية classes المرتبطة.

جرّب بنفسك

#include <iostream>
#include <string>
#include "PatternClassifier.h"

int main() {
    // اقرأ اسم النمط
    std::string patternName;
    std::cin >> patternName;
    
    // TODO: أنشئ مثيلاً من PatternClassifier
    
    // TODO: استخدم المصنف لتصنيف النمط المدخل
    
    // TODO: إذا تم التعرف على النمط، اطبع:
    // "[PatternName] is a [CategoryName] pattern"
    // "Purpose: [CategoryPurpose]"
    
    // TODO: إذا لم يتم التعرف على النمط (nullptr)، اطبع:
    // "Unknown pattern: [PatternName]"
    
    return 0;
}
quiz iconاختبر نفسك

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

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

13أنماط التصميم - الجزء الأول

مقدمة في أنماط التصميمنمط Singletonنمط Factory و Abstract Factoryنمط Builderنمط Observerنمط Strategy

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