Menu
Coddy logo textTech

ממשק CLI למנהל המערכת

חלק מהיחידה תכנות מונחה עצמים במסלול ה-GO של Coddy. שיעור 103 מתוך 107.

challenge icon

אתגר

קל

בואו נבנה ממשק שורת פקודה למערכת ניהול הספרייה שלנו באמצעות דפוס הפקודה! תיצרו CLI שמעבד פקודות מנהל כמו הוספת ספרים, רישום משתמשים וניהול פעולות השאלה: הכול באמצעות ארכיטקטורה נקייה וניתנת להרחבה.

תארגנו את הקוד שלכם בשישה קבצים:

  • book.go: המבנה Book שלכם, עם תגיות JSON עבור ID, Title, Author, ISBN ו-Available. כללו את הבנאי NewBook.
  • user.go: המבנה User שלכם, עם תגיות JSON עבור ID, Name, Email ו-BorrowedBooks. כללו את הבנאי NewUser.
  • library.go: המבנה Library שלכם עם מפות עבור ספרים ומשתמשים, יחד עם המתודות AddBook,‏ AddUser,‏ Borrow ו-Return מהשיעורים הקודמים.
  • commands.go: כאן דפוס הפקודה מתעורר לחיים! הגדירו ממשק Command עם מתודת Execute שמקבלת *Library ו-[]string כארגומנטים, ומחזירה תוצאה מסוג string. לאחר מכן, ממשו את מבני הפקודות האלה:
    • AddBookCommand: מצפה ל-4 ארגומנטים: מזהה, כותרת, מחבר, ISBN. מוסיפה את הספר ומחזירה Book added: [title]
    • AddUserCommand: מצפה ל-3 ארגומנטים: מזהה, שם, דוא"ל. מוסיפה את המשתמש ומחזירה User added: [name]
    • BorrowCommand: מצפה ל-2 ארגומנטים: userID,‏ bookID. מחזירה Borrowed: [bookID] במקרה של הצלחה, או Error: [message] במקרה של כישלון
    • ReturnCommand: מצפה ל-2 ארגומנטים: userID,‏ bookID. מחזירה Returned: [bookID] במקרה של הצלחה, או Error: [message] במקרה של כישלון
    • ListBooksCommand: לא מקבלת ארגומנטים. מחזירה את המזהה והכותרת של כל ספר, כל אחד בשורה נפרדת ובתבנית [id]: [title], או No books אם הרשימה ריקה (מיינו את הספרים לפי מזהה)

    אם פקודה מקבלת מספר לא מספיק של ארגומנטים, החזירו Error: insufficient arguments

  • cli.go: צרו מבנה CLI שמכיל מצביע ל-Library ומפה של שמות פקודות למימושי Command. בנו:
    • בנאי NewCLI שמאתחל את ה-CLI עם ספרייה ורושם את כל הפקודות: addbook,‏ adduser,‏ borrow,‏ return,‏ listbooks
    • מתודת Run שמקבלת מחרוזת קלט, מנתחת אותה באמצעות strings.Fields, מחפשת את הפקודה ומבצעת אותה. החזירו No command provided עבור קלט ריק, או Unknown command: [name] עבור פקודות לא מוכרות
  • main.go: צרו ספרייה ו-CLI, ואז עבדו את הפקודות מהקלט. קראו את מספר הפקודות, ואז קראו כל מחרוזת פקודה בשורה נפרדת. עבור כל פקודה, קראו ל-Run והדפיסו את התוצאה.

הקלטים הבאים יסופקו:

  • מספר הפקודות
  • כל פקודה כמחרוזת שלמה בשורה משלה

לדוגמה, בהינתן:

6
addbook B001 Go-Programming Alan-Donovan 978-0134190440
addbook B002 Clean-Code Robert-Martin 978-0132350884
adduser U001 Alice alice@test.com
borrow U001 B001
listbooks
borrow U001 B001

הפלט שלכם צריך להיות:

Book added: Go-Programming
Book added: Clean-Code
User added: Alice
Borrowed: B001
B001: Go-Programming
B002: Clean-Code
Error: book not available

ובהינתן:

4
listbooks
addbook B100 Design-Patterns Gang-of-Four 978-0201633610
listbooks
invalidcmd test

הפלט שלכם צריך להיות:

No books
Book added: Design-Patterns
B100: Design-Patterns
Unknown command: invalidcmd

ובהינתן:

5
adduser U001 Bob bob@email.com
borrow U001 B001
addbook B001 Golang-Guide John-Smith 123-456
borrow U001 B001
return U001 B001

הפלט שלכם צריך להיות:

User added: Bob
Error: book not found
Book added: Golang-Guide
Borrowed: B001
Returned: B001

שימו לב שה-CLI לא צריך להכיר את הפרטים של כל פעולה. הוא פשוט מחפש את הפקודה ומעביר אליה את הביצוע. כך הוספת פקודות חדשות פשוטה כמו יצירת מבנה חדש שמממש את הממשק Command ורישומו ב-CLI!

נסו בעצמכם

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	// קראו את מספר הפקודות
	var n int
	fmt.Scanln(&n)

	// צרו סורק לקריאת שורות שלמות
	scanner := bufio.NewScanner(os.Stdin)

	// TODO: צרו Library חדשה

	// TODO: צרו CLI חדש עם הספרייה

	// TODO: עבדו כל פקודה
	// עבור כל אחת מ־n הפקודות:
	// - קראו את שורת הפקודה באמצעות scanner.Scan() ו־scanner.Text()
	// - הריצו את הפקודה דרך ה־CLI
	// - הדפיסו את התוצאה

	_ = scanner // הסירו את השורה הזאת כשתשתמשו ב־scanner
}

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר Go אונליין