مقدمة في أنماط التصميم
جزء من قسم Object Oriented Programming في رحلة C# على Coddy — الدرس 51 من 70.
تُعد أنماط التصميم حلولاً مجربة للمشاكل الشائعة التي يواجهها المطورون بشكل متكرر عند بناء البرمجيات. وبدلاً من إعادة اختراع العجلة في كل مرة، تمنحنا هذه الأنماط مفردات مشتركة وأساليب مختبرة لهيكلة الكود.
فكر في أنماط التصميم (design patterns) كأنها مخططات. فهي لا تمنحك كوداً برمجياً دقيقاً لنسخه، ولكنها تصف كيفية تنظيم الفئات (classes) والكائنات (objects) لحل تحديات معينة. عندما يذكر شخص ما "استخدم نمط Factory هنا"، يفهم المطورون ذوو الخبرة على الفور الهيكل العام المقترح.
تنقسم أنماط التصميم إلى ثلاث فئات رئيسية:
| الفئة | الغرض | الأمثلة |
|---|---|---|
| إنشائية | كيفية إنشاء الكائنات | Singleton, Factory |
| هيكلية | كيفية تكوين الكائنات | Adapter, Decorator |
| سلوكية | كيفية تواصل الكائنات | Observer, Strategy |
تعتمد الأنماط التي سنستكشفها بشكل مباشر على مفاهيم البرمجة كائنية التوجه (OOP) التي تعلمتها بالفعل - الواجهات (interfaces)، والوراثة (inheritance)، وتعدد الأشكال (polymorphism)، والتكوين (composition). يستفيد كل نمط من هذه الأساسيات بطرق محددة لتحقيق المرونة، أو قابلية الصيانة، أو قابلية إعادة الاستخدام.
في الدروس القادمة، ستقوم بتنفيذ العديد من الأنماط الأساسية بدءاً من Singleton و Factory و Observer و Strategy. سيساعدك فهم هذه الأنماط على التعرف على الحلول الشائعة في قواعد الكود الحالية واتخاذ قرارات معمارية أفضل في مشاريعك الخاصة.
التحدي
سهللنقم ببناء نظام بسيط لكتالوج الأنماط يقوم بتنظيم معلومات أنماط التصميم عبر ملفات متعددة. سيساعدك هذا على فهم كيفية تصنيف الأنماط مع ممارسة التنظيم الجيد للكود.
ستقوم بإنشاء ثلاثة ملفات لفصل المسؤوليات المختلفة:
Pattern.cs: قم بتعريف فئةPatternداخل مساحة الأسماءPatternsوالتي تمثل نمط تصميم واحد. يجب أن يكون لكل نمطName، وCategory(Creational، أو Structural، أو Behavioral)، وDescription. قم بتضمين طريقةGetSummary()التي تعيد سلسلة نصية منسقة:[{Category}] {Name}: {Description}PatternCatalog.cs: قم بإنشاء فئةPatternCatalogداخل مساحة الأسماءPatternsتدير مجموعة من الأنماط. يجب أن يكون الكتالوج الخاص بك قادراً على إضافة الأنماط وأن يحتوي على طريقةGetPatternsByCategory(string category)التي تعيد قائمة بجميع الأنماط المطابقة لتلك الفئة. قم أيضاً بتضمين طريقةGetAllSummaries()التي تعيد قائمة بسلاسل الملخصات لجميع الأنماط في الكتالوج.Program.cs: اجمع كل شيء معاً عن طريق إنشاء كتالوج وملئه بالأنماط بناءً على المدخلات. ثم قم بعرض الأنماط التي تمت تصفيتها حسب الفئة.
ستتلقى المدخلات التالية:
- عدد الأنماط المراد إضافتها
- لكل نمط: ثلاثة أسطر تحتوي على الاسم، والفئة، والوصف
- الفئة المراد التصفية بناءً عليها
بعد إضافة جميع الأنماط إلى الكتالوج الخاص بك، قم بطباعة ملخصات الأنماط التي تطابق فئة التصفية، ملخص واحد في كل سطر. إذا لم تتطابق أي أنماط، فقم بطباعة No patterns found.
على سبيل المثال، إذا كانت المدخلات هي:
3
Singleton
Creational
Ensures only one instance exists
Observer
Behavioral
Notifies dependents of state changes
Factory
Creational
Creates objects without specifying exact class
Creationalيجب أن يكون المخرج:
[Creational] Singleton: Ensures only one instance exists
[Creational] Factory: Creates objects without specifying exact classيوضح هذا التحدي كيف أن تنظيم الفئات ذات الصلة في ملفات منفصلة يحافظ على نظافة وقابلية صيانة الكود الخاص بك - وهو مبدأ يصبح أكثر أهمية عندما تقوم بتنفيذ أنماط تصميم فعلية في الدروس القادمة!
ورقة مرجعية
أنماط التصميم هي حلول مجربة لمشاكل شائعة في تطوير البرمجيات. فهي توفر مخططات لتنظيم الفئات والكائنات بدلاً من كود محدد للنسخ.
تندرج أنماط التصميم تحت ثلاث فئات رئيسية:
| الفئة | الغرض | أمثلة |
|---|---|---|
| الإنشائية (Creational) | كيفية إنشاء الكائنات | Singleton, Factory |
| الهيكلية (Structural) | كيفية تكوين الكائنات | Adapter, Decorator |
| السلوكية (Behavioral) | كيفية تواصل الكائنات | Observer, Strategy |
تعتمد أنماط التصميم على مفاهيم البرمجة كائنية التوجه (OOP) مثل interfaces، و inheritance، و polymorphism، و composition لتحقيق المرونة، وقابلية الصيانة، وإعادة الاستخدام.
جرّب بنفسك
using System;
using System.Collections.Generic;
using Patterns;
class Program
{
public static void Main(string[] args)
{
// قراءة عدد الأنماط
int n = Convert.ToInt32(Console.ReadLine());
// إنشاء PatternCatalog جديد
PatternCatalog catalog = new PatternCatalog();
// TODO: قراءة تفاصيل كل نمط (name، category، description)
// وإضافتها إلى الكتالوج
for (int i = 0; i < n; i++)
{
string name = Console.ReadLine();
string category = Console.ReadLine();
string description = Console.ReadLine();
// TODO: إنشاء Pattern وإضافته إلى الكتالوج
}
// قراءة الفئة المراد التصفية بها
string filterCategory = Console.ReadLine();
// TODO: الحصول على الأنماط حسب فئة التصفية
// وطباعة ملخصاتها
// إذا لم تتطابق أي أنماط، اطبع "No patterns found"
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Object Oriented Programming
1أساسيات OOP
الملفات الخارجيةNamespaces والتوجيهاتمقدمة في Classes و Objectsالكلمة المفتاحية 'this'Methods والمعاملاتFields مقابل PropertiesConstructorsObject Initializersمراجعة - آلة حاسبة بسيطة4الوراثة
صيغة الوراثة الأساسية (:)الكلمة المفتاحية 'base'الكلمات المفتاحية Virtual و Overrideالأصناف المختومة (Sealed Classes)الفئة الأساسية 'object'مراجعة - هيكلية الموظفين7ميزات متقدمة
تحميل العوامل (Operator Overloading)المفهرسات (Indexers (this[]))إعادة تعريف ()ToStringدوال التوسعة (Extension Methods)ملخص - Custom List10أنماط التصميم - الجزء الأول
مقدمة في أنماط التصميمنمط Singleton الآمن للخيوط (Thread-Safe)نمط المصنع (Factory Pattern)نمط المراقب (Events)نمط الاستراتيجية (Strategy Pattern)2الخصائص والأعضاء الساكنة (Static Members)
الخصائص المطبقة تلقائيًا (Auto-Implemented Properties)خصائص القراءة فقط والكتابة فقطالحقول والدوال الساكنة (Static)الفئات الساكنة (Static Classes)الأعضاء ذات البنية التعبيرية (Expression-Bodied Members)5تعدد الأشكال والواجهات (Polymorphism & Interfaces)
تعدد الأشكال: وقت التجميع مقابل وقت التشغيلالواجهة مقابل الفئة المجردة (Abstract Class)الواجهات المتعددةالواجهات الصريحةUpcasting و Downcastingملخص - حاسبة الأشكال8مفاهيم البرمجة كائنية التوجه (OOP) المتقدمة
التركيب بدلاً من الوراثةالـ Generics (الأصناف والدوال)الـ Delegates والأحداثالـ Attributes والـ Reflectionواجهة IDisposable وجملة usingأساسيات Dependency Injection