Menu
Coddy logo textTech

Interfejs CLI administratora

Część sekcji Programowanie obiektowe ścieżki GO w Coddy. Lekcja 103 z 107.

challenge icon

Wyzwanie

Łatwy

Zbudujmy 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: struktura Book z tagami JSON dla pól ID, Title, Author, ISBN i Available. Dodaj konstruktor NewBook.
  • user.go: struktura User z tagami JSON dla pól ID, Name, Email i BorrowedBooks. Dodaj konstruktor NewUser.
  • library.go: struktura Library z mapami książek i użytkowników oraz metodami AddBook, AddUser, Borrow i Return z poprzednich lekcji.
  • commands.go: tutaj wzorzec Command nabiera życia! Zdefiniuj interfejs Command z metodą Execute, która przyjmuje *Library i 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 zwraca Book added: [title]
    • AddUserCommand: oczekuje 3 argumentów: id, name, email. Dodaje użytkownika i zwraca User added: [name]
    • BorrowCommand: oczekuje 2 argumentów: userID, bookID. W przypadku powodzenia zwraca Borrowed: [bookID], a w przypadku niepowodzenia Error: [message]
    • ReturnCommand: oczekuje 2 argumentów: userID, bookID. W przypadku powodzenia zwraca Returned: [bookID], a w przypadku niepowodzenia Error: [message]
    • ListBooksCommand: nie przyjmuje argumentów. Zwraca ID i tytuł każdej książki w osobnych wierszach, w formacie [id]: [title], albo No books, jeśli lista jest pusta (posortuj książki według ID)

    Jeśli polecenie otrzyma niewystarczającą liczbę argumentów, zwróć Error: insufficient arguments

  • cli.go: Utwórz strukturę CLI, która przechowuje wskaźnik do Library oraz mapę nazw poleceń na ich implementacje interfejsu Command. 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 provided dla pustego wejścia lub Unknown command: [name] dla nierozpoznanych poleceń
  • 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łaj Run i 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 B001

Wynik 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 available

A dla danych:

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

Wynik powinien być następujący:

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

A 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 B001

Wynik powinien być następujący:

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

Zwróć 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

Poćwicz samodzielnie: Kompilator Go online