Menu
Coddy logo textTech

Sistema de préstamos

Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy. Lección 84 de 91.

challenge icon

Desafío

Fácil

Demos vida a nuestro sistema de gestión de biblioteca creando la clase Library, que coordina todas las operaciones de préstamo. Este coordinador central gestionará la colección de libros y hará cumplir las reglas que mantienen el funcionamiento fluido de nuestra biblioteca.

Organizarás tu código en cuatro archivos:

  • Book.php: Tu clase Book de la lección anterior, con propiedades de solo lectura (isbn, title, author), una propiedad privada $isAvailable que comienza como true y los métodos: isAvailable(), markAsBorrowed() y markAsReturned().
  • User.php: Incluye el archivo Book. Tu clase User, con propiedades de solo lectura (id, name), un arreglo privado $borrowedBooks, una constante MAX_BOOKS con valor 3 y los métodos: getBorrowedBooks(), canBorrow(), addBook(Book $book) y removeBook(string $isbn).
  • Library.php: Incluye el archivo User. Crea una clase Library que gestione la colección de libros. Tu biblioteca debe tener:
    • Un arreglo privado $books para almacenar libros indexados por ISBN
    • addBook(Book $book): void: agrega un libro a la colección
    • findBook(string $isbn): ?Book: devuelve el libro o null si no se encuentra
    • borrowBook(User $user, string $isbn): string: valida y procesa el préstamo, devolviendo los mensajes correspondientes
    • returnBook(User $user, string $isbn): string: procesa las devoluciones y actualiza el estado tanto del libro como del usuario

    El método borrowBook debe comprobar tres condiciones en orden y devolver estos mensajes exactos:

    • "Book not found": si el libro no existe
    • "Book is not available": si ya se ha prestado
    • "Borrowing limit reached": si el usuario tiene 3 libros
    • "Successfully borrowed: [title]": si la operación se realiza correctamente

    El método returnBook debe devolver "Book not found" si el libro no existe, o "Successfully returned: [title]" si la operación se realiza correctamente.

  • main.php: Incluye el archivo Library. Recibirás dos entradas: un ISBN y el título de un libro.

    Crea una Library, un User con el ID 1 y el nombre "Alice", y un Book con el ISBN y el título proporcionados, y con el autor "Unknown". Agrega el libro a la biblioteca, después realiza estas operaciones e imprime cada resultado en una línea nueva:

    1. Pedir prestado el libro
    2. Intentar pedir prestado el mismo libro otra vez
    3. Devolver el libro
    4. Pedir prestado el libro una vez más

Este desafío demuestra cómo la clase Library centraliza la lógica de negocio. Valida las condiciones, coordina los cambios de estado entre los objetos Book y User, y devuelve información significativa para cada operación.

Pruébalo tú mismo

<?php
require_once 'Library.php';

// Lee la entrada
$isbn = trim(fgets(STDIN));
$title = trim(fgets(STDIN));

// TODO: Crea una instancia de Library

// TODO: Crea un User con ID 1 y nombre "Alice"

// TODO: Crea un Book con el ISBN proporcionado, el título y el autor "Unknown"

// TODO: Añade el libro a la biblioteca

// TODO: Realiza estas operaciones e imprime cada resultado en una nueva línea:
// 1. Presta el libro
// 2. Intenta prestar el mismo libro de nuevo
// 3. Devuelve el libro
// 4. Presta el libro una vez más

?>

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de PHP online