Menu
Coddy logo textTech

Поиск через Interfaces

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

challenge icon

Задание

Легко

Давайте добавим гибкие возможности поиска в нашу Систему управления библиотекой! Вы реализуете паттерн «Стратегия» (Strategy) с использованием интерфейсов, что позволит пользователям искать книги по различным критериям без изменения основного кода библиотеки.

Вы организуете свой код в пяти файлах:

  • book.go: Ваша структура Book из предыдущих уроков с полями ID, Title, Author, ISBN и Available. Включите конструктор NewBook.
  • user.go: Ваша структура User с полями ID, Name, Email и BorrowedBooks. Включите конструктор NewUser.
  • search.go: Определите интерфейс стратегии поиска и его реализации.

    Создайте интерфейс SearchStrategy с одним методом:

    Match(book *Book, query string) bool

    Реализуйте три стратегии поиска:

    • TitleSearch — совпадает, если название книги содержит запрос (без учета регистра)
    • AuthorSearch — совпадает, если автор книги содержит запрос (без учета регистра)
    • ISBNSearch — совпадает, если ISBN книги точно соответствует запросу
  • library.go: Ваша структура Library с картами (maps) для книг и пользователей. Добавьте метод Search, который принимает любую SearchStrategy и строку запроса, возвращая срез (slice) указателей на подходящие книги. Метод должен перебирать все книги и использовать метод Match стратегии для поиска результатов.
  • main.go: Создайте библиотеку с книгами, а затем выполните поиск, используя различные стратегии.

    Считайте количество книг, затем для каждой книги считайте её ID, название, автора и ISBN. Далее считайте количество операций поиска. Каждая операция состоит из типа поиска (title, author или isbn), за которым следует строка запроса.

    Для каждого поиска выведите Search by [type]: [query], а на следующей строке — ID найденных книг, разделенные запятыми. Если ни одна книга не найдена, выведите вместо этого No results.

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

  • Количество книг, затем ID каждой книги, название, автор, ISBN (каждый параметр на отдельной строке)
  • Количество поисковых запросов, затем тип каждого поиска и сам запрос (каждый параметр на отдельной строке)

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

3
B001
The Go Programming Language
Alan Donovan
978-0134190440
B002
Go in Action
William Kennedy
978-1617291784
B003
Learning Python
Mark Lutz
978-1449355739
3
title
go
author
kennedy
isbn
978-1449355739

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

Search by title: go
B001,B002
Search by author: kennedy
B002
Search by isbn: 978-1449355739
B003

И для данных:

2
B001
Clean Code
Robert Martin
978-0132350884
B002
The Pragmatic Programmer
David Thomas
978-0135957059
2
title
java
author
martin

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

Search by title: java
No results
Search by author: martin
B001

И для данных:

2
B001
Design Patterns
Gang of Four
978-0201633610
B002
Head First Design Patterns
Eric Freeman
978-0596007126
1
title
design

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

Search by title: design
B001,B002

Обратите внимание, как метод Search работает с любой стратегией — он «не знает», выполняется ли поиск по названию, автору или ISBN. Этот полиморфный подход означает, что вы можете добавлять новые типы поиска (например, поиск по доступности или году издания), просто создавая новые структуры, реализующие SearchStrategy!

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

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	reader := bufio.NewReader(os.Stdin)

	// Чтение количества книг
	numBooksStr, _ := reader.ReadString('\n')
	numBooks, _ := strconv.Atoi(strings.TrimSpace(numBooksStr))

	// Создание библиотеки
	library := NewLibrary()

	// Чтение данных каждой книги
	for i := 0; i < numBooks; i++ {
		id, _ := reader.ReadString('\n')
		id = strings.TrimSpace(id)
		title, _ := reader.ReadString('\n')
		title = strings.TrimSpace(title)
		author, _ := reader.ReadString('\n')
		author = strings.TrimSpace(author)
		isbn, _ := reader.ReadString('\n')
		isbn = strings.TrimSpace(isbn)

		book := NewBook(id, title, author, isbn)
		library.AddBook(book)
	}

	// Чтение количества поисковых запросов
	numSearchesStr, _ := reader.ReadString('\n')
	numSearches, _ := strconv.Atoi(strings.TrimSpace(numSearchesStr))

	// Обработка каждого поиска
	for i := 0; i < numSearches; i++ {
		searchType, _ := reader.ReadString('\n')
		searchType = strings.TrimSpace(searchType)
		query, _ := reader.ReadString('\n')
		query = strings.TrimSpace(query)

		// TODO: Выберите подходящую стратегию поиска на основе searchType
		// searchType может быть "title", "author" или "isbn"
		var strategy SearchStrategy

		// TODO: Реализуйте логику выбора стратегии здесь

		// TODO: Выполните поиск, используя library.Search(strategy, query)

		// TODO: Выведите результаты в требуемом формате
		// Формат: "Search by [type]: [query]", за которым следуют совпадающие ID или "No results"
		fmt.Printf("Search by %s: %s\n", searchType, query)

		// TODO: Выведите ID найденных книг через запятую или "No results"
		_ = strategy // Удалите эту строку, когда реализуете решение
	}
}

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