Menu
Coddy logo textTech

Búsqueda con interfaces

Parte de la sección Programación Orientada a Objetos del Journey de GO de Coddy. Lección 101 de 107.

challenge icon

Desafío

Fácil

¡Añadamos capacidades de búsqueda flexibles a nuestro sistema de gestión de bibliotecas! Implementarás el patrón Strategy mediante interfaces, lo que permitirá a los usuarios buscar libros según distintos criterios sin modificar el código principal de la biblioteca.

Organizarás tu código en cinco archivos:

  • book.go: Tu estructura Book de lecciones anteriores, con los campos ID, Title, Author, ISBN y Available. Incluye el constructor NewBook.
  • user.go: Tu estructura User, con los campos ID, Name, Email y BorrowedBooks. Incluye el constructor NewUser.
  • search.go: Define tu interfaz de estrategia de búsqueda y sus implementaciones.

    Crea una interfaz SearchStrategy con un único método:

    Match(book *Book, query string) bool

    Implementa tres estrategias de búsqueda:

    • TitleSearch: coincide si el título del libro contiene la consulta, sin distinguir entre mayúsculas y minúsculas
    • AuthorSearch: coincide si el autor del libro contiene la consulta, sin distinguir entre mayúsculas y minúsculas
    • ISBNSearch: coincide si el ISBN del libro es exactamente igual a la consulta
  • library.go: Tu estructura Library, con mapas para libros y usuarios. Añade un método Search que acepte cualquier SearchStrategy y una cadena de consulta, y devuelva un segmento de punteros a los libros coincidentes. El método debe iterar por todos los libros y utilizar el método Match de la estrategia para encontrar resultados.
  • main.go: Construye una biblioteca con libros y, después, realiza búsquedas utilizando distintas estrategias.

    Lee el número de libros y, después, para cada libro, lee su ID, título, autor e ISBN. A continuación, lee el número de operaciones de búsqueda. Cada operación consta de un tipo de búsqueda (title, author o isbn) seguido de la cadena de consulta.

    Para cada búsqueda, imprime Search by [type]: [query] y, en la línea siguiente, los ID de los libros coincidentes, ordenados de forma ascendente y separados por comas (un mapa se itera en orden aleatorio, así que ordena los ID antes de imprimirlos). Si no coincide ningún libro, imprime No results.

Se proporcionarán las siguientes entradas:

  • Número de libros y, después, el ID, título, autor e ISBN de cada libro (cada uno en líneas separadas)
  • Número de búsquedas y, después, el tipo y la consulta de cada búsqueda (cada uno en líneas separadas)

Por ejemplo, dada la siguiente entrada:

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

Tu salida debe ser:

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

Y dada la siguiente entrada:

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

Tu salida debe ser:

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

Y dada la siguiente entrada:

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

Tu salida debe ser:

Search by title: design
B001,B002

Observa cómo el método Search funciona con cualquier estrategia. No sabe si está buscando por título, autor o ISBN. Este enfoque polimórfico significa que puedes añadir nuevos tipos de búsqueda (como buscar por disponibilidad o año de publicación) simplemente creando nuevas estructuras que implementen SearchStrategy.

Pruébalo tú mismo

package main

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

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

	// Leer el número de libros
	numBooksStr, _ := reader.ReadString('\n')
	numBooks, _ := strconv.Atoi(strings.TrimSpace(numBooksStr))

	// Crear la biblioteca
	library := NewLibrary()

	// Leer los detalles de cada libro
	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)
	}

	// Leer el número de búsquedas
	numSearchesStr, _ := reader.ReadString('\n')
	numSearches, _ := strconv.Atoi(strings.TrimSpace(numSearchesStr))

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

		// TODO: Selecciona la estrategia de búsqueda apropiada basándote en searchType
		// searchType puede ser "title", "author" o "isbn"
		var strategy SearchStrategy

		// TODO: Implementa la lógica de selección de estrategia aquí

		// TODO: Realiza la búsqueda usando library.Search(strategy, query)

		// TODO: Imprime los resultados en el formato requerido
		// Formato: "Search by [type]: [query]" seguido de los IDs coincidentes o "No results"
		fmt.Printf("Search by %s: %s\n", searchType, query)

		// TODO: Imprime los IDs de los libros coincidentes separados por comas, o "No results"
		_ = strategy // Elimina esta línea cuando implementes la solución
	}
}

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de Go online