0Pricing
Go Academy · درس

التركيب بدلًا من الوراثة

فلسفة التصميم في Go

التركيب بدلًا من الوراثة درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.

فلسفة تصميم Go

تحذف Go وراثة الأصناف عمدًا. والنهج الاصطلاحي فيها هو التركيب: بناء السلوك عبر الجمع بين أنواع وواجهات صغيرة.

لماذا لا نستخدم الوراثة

تكون أشجار الوراثة العميقة هشة؛ إذ قد ينتشر التغيير في الصنف الأساسي بصورة غير متوقعة. أما التركيب فيُبقي العلاقات واضحة ومرنة.

has-a بدلاً من is-a

بدلاً من نمذجة «Manager is an Employee»، نمذج «Manager has an Employee's data and capabilities» عبر التضمين أو الحقول.

package main

import "fmt"

type Employee struct{ Name string }

func (e Employee) Work() string { return e.Name + " works" }

type Manager struct {
	Employee
	Reports int
}

func main() {
	m := Manager{Employee{"Lin"}, 3}
	fmt.Println(m.Work(), "-", m.Reports, "reports")
}

البرمجة باستخدام الواجهات

حدّد السلوك باستخدام واجهات صغيرة، ثم اقبلها. تكون التطبيقات قابلة للاستبدال ويسهل تبديلها أو إنشاء محاكاة لها.

package main

import "fmt"

type Notifier interface{ Notify(msg string) }

type Email struct{}

func (Email) Notify(msg string) { fmt.Println("email:", msg) }

func alert(n Notifier, m string) { n.Notify(m) }

func main() {
	alert(Email{}, "deploy done")
}

تبديل التطبيقات

بما أن الدالة تعتمد على واجهة، يمكنك تمرير أي تطبيق إليها من دون تغيير الدالة.

package main

import "fmt"

type Notifier interface{ Notify(msg string) }

type Email struct{}
type SMS struct{}

func (Email) Notify(m string) { fmt.Println("email:", m) }
func (SMS) Notify(m string)   { fmt.Println("sms:", m) }

func alert(n Notifier, m string) { n.Notify(m) }

func main() {
	alert(Email{}, "hi")
	alert(SMS{}, "hi")
}

دمج السلوكيات

ضمّن مكوّنات صغيرة متعددة لتجميع نوع غني بالميزات من أجزاء مستقلة وقابلة للاختبار.

package main

import "fmt"

type Logger struct{}

func (Logger) Log(s string) { fmt.Println("log:", s) }

type Cache struct{ data map[string]string }

func (c Cache) Get(k string) string { return c.data[k] }

type Service struct {
	Logger
	Cache
}

func main() {
	s := Service{Cache: Cache{data: map[string]string{"k": "v"}}}
	s.Log("started")
	fmt.Println(s.Get("k"))
}

حقن الاعتماديات

مرّر الاعتماديات، بصفتها واجهات، إلى البُناة بدلاً من تثبيتها مباشرةً في الشيفرة. هذا هو تطبيق للتركيب على مستوى التوصيل.

package main

import "fmt"

type Store interface{ Save(s string) }

type MemStore struct{ items []string }

func (m *MemStore) Save(s string) { m.items = append(m.items, s) }

type App struct{ store Store }

func NewApp(s Store) *App { return &App{store: s} }

func main() {
	app := NewApp(&MemStore{})
	app.store.Save("x")
	fmt.Println("saved")
}

الواجهات الصغيرة أفضل

كلما صغرت الواجهة، زاد عدد الأنواع التي تستوفيها وأصبح اختبارها أسهل. كلما كبرت الواجهة، ضعُف التجريد.

تجنّب الصنف الأساسي الهش

من دون الوراثة، لا يوجد صنف أساسي يمكن أن يتعطّل. يتطور كل جزء مركّب بشكل مستقل، مما يقلل الاقتران.

اقبل الواجهات وأعد البُنى

إرشاد شائع في Go: تقبل الدوال الواجهات، أي المدخلات المرنة، وتعيد بُنى ملموسة، أي مخرجات واضحة وقابلة للاستخدام.

قائمة التحقق من التركيب

  • نمذج has-a، لا is-a
  • ضمّن مكوّنات صغيرة
  • اعتمد على واجهات صغيرة
  • احقن الاعتماديات

اختبار سريع

اختبر معرفتك بفلسفة التركيب.

مراجعة

لقد تعلمت فلسفة التركيب في Go.

  • لا توجد وراثة؛ بل استخدم التركيب مع التضمين والواجهات
  • نمذج has-a بدلاً من is-a
  • برمج باستخدام واجهات صغيرة واحقن الاعتماديات
  • اقبل الواجهات وأعد البُنى

الأسئلة الشائعة

هل درس «التركيب بدلًا من الوراثة» مجاني؟

نعم — نص درس «التركيب بدلًا من الوراثة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.

ماذا ستتعلم في «التركيب بدلًا من الوراثة»؟

فلسفة التصميم في Go تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟

لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «التركيب بدلًا من الوراثة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟

نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. تضمين Struct
  2. تضمين Interface
  3. ترقية الدوال
  4. التركيب بدلًا من الوراثة
← العودة إلى Go Academy