Menu
Coddy logo textTech

Admin-CLI-Interface

Teil des Abschnitts Objektorientierte Programmierung der GO-Journey von Coddy — Lektion 103 von 107.

challenge icon

Aufgabe

Einfach

Lassen Sie uns ein Befehlszeilen-Interface (CLI) für unser Bibliotheksverwaltungssystem mit dem Command Pattern erstellen! Sie werden ein CLI entwickeln, das Admin-Befehle wie das Hinzufügen von Büchern, das Registrieren von Benutzern und das Verwalten von Ausleihvorgängen verarbeitet – alles über eine saubere, erweiterbare Architektur.

Sie werden Ihren Code auf sechs Dateien verteilen:

  • book.go: Ihr Book-Struct mit JSON-Tags für ID, Title, Author, ISBN und Available. Fügen Sie den NewBook-Konstruktor hinzu.
  • user.go: Ihr User-Struct mit JSON-Tags für ID, Name, Email und BorrowedBooks. Fügen Sie den NewUser-Konstruktor hinzu.
  • library.go: Ihr Library-Struct mit Maps für Bücher und Benutzer, zusammen mit den Methoden AddBook, AddUser, Borrow und Return aus den vorherigen Lektionen.
  • commands.go: Hier erwacht das Command Pattern zum Leben! Definieren Sie ein Command-Interface mit einer Execute-Methode, die ein *Library und []string Argumente entgegennimmt und ein String-Ergebnis zurückgibt. Implementieren Sie dann diese Command-Structs:
    • AddBookCommand — erwartet 4 Argumente: id, title, author, isbn. Fügt das Buch hinzu und gibt Book added: [title] zurück
    • AddUserCommand — erwartet 3 Argumente: id, name, email. Fügt den Benutzer hinzu und gibt User added: [name] zurück
    • BorrowCommand — erwartet 2 Argumente: userID, bookID. Gibt bei Erfolg Borrowed: [bookID] zurück, oder Error: [message] bei einem Fehler
    • ReturnCommand — erwartet 2 Argumente: userID, bookID. Gibt bei Erfolg Returned: [bookID] zurück, oder Error: [message] bei einem Fehler
    • ListBooksCommand — benötigt keine Argumente. Gibt die ID und den Titel jedes Buches in separaten Zeilen im Format [id]: [title] zurück, oder No books, wenn die Liste leer ist (sortieren Sie die Bücher nach ID)

    Wenn ein Befehl unzureichende Argumente erhält, geben Sie Error: insufficient arguments zurück

  • cli.go: Erstellen Sie ein CLI-Struct, das einen Pointer auf eine Library und eine Map von Befehlsnamen zu Command-Implementierungen enthält. Erstellen Sie:
    • Den NewCLI-Konstruktor, der das CLI mit einer Bibliothek initialisiert und alle Befehle registriert: addbook, adduser, borrow, return, listbooks
    • Die Run-Methode, die einen Eingabestring entgegennimmt, ihn mit strings.Fields parst, den Befehl nachschlägt und ihn ausführt. Geben Sie No command provided bei leerer Eingabe zurück, oder Unknown command: [name] bei nicht erkannten Befehlen
  • main.go: Erstellen Sie eine Bibliothek und ein CLI und verarbeiten Sie dann Befehle aus der Eingabe. Lesen Sie die Anzahl der Befehle ein und lesen Sie dann jeden Befehlsstring in einer separaten Zeile. Rufen Sie für jeden Befehl Run auf und geben Sie das Ergebnis aus.

Die folgenden Eingaben werden bereitgestellt:

  • Anzahl der Befehle
  • Jeder Befehl als vollständiger String in einer eigenen Zeile

Zum Beispiel, gegeben:

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

Sollte Ihre Ausgabe wie folgt aussehen:

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

Und gegeben:

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

Sollte Ihre Ausgabe wie folgt aussehen:

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

Und gegeben:

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

Sollte Ihre Ausgabe wie folgt aussehen:

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

Beachten Sie, dass das CLI die Details der einzelnen Operationen nicht kennen muss – es schlägt einfach den Befehl nach und delegiert die Ausführung. Dies macht das Hinzufügen neuer Befehle so einfach wie das Erstellen eines neuen Structs, das das Command-Interface implementiert, und dessen Registrierung im CLI!

Probier es selbst

package main

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

func main() {
	// Lies die Anzahl der Befehle
	var n int
	fmt.Scanln(&n)

	// Erstelle einen Scanner, um vollständige Zeilen zu lesen
	scanner := bufio.NewScanner(os.Stdin)

	// TODO: Erstelle eine neue Bibliothek

	// TODO: Erstelle ein neues CLI mit der Bibliothek

	// TODO: Verarbeite jeden Befehl
	// Für jeden der n Befehle:
	// - Lies die Befehlszeile mit scanner.Scan() und scanner.Text()
	// - Führe den Befehl über das CLI aus
	// - Gib das Ergebnis aus

	_ = scanner // Entferne diese Zeile, wenn du den Scanner verwendest
}

Alle Lektionen in Objektorientierte Programmierung