Menu
Coddy logo textTech

CLI-интерфейс администратора

Часть раздела Объектно-ориентированное программирование путешествия по GO на Coddy — урок 103 из 107.

challenge icon

Задание

Легко

Давайте создадим интерфейс командной строки для нашей Системы управления библиотекой, используя паттерн «Команда»! Вы создадите CLI, который обрабатывает административные команды, такие как добавление книг, регистрация пользователей и управление операциями заимствования — и все это через чистую, расширяемую архитектуру.

Вы распределите свой код по шести файлам:

  • book.go: Ваша структура Book с JSON-тегами для ID, Title, Author, ISBN и Available. Включите конструктор NewBook.
  • user.go: Ваша структура User с JSON-тегами для ID, Name, Email и BorrowedBooks. Включите конструктор NewUser.
  • library.go: Ваша структура Library с картами (maps) для книг и пользователей, а также методами AddBook, AddUser, Borrow и Return из предыдущих уроков.
  • commands.go: Здесь паттерн «Команда» оживает! Определите интерфейс Command с методом Execute, который принимает *Library и аргументы []string, возвращая строковый результат. Затем реализуйте следующие структуры команд:
    • AddBookCommand — ожидает 4 аргумента: id, title, author, isbn. Добавляет книгу и возвращает "Book added: " + book.Title
    • AddUserCommand — ожидает 3 аргумента: id, name, email. Добавляет пользователя и возвращает "User added: " + user.Name
    • BorrowCommand — ожидает 2 аргумента: userID, bookID. Возвращает "Borrowed: " + args[1] в случае успеха или "Error: " + err.Error() в случае ошибки
    • ReturnCommand — ожидает 2 аргумента: userID, bookID. Возвращает "Returned: " + args[1] в случае успеха или "Error: " + err.Error() в случае ошибки
    • ListBooksCommand — не принимает аргументов. Возвращает ID и название каждой книги на отдельных строках в формате [id]: [title] или "No books", если список пуст (список книг должен быть отсортирован по ID)

    Если команда получает недостаточное количество аргументов, верните "Error: insufficient arguments"

  • cli.go: Создайте структуру CLI, которая содержит указатель на Library и карту соответствия имен команд реализациям Command. Создайте:
    • Конструктор NewCLI, который инициализирует CLI библиотекой и регистрирует все команды: "addbook", "adduser", "borrow", "return", "listbooks"
    • Метод Run, который принимает входную строку, разбирает ее с помощью strings.Fields, ищет команду и выполняет ее. Возвращает "No command provided" для пустого ввода или "Unknown command: " + parts[0] для нераспознанных команд
  • main.go: Создайте библиотеку и CLI, затем обрабатывайте команды из ввода. Считайте количество команд, затем считайте каждую строку команды. Для каждой команды вызовите Run и выведите результат.

Будут предоставлены следующие входные данные:

  • Количество команд
  • Каждая команда в виде полной строки на отдельной строке

Например, для ввода:

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

Ваш вывод должен быть:

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

И для ввода:

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

Ваш вывод должен быть:

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

И для ввода:

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

Ваш вывод должен быть:

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

Обратите внимание, что CLI не нужно знать детали каждой операции — он просто ищет команду и делегирует выполнение. Это делает добавление новых команд таким же простым, как создание новой структуры, реализующей интерфейс Command, и ее регистрация в CLI!

Попробуйте сами

package main

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

func main() {
	// Прочитать количество команд
	var n int
	fmt.Scanln(&n)

	// Создать сканер для чтения полных строк
	scanner := bufio.NewScanner(os.Stdin)

	// TODO: Создать новую библиотеку

	// TODO: Создать новый CLI с библиотекой

	// TODO: Обработать каждую команду
	// Для каждой из n команд:
	// - Прочитать командную строку, используя scanner.Scan() и scanner.Text()
	// - Запустить команду через CLI
	// - Вывести результат

	_ = scanner // Удалите эту строку, когда будете использовать сканер
}

Все уроки раздела Объектно-ориентированное программирование