Interfejs CLI administratora
Część sekcji Programowanie obiektowe ścieżki GO w Coddy. Lekcja 103 z 107.
Wyzwanie
ŁatwyZbudujmy interfejs wiersza poleceń dla naszego systemu zarządzania biblioteką, korzystając ze wzorca Command! Utworzysz CLI, które obsługuje polecenia administratora, takie jak dodawanie książek, rejestrowanie użytkowników i zarządzanie wypożyczeniami — wszystko w ramach przejrzystej, rozszerzalnej architektury.
Rozmieścisz kod w sześciu plikach:
book.go: strukturaBookz tagami JSON dla pólID,Title,Author,ISBNiAvailable. Dodaj konstruktorNewBook.user.go: strukturaUserz tagami JSON dla pólID,Name,EmailiBorrowedBooks. Dodaj konstruktorNewUser.library.go: strukturaLibraryz mapami książek i użytkowników oraz metodamiAddBook,AddUser,BorrowiReturnz poprzednich lekcji.commands.go: tutaj wzorzec Command nabiera życia! Zdefiniuj interfejsCommandz metodąExecute, która przyjmuje*Libraryi argumenty[]string, a zwraca wynik w postaci ciągu znaków. Następnie zaimplementuj następujące struktury poleceń:AddBookCommand: oczekuje 4 argumentów: id, title, author, isbn. Dodaje książkę i zwracaBook added: [title]AddUserCommand: oczekuje 3 argumentów: id, name, email. Dodaje użytkownika i zwracaUser added: [name]BorrowCommand: oczekuje 2 argumentów: userID, bookID. W przypadku powodzenia zwracaBorrowed: [bookID], a w przypadku niepowodzeniaError: [message]ReturnCommand: oczekuje 2 argumentów: userID, bookID. W przypadku powodzenia zwracaReturned: [bookID], a w przypadku niepowodzeniaError: [message]ListBooksCommand: nie przyjmuje argumentów. Zwraca ID i tytuł każdej książki w osobnych wierszach, w formacie[id]: [title], alboNo books, jeśli lista jest pusta (posortuj książki według ID)
Jeśli polecenie otrzyma niewystarczającą liczbę argumentów, zwróć
Error: insufficient argumentscli.go: Utwórz strukturęCLI, która przechowuje wskaźnik doLibraryoraz mapę nazw poleceń na ich implementacje interfejsuCommand. Zaimplementuj:- konstruktor
NewCLI, który inicjalizuje CLI z biblioteką i rejestruje wszystkie polecenia:addbook,adduser,borrow,return,listbooks - metodę
Run, która przyjmuje ciąg wejściowy, analizuje go za pomocąstrings.Fields, wyszukuje polecenie i je wykonuje. ZwróćNo command provideddla pustego wejścia lubUnknown command: [name]dla nierozpoznanych poleceń
- konstruktor
main.go: Utwórz bibliotekę i CLI, a następnie przetwarzaj polecenia z wejścia. Odczytaj liczbę poleceń, a następnie wczytuj każde polecenie jako osobny wiersz. Dla każdego polecenia wywołajRuni wypisz wynik.
Dane wejściowe będą miały następującą postać:
- Liczba poleceń
- Każde polecenie jako kompletny ciąg znaków w osobnym wierszu
Na przykład dla danych:
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 B001Wynik powinien być następujący:
Book added: Go-Programming
Book added: Clean-Code
User added: Alice
Borrowed: B001
B001: Go-Programming
B002: Clean-Code
Error: book not availableA dla danych:
4
listbooks
addbook B100 Design-Patterns Gang-of-Four 978-0201633610
listbooks
invalidcmd testWynik powinien być następujący:
No books
Book added: Design-Patterns
B100: Design-Patterns
Unknown command: invalidcmdA dla danych:
5
adduser U001 Bob bob@email.com
borrow U001 B001
addbook B001 Golang-Guide John-Smith 123-456
borrow U001 B001
return U001 B001Wynik powinien być następujący:
User added: Bob
Error: book not found
Book added: Golang-Guide
Borrowed: B001
Returned: B001Zwróć uwagę, że CLI nie musi znać szczegółów każdej operacji. Po prostu wyszukuje polecenie i przekazuje mu wykonanie. Dzięki temu dodanie nowych poleceń jest tak proste, jak utworzenie nowej struktury implementującej interfejs Command i zarejestrowanie jej w CLI!
Spróbuj swoich sił
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
// Wczytaj liczbę poleceń
var n int
fmt.Scanln(&n)
// Utwórz skaner do odczytywania całych wierszy
scanner := bufio.NewScanner(os.Stdin)
// TODO: Utwórz nową Library
// TODO: Utwórz nowe CLI z biblioteką
// TODO: Przetwórz każde polecenie
// Dla każdego z n poleceń:
// - Wczytaj wiersz polecenia za pomocą scanner.Scan() i scanner.Text()
// - Wykonaj polecenie za pomocą CLI
// - Wyświetl wynik
_ = scanner // Usuń ten wiersz, gdy zaczniesz używać scanner
}
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy OOP w Go
Pliki zewnętrzneObszar roboczy i moduły GoPakiety i importyNazwy eksportowane i nieeksportowaneWprowadzenie do OOP w GoStruktury jako klasyDefiniowanie metod dla strukturOdbiorniki wskaźnikowe i wartościoweInicjalizacja strukturFunkcje konstruktoraPodsumowanie – prosty kalkulator4Interfejsy
Wprowadzenie do interfejsówImplementacja niejawnaInterfejs jako kontraktPusty interfejs (any)Asercja typuPrzełącznik typówKompozycja interfejsówInterfejsy Stringer i ErrorPowtórka — kalkulator figur7Hermetyzacja
Pola eksportowane i nieeksportowaneHermetyzacja na poziomie pakietuMetody pobierające i ustawiająceUkrywanie informacji w GoPowtórka – dane studentów10Typy generyczne (Go 1.18+)
Wprowadzenie do typów generycznychParametry typówOgraniczenia typówStruktury generyczneObejście ograniczeń metod generycznychPodsumowanie — generyczna kolekcja2Typy i struktury w praktyce
Typy proste i złożoneDefiniowanie własnych typówTagi pól strukturStruktury anonimoweStruktury zagnieżdżoneWartości zerowe i domyślnePodsumowanie – książka kontaktów5Kompozycja zamiast dziedziczenia
Dlaczego Go nie ma dziedziczeniaPodstawy osadzania strukturPromowanie metodOsadzanie wielu strukturOsadzanie a agregacjaPrzesłanianie osadzonych metodPodsumowanie — hierarchia pracowników8Obsługa błędów i programowanie obiektowe
Interfejs błęduWłasne typy błędówOpakowywanie błędów (fmt.Errorf)Błędy wartowniczeerrors.Is() i errors.As()Panic, Defer i RecoverPodsumowanie — parser plików3Wskaźniki i pamięć
Podstawy wskaźników w GoWskaźniki do strukturPrzekazywanie przez wartość a przez referencjęFunkcja new()Odśmiecanie pamięci w GoPowtórka — kreator listy wiązanej6Polimorfizm w Go
Polimorfizm za pomocą interfejsówDuck typing w GoZasady spełniania interfejsówKolekcje polimorficzneWstrzykiwanie zależnościPowtórka — procesor płatności9Współbieżność i OOP
Podstawy goroutinesKanały i komunikacjaKanały buforowane i niebuforowaneInstrukcja selectsync.Mutex i sync.RWMutexsync.WaitGroupProjektowanie struktur bezpiecznych wątkowoPowtórka – pula workerów12Zaawansowane zagadnienia programowania obiektowego
Wzorzec opcji funkcyjnychWzorzec Builder w GoŁańcuchowe wywoływanie metodAliasy typów a definicje typówPodstawy refleksjiPrzegląd generowania kodu15Projekt: Zarządzanie biblioteką
Przegląd i struktura projektuStruktury książek i użytkownikówPoćwicz samodzielnie: Kompilator Go online