סיכום – היררכיית עובדים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-GO של Coddy. שיעור 40 מתוך 107.
אתגר
קלבואו נבנה מערכת היררכיית עובדים עבור חברה, שתדגים כיצד הרכבה ממדלת באלגנטיות מבנים ארגוניים מהעולם האמיתי. תיצרו סוג עובד בסיסי שתפקידים ייעודיים יוכלו להרחיב באמצעות התנהגויות ייחודיות משלהם.
תארגנו את הקוד שלכם בשלושה קבצים:
employee.go: צרו את הבסיס באמצעות struct בשםEmployeeשמכיל את השדותID,Nameו-BaseSalary(float64). הוסיפו לו שתי מתודות:Info() stringשמחזירה[ID] [Name]CalculateBonus() float64שמחזירה 10% משכר הבסיס
roles.go: צרו שני סוגי עובדים ייעודיים שמטמיעים אתEmployee:Managerעם שדהTeamSize(int): מנהלים מקבלים בונוס גבוה יותר — 20% משכר הבסיס ועוד $100 לכל חבר צוות. הסוו את המתודהCalculateBonusכדי לממש זאת.Developerעם שדהLanguage(string): מפתחים מקבלים את הבונוס הרגיל, אך מסווים את המתודהInfoכדי להוסיף את שפת התכנות שלהם:[ID] [Name] ([Language])
main.go: קראו את פרטי העובדים מהקלט, צרו Manager אחד ו-Developer אחד, ואז הציגו את המידע והבונוס המחושב של כל עובד.
הקלט הבא יסופק:
- שורה 1: מזהה המנהל
- שורה 2: שם המנהל
- שורה 3: שכר הבסיס של המנהל (float64)
- שורה 4: גודל הצוות של המנהל (מספר שלם)
- שורה 5: מזהה המפתח
- שורה 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שימו לב כיצד חישוב הבונוס של Manager (20% מ-80000 + 5×100 = 16500) שונה מהבונוס הרגיל של 10% של Developer, בעוד Developer מתאים אישית את אופן הצגת המידע שלו. לשני הסוגים עדיין יש גישה לשדות של Employee שהוטמע בהם, והם יכולים לקרוא למתודות המקוריות בעת הצורך.
נסו בעצמכם
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// קראו את פרטי ה-Manager
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))
// קראו את פרטי ה-Developer
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: צרו Manager באמצעות הערכים שנקראו
// רמז: השתמשו בהרכבה - Manager מטמיע את Employee
// TODO: צרו Developer באמצעות הערכים שנקראו
// רמז: השתמשו בהרכבה - Developer מטמיע את Employee
// TODO: הדפיסו את פרטי המנהל ואת הבונוס (הבונוס מעוצב עם 2 ספרות אחרי הנקודה העשרונית)
// השתמשו ב-fmt.Printf עם "%.2f" לצורך העיצוב
// TODO: הדפיסו את פרטי המפתח ואת הבונוס (הבונוס מעוצב עם 2 ספרות אחרי הנקודה העשרונית)
}
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות OOP ב-Go
קבצים חיצונייםסביבת העבודה והמודולים של Goחבילות וייבואשמות מיוצאים לעומת שמות לא מיוצאיםמבוא ל-OOP ב-GoStructs כמחלקותהגדרת מתודות עבור Structsמקבלי Pointer לעומת Valueאתחול Structפונקציות Constructorחזרה – מחשבון פשוט4ממשקים
מבוא לממשקיםמימוש משתמעממשק כחוזהממשק ריק (any)אימות טיפוסמתג טיפוסיםהרכבת ממשקיםממשקי Stringer ו-Errorסיכום – מחשבון צורות7כימוס
שדות מיוצאים לעומת שדות לא מיוצאיםכימוס ברמת החבילהמתודות Getter ו-Setterהסתרת מידע ב-Goסיכום – רשומות תלמידים10Generics (Go 1.18 ומעלה)
מבוא ל־Genericsפרמטרים של טיפוסיםאילוצי טיפוסיםמבנים גנרייםפתרון עוקף למתודות גנריותסיכום – אוסף גנרי2העמקה בסוגים וב-Structs
סוגים בסיסיים ומורכביםהגדרות של סוגים מותאמים אישיתתגיות StructStructs אנונימייםStructs מקונניםערכי אפס וברירות מחדלסיכום – ספר אנשי קשר5קומפוזיציה במקום ירושה
למה ב-Go אין ירושהיסודות הטמעת Structקידום מתודותהטמעת כמה Structsהטמעה לעומת אגרגציההסתרת מתודות מוטמעותסיכום – היררכיית עובדים8טיפול בשגיאות ו-OOP
ממשק errorסוגי שגיאות מותאמים אישיתעטיפת שגיאות (fmt.Errorf)שגיאות Sentinelerrors.Is() ו-errors.As()Panic, Defer ו-Recoverסיכום – מנתח קבצים11ספרייה סטנדרטית ותכנות מונחה עצמים
io.Reader ו-io.Writersort.Interfaceהממשק fmt.Stringerencoding/json עם מבניםהממשק http.Handlerסיכום – מודלים של REST API3מצביעים וזיכרון
יסודות המצביעים ב-Goמצביעים למבניםהעברה לפי ערך לעומת לפי הפניההפונקציה new()איסוף אשפה ב-Goסיכום - בונה רשימה מקושרת6פולימורפיזם ב-Go
פולימורפיזם באמצעות ממשקיםטיפוס ברווז ב-Goכללי התאמה לממשקאוספים פולימורפייםהזרקת תלויותסיכום - מעבד תשלומים9מקביליות ו-OOP
יסודות GoroutinesChannels ותקשורתChannel עם חוצץ לעומת ללא חוצץפקודת Selectsync.Mutex ו-sync.RWMutexsync.WaitGroupתכנון Struct בטוח לשימוש במקבילסיכום - מאגר עובדים12מושגים מתקדמים בתכנות מונחה עצמים
דפוס האפשרויות הפונקציונליותדפוס Builder ב-Goשרשור מתודותכינויי טיפוסים לעומת הגדרותיסודות Reflectionסקירה כללית של יצירת קודתרגלו בעצמכם: קומפיילר Go אונליין