Admin-CLI-Interface
Teil des Abschnitts Objektorientierte Programmierung der GO-Journey von Coddy — Lektion 103 von 107.
Aufgabe
EinfachLassen 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: IhrBook-Struct mit JSON-Tags fürID,Title,Author,ISBNundAvailable. Fügen Sie denNewBook-Konstruktor hinzu.user.go: IhrUser-Struct mit JSON-Tags fürID,Name,EmailundBorrowedBooks. Fügen Sie denNewUser-Konstruktor hinzu.library.go: IhrLibrary-Struct mit Maps für Bücher und Benutzer, zusammen mit den MethodenAddBook,AddUser,BorrowundReturnaus den vorherigen Lektionen.commands.go: Hier erwacht das Command Pattern zum Leben! Definieren Sie einCommand-Interface mit einerExecute-Methode, die ein*Libraryund[]stringArgumente 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 gibtBook added: [title]zurückAddUserCommand— erwartet 3 Argumente: id, name, email. Fügt den Benutzer hinzu und gibtUser added: [name]zurückBorrowCommand— erwartet 2 Argumente: userID, bookID. Gibt bei ErfolgBorrowed: [bookID]zurück, oderError: [message]bei einem FehlerReturnCommand— erwartet 2 Argumente: userID, bookID. Gibt bei ErfolgReturned: [bookID]zurück, oderError: [message]bei einem FehlerListBooksCommand— benötigt keine Argumente. Gibt die ID und den Titel jedes Buches in separaten Zeilen im Format[id]: [title]zurück, oderNo books, wenn die Liste leer ist (sortieren Sie die Bücher nach ID)
Wenn ein Befehl unzureichende Argumente erhält, geben Sie
Error: insufficient argumentszurückcli.go: Erstellen Sie einCLI-Struct, das einen Pointer auf eineLibraryund eine Map von Befehlsnamen zuCommand-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 mitstrings.Fieldsparst, den Befehl nachschlägt und ihn ausführt. Geben SieNo command providedbei leerer Eingabe zurück, oderUnknown command: [name]bei nicht erkannten Befehlen
- Den
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 BefehlRunauf 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 B001Sollte 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 availableUnd gegeben:
4
listbooks
addbook B100 Design-Patterns Gang-of-Four 978-0201633610
listbooks
invalidcmd testSollte Ihre Ausgabe wie folgt aussehen:
No books
Book added: Design-Patterns
B100: Design-Patterns
Unknown command: invalidcmdUnd gegeben:
5
adduser U001 Bob bob@email.com
borrow U001 B001
addbook B001 Golang-Guide John-Smith 123-456
borrow U001 B001
return U001 B001Sollte Ihre Ausgabe wie folgt aussehen:
User added: Bob
Error: book not found
Book added: Golang-Guide
Borrowed: B001
Returned: B001Beachten 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
1Grundlagen der Go OOP
Externe DateienGo Workspace & ModulePackages & ImportsExportierte vs. nicht-exportierte NamenEinführung in OOP in GoStructs als KlassenMethoden für Structs definierenPointer- vs. Value-ReceiverStruct-InitialisierungKonstruktor-FunktionenZusammenfassung – Einfacher Taschenrechner4Interfaces
Einführung in InterfacesImplizite ImplementierungInterface als VertragLeeres Interface (any)Type AssertionType SwitchInterface-KompositionStringer & Error InterfacesRückblick - Formen-Rechner7Kapselung
Exportierte vs. nicht exportierte FelderKapselung auf Paket-EbeneGetter- & Setter-MethodenInformation Hiding in GoZusammenfassung - Studierendendatensätze10Generics (Go 1.18+)
Einführung in GenericsTypparameterType ConstraintsGenerische StructsWorkaround für generische MethodenZusammenfassung – Generische Collection2Vertiefung: Typen & Structs
Basis- & zusammengesetzte TypenBenutzerdefinierte TypdefinitionenStruct TagsAnonyme StructsVerschachtelte StructsZero Values & StandardwerteZusammenfassung - Kontaktbuch5Komposition statt Vererbung
Warum Go keine Vererbung hatGrundlagen des Struct EmbeddingMethod PromotionEinbetten mehrerer StructsEmbedding vs. AggregationShadowing eingebetteter MethodenZusammenfassung – Mitarbeiter-Hierarchie8Fehlerbehandlung & OOP
Das error-InterfaceEigene FehlertypenError Wrapping (fmt.Errorf)Sentinel-Fehlererrors.Is() und errors.As()Panic, Defer und RecoverZusammenfassung – Datei-Parser3Zeiger & Speicher
Zeiger-Grundlagen in GoZeiger auf StructsWertübergabe vs. ReferenzübergabeDie new() FunktionGarbage Collection in GoWiederholung – Linked List Builder6Polymorphismus in Go
Polymorphismus über InterfacesDuck Typing in GoInterface-ErfüllungsregelnPolymorphe CollectionsDependency InjectionZusammenfassung – Payment Processor9Nebenläufigkeit & OOP
Goroutines GrundlagenChannels & KommunikationGepufferte vs. ungepufferte ChannelsSelect-Anweisungsync.Mutex & sync.RWMutexsync.WaitGroupThread-sicheres Struct-DesignZusammenfassung - Worker Pool12Fortgeschrittene OOP-Konzepte
Functional Options PatternBuilder-Pattern in GoMethodenverkettungTyp-Aliase vs. DefinitionenReflection-GrundlagenÜberblick zur Code-Generierung15Projekt: Bibliotheksverwaltung
Projektübersicht & StrukturBuch- und Benutzer-Structs