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 с отображениями для книг и пользователей, а также методами AddBook, AddUser, Borrow и Return из предыдущих уроков.
  • commands.go: здесь паттерн «Команда» воплощается в жизнь! Определите интерфейс Command с методом Execute, который принимает *Library и аргументы []string, возвращая строковый результат. Затем реализуйте следующие структуры команд:
    • AddBookCommand: ожидает 4 аргумента: id, title, author, isbn. Добавляет книгу и возвращает Book added: [title]
    • AddUserCommand: ожидает 3 аргумента: id, name, email. Добавляет пользователя и возвращает User added: [name]
    • BorrowCommand: ожидает 2 аргумента: userID, bookID. При успешном выполнении возвращает Borrowed: [bookID], а при ошибке — Error: [message]
    • ReturnCommand: ожидает 2 аргумента: userID, bookID. При успешном выполнении возвращает Returned: [bookID], а при ошибке — Error: [message]
    • 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: [name]
  • 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: Создать новую Library

	// TODO: Создать новый CLI с library

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

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

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

Потренируйтесь самостоятельно: Онлайн-компилятор Go