Menu
Coddy logo textTech

Busca com Interfaces

Parte da seção Programação Orientada a Objetos do Journey de GO da Coddy — lição 101 de 107.

challenge icon

Desafio

Fácil

Vamos adicionar capacidades de busca flexíveis ao nosso Sistema de Gerenciamento de Biblioteca! Você implementará o padrão Strategy usando interfaces, permitindo que os usuários busquem livros por diferentes critérios sem modificar o código principal da biblioteca.

Você organizará seu código em cinco arquivos:

  • book.go: Sua struct Book das lições anteriores com os campos ID, Title, Author, ISBN e Available. Inclua o construtor NewBook.
  • user.go: Sua struct User com os campos ID, Name, Email e BorrowedBooks. Inclua o construtor NewUser.
  • search.go: Defina sua interface de estratégia de busca e as implementações.

    Crie uma interface SearchStrategy com um único método:

    Match(book *Book, query string) bool

    Implemente três estratégias de busca:

    • TitleSearch — corresponde se o título do livro contém a query (insensível a maiúsculas e minúsculas)
    • AuthorSearch — corresponde se o autor do livro contém a query (insensível a maiúsculas e minúsculas)
    • ISBNSearch — corresponde se o ISBN do livro é exatamente igual à query
  • library.go: Sua struct Library com mapas para livros e usuários. Adicione um método Search que aceita qualquer SearchStrategy e uma string de consulta (query), retornando um slice de ponteiros de livros correspondentes. O método deve iterar por todos os livros e usar o método Match da estratégia para encontrar os resultados.
  • main.go: Construa uma biblioteca com livros e, em seguida, realize buscas usando diferentes estratégias.

    Leia o número de livros e, para cada livro, leia seu ID, título, autor e ISBN. Em seguida, leia o número de operações de busca. Cada operação consiste em um tipo de busca (title, author ou isbn) seguido pela string de consulta.

    Para cada busca, imprima Search by [type]: [query] seguido pelos IDs dos livros correspondentes na próxima linha, separados por vírgulas. Se nenhum livro corresponder, imprima No results em vez disso.

As seguintes entradas serão fornecidas:

  • Número de livros, depois o ID, título, autor e ISBN de cada livro (cada um em linhas separadas)
  • Número de buscas, depois cada tipo de busca e consulta (cada um em linhas separadas)

Por exemplo, dado:

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

Sua saída deve ser:

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

E dado:

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

Sua saída deve ser:

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

E dado:

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

Sua saída deve ser:

Search by title: design
B001,B002

Observe como o método Search funciona com qualquer estratégia — ele não sabe se está buscando por título, autor ou ISBN. Essa abordagem polimórfica significa que você pode adicionar novos tipos de busca (como busca por disponibilidade ou ano de publicação) simplesmente criando novas structs que implementam SearchStrategy!

Experimente você mesmo

package main

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

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

	// Lê o número de livros
	numBooksStr, _ := reader.ReadString('\n')
	numBooks, _ := strconv.Atoi(strings.TrimSpace(numBooksStr))

	// Cria a biblioteca
	library := NewLibrary()

	// Lê os detalhes de cada livro
	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)
	}

	// Lê o número de buscas
	numSearchesStr, _ := reader.ReadString('\n')
	numSearches, _ := strconv.Atoi(strings.TrimSpace(numSearchesStr))

	// Processa cada busca
	for i := 0; i < numSearches; i++ {
		searchType, _ := reader.ReadString('\n')
		searchType = strings.TrimSpace(searchType)
		query, _ := reader.ReadString('\n')
		query = strings.TrimSpace(query)

		// TODO: Seleciona a estratégia de busca apropriada baseada em searchType
		// searchType pode ser "title", "author", ou "isbn"
		var strategy SearchStrategy

		// TODO: Implementa a lógica de seleção de estratégia aqui

		// TODO: Realiza a busca usando library.Search(strategy, query)

		// TODO: Imprime os resultados no formato exigido
		// Formato: "Search by [type]: [query]" seguido pelos IDs correspondentes ou "No results"
		fmt.Printf("Search by %s: %s\n", searchType, query)

		// TODO: Imprime os IDs dos livros correspondentes separados por vírgulas, ou "No results"
		_ = strategy // Remova esta linha quando você implementar a solução
	}
}

Todas as lições de Programação Orientada a Objetos