מבני נתונים של ספרים ומשתמשים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-GO של Coddy. שיעור 99 מתוך 107.
אתגר
קלבואו נבנה את מודלי הנתונים המרכזיים של מערכת ניהול הספרייה שלנו! תיצור את המבנים הבסיסיים שמייצגים ספרים וחברי ספרייה, עם פונקציות בנאי שמאתחלות אותם בערכי ברירת מחדל הגיוניים.
תארגן את הקוד שלך בשלושה קבצים:
book.go: הגדר את המבנהBookעם השדותID,Title,Author,ISBNו-Available(בוליאני). צור פונקציית בנאי בשםNewBookשמקבלת את המזהה, הכותרת, המחבר וה-ISBN כפרמטרים ומחזירה מצביע ל-Book חדש. ספרים חדשים צריכים להתחיל תמיד כזמינים. הוסף מתודהInfo()שמחזירה את פרטי הספר בפורמט:[ID] "Title" by Author (ISBN: [isbn]) - Available: [true/false]user.go: הגדר את המבנהUserעם השדותID,Name,Emailו-BorrowedBooks(פרוסה של מחרוזות לאחסון מזהי ספרים). צור פונקציית בנאי בשםNewUserשמקבלת מזהה, שם ודוא"ל, ומחזירה מצביע ל-User חדש עם רשימת ספרים מושאלים ריקה. הוסף מתודהInfo()שמחזירה:Member: [Name] ([Email]) - Books borrowed: [count]main.go: חבר את המודלים שלך על ידי יצירת ספרים ומשתמשים מתוך הקלט, ואז הצגת המידע שלהם.קרא את מספר הספרים, ואז עבור כל ספר קרא את המזהה, הכותרת, המחבר וה-ISBN שלו, כל אחד בשורה נפרדת. לאחר מכן, קרא את מספר המשתמשים, ועבור כל משתמש קרא את המזהה, השם וכתובת הדוא"ל שלו, כל אחד בשורה נפרדת.
הדפס את פרטי כל ספר בשורה נפרדת, ולאחר מכן את פרטי כל משתמש בשורה נפרדת.
הקלטים הבאים יסופקו:
- מספר הספרים
- עבור כל ספר: מזהה, כותרת, מחבר, ISBN (כל אחד בשורה נפרדת)
- מספר המשתמשים
- עבור כל משתמש: מזהה, שם, דוא"ל (כל אחד בשורה נפרדת)
לדוגמה, עבור הקלט:
2
B001
The Go Programming Language
Alan Donovan
978-0134190440
B002
Clean Code
Robert Martin
978-0132350884
1
U001
Alice Smith
alice@library.comהפלט שלך צריך להיות:
[B001] "The Go Programming Language" by Alan Donovan (ISBN: 978-0134190440) - Available: true
[B002] "Clean Code" by Robert Martin (ISBN: 978-0132350884) - Available: true
Member: Alice Smith (alice@library.com) - Books borrowed: 0ועבור הקלט:
1
B100
Design Patterns
Gang of Four
978-0201633610
2
U001
Bob Jones
bob@email.com
U002
Carol White
carol@email.comהפלט שלך צריך להיות:
[B100] "Design Patterns" by Gang of Four (ISBN: 978-0201633610) - Available: true
Member: Bob Jones (bob@email.com) - Books borrowed: 0
Member: Carol White (carol@email.com) - Books borrowed: 0שים לב לאופן שבו הבנאים מטפלים בערכי ברירת המחדל: ספרים מתחילים כזמינים ומשתמשים מתחילים עם אפס ספרים מושאלים. הדפוס הזה של שימוש בפונקציות בנאי כדי להבטיח אתחול תקין הוא יסודי לבניית מערכות אמינות!
נסו בעצמכם
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// קרא את מספר הספרים
numBooksStr, _ := reader.ReadString('\n')
numBooks, _ := strconv.Atoi(strings.TrimSpace(numBooksStr))
// TODO: צור slice לאחסון הספרים
// קרא את הפרטים של כל ספר
for i := 0; i < numBooks; i++ {
id, _ := reader.ReadString('\n')
id = strings.TrimSpace(id)
title, _ := reader.ReadString('\n')
title = strings.TrimSpace(title)
author, _ := reader.ReadString('\n')
author = strings.TrimSpace(author)
isbn, _ := reader.ReadString('\n')
isbn = strings.TrimSpace(isbn)
// TODO: צור ספר חדש באמצעות הבנאי NewBook והוסף אותו ל-slice
}
// קרא את מספר המשתמשים
numUsersStr, _ := reader.ReadString('\n')
numUsers, _ := strconv.Atoi(strings.TrimSpace(numUsersStr))
// TODO: צור slice לאחסון המשתמשים
// קרא את הפרטים של כל משתמש
for i := 0; i < numUsers; i++ {
id, _ := reader.ReadString('\n')
id = strings.TrimSpace(id)
name, _ := reader.ReadString('\n')
name = strings.TrimSpace(name)
email, _ := reader.ReadString('\n')
email = strings.TrimSpace(email)
// TODO: צור משתמש חדש באמצעות הבנאי NewUser והוסף אותו ל-slice
}
// TODO: הדפס את המידע על כל ספר באמצעות המתודה Info()
// TODO: הדפס את המידע על כל משתמש באמצעות המתודה Info()
fmt.Println() // מציין מקום - יש להסיר בעת המימוש
}
כל השיעורים ביחידה תכנות מונחה עצמים
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סקירה כללית של יצירת קוד15פרויקט: ניהול ספרייה
סקירה כללית ומבנה הפרויקטמבני נתונים של ספרים ומשתמשיםתרגלו בעצמכם: קומפיילר Go אונליין