Menu
Coddy logo textTech

Sistema de préstamos

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

challenge icon

Desafío

Fácil

¡Construyamos el sistema de préstamos para nuestro proyecto de gestión de bibliotecas! Crearás una estructura Library que administra colecciones de libros y usuarios, con métodos para gestionar las operaciones de préstamo y devolución, incluida la validación adecuada.

Organizarás tu código en cuatro archivos:

  • book.go: Tu estructura Book de la lección anterior, con los campos ID, Title, Author, ISBN y Available. Incluye el constructor NewBook, que inicializa los libros como disponibles.
  • user.go: Tu estructura User con ID, Name, Email y BorrowedBooks (segmento de IDs de libros). Incluye el constructor NewUser, que inicializa los usuarios con una lista de préstamos vacía.
  • library.go: Crea una estructura Library que almacene libros y usuarios en mapas (indexados por sus IDs). Crea estos componentes:
    • Un constructor NewLibrary que inicialice mapas vacíos para libros y usuarios
    • Un método AddBook que añada un libro a la biblioteca
    • Un método AddUser que añada un usuario a la biblioteca
    • Un método Borrow que reciba un ID de usuario y un ID de libro, valide la operación, marque el libro como no disponible, añada el ID del libro a la lista de préstamos del usuario y devuelva un error si algo sale mal
    • Un método Return que revierta el proceso de préstamo: marque el libro como disponible y lo elimine de la lista de préstamos del usuario

    Tu método Borrow debe devolver estos errores:

    • user not found si el ID de usuario no existe
    • book not found si el ID de libro no existe
    • book not available si el libro ya está prestado

    Tu método Return debe devolver estos errores:

    • user not found si el ID de usuario no existe
    • book not found si el ID de libro no existe
    • book not borrowed si el libro ya está disponible
  • main.go: Une todo creando una biblioteca, añadiendo libros y usuarios, y después procesando las operaciones de préstamo y devolución.

    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 usuarios y, para cada usuario, lee su ID, nombre y correo electrónico. Después, lee el número de operaciones, donde cada operación es borrow [userID] [bookID] o return [userID] [bookID].

    Para cada operación, imprime OK si tiene éxito o Error: [message] si falla.

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 una línea separada)
  • Número de usuarios y, después, el ID, nombre y correo electrónico de cada usuario (cada uno en una línea separada)
  • Número de operaciones y, después, cada operación en una línea separada

Por ejemplo, dada la siguiente entrada:

2
B001
The Go Programming Language
Alan Donovan
978-0134190440
B002
Clean Code
Robert Martin
978-0132350884
1
U001
Alice Smith
alice@library.com
4
borrow U001 B001
borrow U001 B001
return U001 B001
borrow U002 B001

Tu salida debe ser:

OK
Error: book not available
OK
Error: user not found

Y dada la siguiente entrada:

1
B100
Design Patterns
Gang of Four
978-0201633610
2
U001
Bob Jones
bob@email.com
U002
Carol White
carol@email.com
3
borrow U001 B100
borrow U002 B100
return U001 B100

Tu salida debe ser:

OK
Error: book not available
OK

Y dada la siguiente entrada:

1
B001
Go in Action
William Kennedy
978-1617291784
1
U001
Dave Miller
dave@test.com
2
return U001 B001
borrow U001 B999

Tu salida debe ser:

Error: book not borrowed
Error: book not found

Observa cómo Library actúa como coordinador central. Valida todas las operaciones antes de modificar el estado, lo que garantiza que los libros y los usuarios permanezcan sincronizados. ¡Usar receptores de puntero permite que tus métodos modifiquen los datos reales almacenados en los mapas!

Pruébalo tú mismo

package main

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

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

	// Lee el número de libros
	var numBooks int
	fmt.Fscanln(reader, &numBooks)

	// TODO: Crea una nueva biblioteca

	// TODO: Lee los detalles de cada libro (ID, Title, Author, ISBN en líneas separadas)
	// y añádelos a la biblioteca
	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)

		// TODO: Crea el libro y añádelo a la biblioteca
	}

	// Lee el número de usuarios
	var numUsers int
	fmt.Fscanln(reader, &numUsers)

	// TODO: Lee los detalles de cada usuario (ID, Name, Email en líneas separadas)
	// y añádelos a la biblioteca
	for i := 0; i < numUsers; i++ {
		id, _ := reader.ReadString('\n')
		id = strings.TrimSpace(id)
		name, _ := reader.ReadString('\n')
		name = strings.TrimSpace(name)
		email, _ := reader.ReadString('\n')
		email = strings.TrimSpace(email)

		// TODO: Crea el usuario y añádelo a la biblioteca
	}

	// Lee el número de operaciones
	var numOps int
	fmt.Fscanln(reader, &numOps)

	// TODO: Procesa cada operación
	// Formato: "borrow [userID] [bookID]" o "return [userID] [bookID]"
	for i := 0; i < numOps; i++ {
		line, _ := reader.ReadString('\n')
		line = strings.TrimSpace(line)
		parts := strings.Split(line, " ")

		// TODO: Parsea la operación y llama al método apropiado
		// Imprime "OK" en caso de éxito o "Error: [message]" en caso de fallo
	}
}

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de Go online