סקירה כללית ומבנה הפרויקט
חלק מהיחידה תכנות מונחה עצמים במסלול ה-GO של Coddy. שיעור 98 מתוך 107.
אתגר
קלבואו נתחיל את פרויקט מערכת ניהול הספרייה בהקמת המבנה הבסיסי! בשלב הראשון הזה תיצרו את התשתית שתתמוך בכל התכונות שנבנה בשיעורים הבאים.
תארגנו את הקוד בשלושה קבצים כדי ליצור הפרדה ברורה בין תחומי האחריות:
book.go: הגדירו מבנהBookשמייצג ספר בספרייה. לכל ספר צריכים להיותID,Title,AuthorוסטטוסAvailable(בוליאני). צרו פונקציית בנאיNewBookשמקבלת את המזהה, הכותרת והמחבר כפרמטרים ומחזירה מצביע ל-Book חדש, כאשרAvailableמוגדר כברירת מחדל ל-true. הוסיפו גם מתודתString()שמחזירה את פרטי הספר בפורמט:[ID] Title by Authoruser.go: הגדירו מבנהUserשמייצג חבר בספרייה, עם השדותID,Nameו-Email. צרו פונקציית בנאיNewUserשמקבלת את שלושת הערכים ומחזירה מצביע ל-User חדש. הוסיפו מתודתString()שמחזירה:User: Name (Email)main.go: חברו את כל החלקים באמצעות קריאת קלט ליצירת ספרים ומשתמשים, ולאחר מכן הציגו את פרטיהם.קראו את מספר הספרים שיש ליצור. עבור כל ספר, קראו את המזהה, הכותרת והמחבר בשורות נפרדות. לאחר מכן קראו את מספר המשתמשים, ועבור כל משתמש קראו את המזהה, השם וכתובת האימייל בשורות נפרדות.
לאחר יצירת כל הפריטים, הדפיסו את הייצוג כמחרוזת של כל ספר בשורה נפרדת, ואחריהם את הייצוג כמחרוזת של כל משתמש בשורה נפרדת.
הקלטים הבאים יסופקו:
- מספר הספרים
- עבור כל ספר: מזהה, כותרת ומחבר (כל אחד בשורה נפרדת)
- מספר המשתמשים
- עבור כל משתמש: מזהה, שם וכתובת אימייל (כל אחד בשורה נפרדת)
לדוגמה, בהינתן:
2
B001
The Go Programming Language
Alan Donovan
B002
Clean Code
Robert Martin
1
U001
Alice Smith
alice@library.comהפלט שלכם צריך להיות:
[B001] The Go Programming Language by Alan Donovan
[B002] Clean Code by Robert Martin
User: Alice Smith (alice@library.com)ובהינתן:
1
B100
Design Patterns
Gang of Four
2
U001
Bob Jones
bob@email.com
U002
Carol White
carol@email.comהפלט שלכם צריך להיות:
[B100] Design Patterns by Gang of Four
User: Bob Jones (bob@email.com)
User: Carol White (carol@email.com)תשתית זו מגדירה את מודלי הנתונים המרכזיים שתפתחו לאורך הפרויקט. בשיעור הבא תשפרו את המבנים האלה ותוסיפו את פונקציונליות ההשאלה!
נסו בעצמכם
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 לאחסון הספרים
// TODO: קרא את פרטי כל ספר (ID, כותרת, מחבר בשורות נפרדות)
// וצור אובייקטים מסוג Book באמצעות NewBook
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)
// TODO: צור ספר חדש והוסף אותו ל-slice שלך
}
// קרא את מספר המשתמשים
numUsersStr, _ := reader.ReadString('\n')
numUsers, _ := strconv.Atoi(strings.TrimSpace(numUsersStr))
// TODO: צור slice לאחסון המשתמשים
// TODO: קרא את פרטי כל משתמש (ID, שם, דוא״ל בשורות נפרדות)
// וצור אובייקטים מסוג User באמצעות NewUser
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: צור משתמש חדש והוסף אותו ל-slice שלך
}
// TODO: הדפס את ייצוג המחרוזת של כל ספר
// TODO: הדפס את ייצוג המחרוזת של כל משתמש
fmt.Println("TODO: Print output here")
}
כל השיעורים ביחידה תכנות מונחה עצמים
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 אונליין