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

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

جزء من قسم Object Oriented Programming في رحلة GO على Coddy — الدرس 85 من 107.

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

عادةً ما يتم تصنيف أنماط التصميم إلى ثلاث فئات:

الفئةالغرضالأمثلة
الإنشائية (Creational)آليات إنشاء الكائناتSingleton, Factory, Builder
الهيكلية (Structural)تكوين الأنواع في هياكل أكبرAdapter, Decorator, Composite
السلوكية (Behavioral)التواصل بين الكائناتObserver, Strategy, Command

في لغة Go، تبدو أنماط التصميم مختلفة عما هي عليه في لغات البرمجة كائنية التوجه (OOP) التقليدية.

بدون الأصناف (classes) أو الوراثة (inheritance)، تقوم لغة Go بتنفيذ الأنماط باستخدام الواجهات (interfaces)، وتضمين الهياكل (struct embedding)، والتركيب (composition). على سبيل المثال، حيث قد تستخدم Java صنفاً مجرداً (abstract class)، تستخدم Go واجهة (interface). وحيث قد تستخدم C++ الوراثة (inheritance)، تستخدم Go التضمين (embedding).

يساعدك تعلم الأنماط على التعرف على المشكلات الشائعة وتوصيل الحلول بفعالية مع المطورين الآخرين. فعندما يذكر شخص ما "استخدم نمط Strategy هنا"، يفهم الفريق بأكمله النهج المتبع دون الحاجة إلى تفسيرات مطولة.

خلال الدروس القادمة، ستقوم بتنفيذ العديد من الأنماط الأساسية في Go، بدءاً بالأنماط الإنشائية مثل Singleton و Factory، ثم الانتقال إلى الأنماط السلوكية مثل Observer و Strategy.

challenge icon

التحدي

سهل

لنقم ببناء نظام إشعارات بسيط يوضح كيف تساعد أنماط التصميم في تنظيم الكود! ستقوم بإنشاء هيكل يمكن توسيعه بسهولة باستخدام أنماط مثل Observer أو Strategy في الدروس المستقبلية — ولكن في الوقت الحالي، ركز على إعداد واجهات (interfaces) وأنواع نظيفة تتبع مبادئ البرمجة كائنية التوجه (OOP) الجيدة.

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

  • notifier.go: حدد الواجهة الأساسية والأنواع لنظام الإشعارات الخاص بك.

    قم بإنشاء واجهة Notifier بطريقة واحدة Send(message string) string تعيد رسالة تأكيد.

    قم بتنفيذ نوعين ملموسين من الإشعارات:

    • EmailNotifier مع حقل Address — تعيد طريقة Send الخاصة به Email to [address]: [message]
    • SMSNotifier مع حقل PhoneNumber — تعيد طريقة Send الخاصة به SMS to [phone]: [message]
  • dispatcher.go: قم بإنشاء مرسل (dispatcher) يعمل مع أي إشعار من خلال الواجهة.

    قم ببناء هيكل NotificationDispatcher يحتوي على شريحة (slice) من واجهات Notifier. أضف هذه الطرق:

    • AddNotifier(n Notifier) لتسجيل إشعار
    • Broadcast(message string) []string التي ترسل الرسالة عبر جميع الإشعارات المسجلة وتعيد شريحة من جميع سلاسل التأكيد

    قم أيضًا بإنشاء منشئ NewNotificationDispatcher() يعيد مرسلاً مهيأً.

  • main.go: قم بإعداد الإشعارات وبث الرسائل.

    اقرأ عدد الإشعارات المراد إنشاؤها. لكل إشعار، اقرأ نوعه (email أو sms) ووجهته (العنوان أو رقم الهاتف). أضف كل منها إلى المرسل.

    ثم اقرأ رسالة لبثها. أرسلها عبر جميع الإشعارات واطبع كل تأكيد في سطر خاص به.

سيتم توفير المدخلات التالية:

  • السطر 1: عدد الإشعارات
  • لكل إشعار: النوع (email أو sms)، ثم الوجهة
  • السطر الأخير: الرسالة المراد بثها

على سبيل المثال، إذا كان المعطى:

3
email
alice@example.com
sms
555-1234
email
bob@example.com
Server maintenance at midnight

يجب أن يكون مخرجك:

Email to alice@example.com: Server maintenance at midnight
SMS to 555-1234: Server maintenance at midnight
Email to bob@example.com: Server maintenance at midnight

وإذا كان المعطى:

2
sms
555-9999
sms
555-0000
Meeting canceled

يجب أن يكون مخرجك:

SMS to 555-9999: Meeting canceled
SMS to 555-0000: Meeting canceled

يوضح هذا الهيكل كيف تمكن الواجهات من إنشاء تصميمات مرنة وقابلة للتوسع. لا يعرف المرسل (dispatcher) أنواع الإشعارات المحددة — هو يعرف فقط أنها تستطيع تنفيذ Send. هذا هو الأساس الذي تبنى عليه أنماط مثل Observer و Strategy!

ورقة مرجعية

أنماط التصميم (Design patterns) هي حلول قابلة لإعادة الاستخدام لمشاكل شائعة في تصميم البرمجيات. وهي عبارة عن قوالب توجه كيفية هيكلة الأنواع وتفاعلاتها.

تُصنف أنماط التصميم إلى ثلاث فئات:

الفئةالغرضأمثلة
إنشائية (Creational)آليات إنشاء الكائناتSingleton, Factory, Builder
هيكلية (Structural)تركيب الأنواع في هياكل أكبرAdapter, Decorator, Composite
سلوكية (Behavioral)التواصل بين الكائناتObserver, Strategy, Command

في لغة Go، يتم تنفيذ أنماط التصميم باستخدام interfaces و struct embedding و composition بدلاً من classes و inheritance. وحيث تستخدم لغات OOP التقليدية abstract classes، تستخدم Go الـ interfaces. وحيث تستخدم الوراثة، تستخدم Go الـ embedding.

جرّب بنفسك

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	reader := bufio.NewReader(os.Stdin)

	// قراءة عدد الـ notifiers
	countStr, _ := reader.ReadString('\n')
	count, _ := strconv.Atoi(strings.TrimSpace(countStr))

	// إنشاء dispatcher جديد
	dispatcher := NewNotificationDispatcher()

	// قراءة كل notifier وإضافته إلى الـ dispatcher
	for i := 0; i < count; i++ {
		notifierType, _ := reader.ReadString('\n')
		notifierType = strings.TrimSpace(notifierType)

		destination, _ := reader.ReadString('\n')
		destination = strings.TrimSpace(destination)

		// TODO: إنشاء الـ notifier المناسب بناءً على النوع
		// وإضافته إلى الـ dispatcher
		// Hint: تحقق مما إذا كان notifierType هو "email" أو "sms"

	}

	// قراءة الرسالة المراد بثها
	message, _ := reader.ReadString('\n')
	message = strings.TrimSpace(message)

	// TODO: بث الرسالة وطباعة كل تأكيد

}
quiz iconاختبر نفسك

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

جميع دروس Object Oriented Programming

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

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