Menu
Coddy logo textTech

Admin-CLI-Oberfläche

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

challenge icon

Aufgabe

Einfach

Erstellen wir eine Befehlszeilenschnittstelle für unser Bibliotheksverwaltungssystem mithilfe des Befehlsmusters! Du erstellst eine CLI, die Admin-Befehle wie das Hinzufügen von Büchern, das Registrieren von Benutzern und die Verwaltung von Ausleihvorgängen verarbeitet – und das alles durch eine saubere, erweiterbare Architektur.

Du organisierst deinen Code über sechs Dateien:

  • book.go: Deine Book-Struktur mit JSON-Tags für ID, Title, Author, ISBN und Available. Füge den NewBook-Konstruktor hinzu.
  • user.go: Deine User-Struktur mit JSON-Tags für ID, Name, Email und BorrowedBooks. Füge den NewUser-Konstruktor hinzu.
  • library.go: Deine Library-Struktur mit Maps für Bücher und Benutzer sowie den Methoden AddBook, AddUser, Borrow und Return aus den vorherigen Lektionen.
  • commands.go: Hier wird das Befehlsmuster zum Leben erweckt! Definiere ein Command-Interface mit einer Execute-Methode, die einen *Library-Wert und []string-Argumente entgegennimmt und ein String-Ergebnis zurückgibt. Implementiere anschließend diese Befehlsstrukturen:
    • 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] oder bei einem Fehler Error: [message] zurück.
    • ReturnCommand: erwartet 2 Argumente: userID, bookID. Gibt bei Erfolg Returned: [bookID] oder bei einem Fehler Error: [message] zurück.
    • ListBooksCommand: benötigt keine Argumente. Gibt die ID und den Titel jedes Buchs in separaten Zeilen im Format [id]: [title] zurück oder No books, wenn keine Bücher vorhanden sind (Bücher nach ID sortieren).

    Wenn ein Befehl nicht genügend Argumente erhält, gib Error: insufficient arguments zurück.

  • cli.go: Erstelle eine CLI-Struktur, die einen Zeiger auf eine Library und eine Map mit Befehlsnamen und Command-Implementierungen enthält. Erstelle:
    • den NewCLI-Konstruktor, der die CLI mit einer Bibliothek initialisiert und alle Befehle registriert: addbook, adduser, borrow, return, listbooks
    • die Run-Methode, die einen Eingabestring entgegennimmt, ihn mithilfe von strings.Fields analysiert, den Befehl sucht und ihn ausführt. Gib bei leerer Eingabe No command provided oder bei unbekannten Befehlen Unknown command: [name] zurück.
  • main.go: Erstelle eine Bibliothek und eine CLI und verarbeite anschließend Befehle aus der Eingabe. Lies die Anzahl der Befehle ein und anschließend jeden Befehlsstring in einer eigenen Zeile. Rufe für jeden Befehl Run auf und gib das Ergebnis aus.

Die folgenden Eingaben werden bereitgestellt:

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

Beispiel für folgende Eingabe:

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

Deine Ausgabe sollte folgendermaßen 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 bei folgender Eingabe:

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

Deine Ausgabe sollte folgendermaßen aussehen:

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

Und bei folgender Eingabe:

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

Deine Ausgabe sollte folgendermaßen aussehen:

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

Beachte, dass die CLI die Details der einzelnen Vorgänge nicht kennen muss. Sie sucht einfach den Befehl und delegiert die Ausführung. Dadurch ist das Hinzufügen neuer Befehle so einfach wie das Erstellen einer neuen Struktur, die das Command-Interface implementiert, und deren Registrierung in der CLI!

Probier es selbst

package main

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

func main() {
	// Lese 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 Library

	// TODO: Erstelle eine neue CLI mit der Library

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

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

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Go-Compiler