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

ملخص - الهيكل الهرمي للموظفين

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

challenge icon

التحدي

سهل

لنقم ببناء نظام تسلسل هرمي للموظفين لشركة ما، يوضح كيف يمكن للتكوين (composition) أن ينمذج الهياكل التنظيمية في العالم الحقيقي بشكل أنيق. ستقوم بإنشاء نوع أساسي للموظف يمكن للأدوار المتخصصة توسيعه بسلوكياتها الفريدة.

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

  • employee.go: قم بإنشاء الأساس باستخدام هيكل Employee يحتوي على حقول ID، و Name، و BaseSalary (float64). امنحه طريقتين (methods):
    • Info() string تعيد [ID] [Name]
    • CalculateBonus() float64 تعيد 10% من الراتب الأساسي
  • roles.go: قم بإنشاء نوعين متخصصين من الموظفين يدمجان Employee:
    • Manager مع حقل TeamSize (int) — يحصل المديرون على مكافأة أعلى: 20% من الراتب الأساسي بالإضافة إلى $100 لكل عضو في الفريق. قم بعمل shadow لطريقة CalculateBonus لتنفيذ ذلك.
    • Developer مع حقل Language (string) — يحتفظ المطورون بالمكافأة القياسية ولكن قم بعمل shadow لطريقة Info لإلحاق لغة البرمجة الخاصة بهم: [ID] [Name] ([Language])
  • main.go: اقرأ تفاصيل الموظفين من المدخلات، وأنشئ مديراً واحداً ومطوراً واحداً، ثم اعرض معلومات كل موظف والمكافأة المحسوبة له.

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

  • السطر 1: معرف المدير (Manager ID)
  • السطر 2: اسم المدير
  • السطر 3: الراتب الأساسي للمدير (float64)
  • السطر 4: حجم فريق المدير (integer)
  • السطر 5: معرف المطور (Developer ID)
  • السطر 6: اسم المطور
  • السطر 7: الراتب الأساسي للمطور (float64)
  • السطر 8: لغة برمجة المطور

لكل موظف، اطبع معلوماته متبوعة بمكافأته في السطر التالي. قم بتنسيق المكافآت بمنزلتين عشريتين.

على سبيل المثال، إذا كانت المدخلات M001، و Sarah Chen، و 80000، و 5، و D001، و Alex Rivera، و 65000، و Go، يجب أن يكون مخرجك:

M001 Sarah Chen
16500.00
D001 Alex Rivera (Go)
6500.00

لاحظ كيف يختلف حساب مكافأة المدير (20% من 80000 + 5×100 = 16500) عن مكافأة المطور القياسية بنسبة 10%، بينما يقوم المطور بتخصيص كيفية عرض معلوماته. لا يزال كلا النوعين يمتلكان حق الوصول إلى حقول Employee المدمجة ويمكنهما استدعاء الطرق الأصلية عند الحاجة.

جرّب بنفسك

package main

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

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

	// قراءة تفاصيل المدير
	managerID, _ := reader.ReadString('\n')
	managerID = strings.TrimSpace(managerID)

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

	managerSalaryStr, _ := reader.ReadString('\n')
	managerSalary, _ := strconv.ParseFloat(strings.TrimSpace(managerSalaryStr), 64)

	teamSizeStr, _ := reader.ReadString('\n')
	teamSize, _ := strconv.Atoi(strings.TrimSpace(teamSizeStr))

	// قراءة تفاصيل المطور
	devID, _ := reader.ReadString('\n')
	devID = strings.TrimSpace(devID)

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

	devSalaryStr, _ := reader.ReadString('\n')
	devSalary, _ := strconv.ParseFloat(strings.TrimSpace(devSalaryStr), 64)

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

	// TODO: إنشاء مدير باستخدام القيم المقروءة
	// تلميح: استخدم التركيب (composition) - المدير يتضمن الموظف

	// TODO: إنشاء مطور باستخدام القيم المقروءة
	// تلميح: استخدم التركيب (composition) - المطور يتضمن الموظف

	// TODO: طباعة معلومات المدير والمكافأة (تنسيق المكافأة إلى منزلتين عشريتين)
	// استخدم fmt.Printf مع "%.2f" للتنسيق

	// TODO: طباعة معلومات المطور والمكافأة (تنسيق المكافأة إلى منزلتين عشريتين)
}

جميع دروس Object Oriented Programming