Menu
Coddy logo textTech

Modelos de Libro y Usuario

Parte de la sección Programación Orientada a Objetos del Journey de C# de Coddy. Lección 63 de 70.

challenge icon

Desafío

Fácil

Ampliemos tu sistema de biblioteca desarrollando los modelos Book y User con una funcionalidad más completa. Añadirás el seguimiento del estado de los libros, capacidades de préstamo para los usuarios y una encapsulación adecuada para mantener tus datos seguros.

Continuarás trabajando con tu estructura de cuatro archivos:

  • Book.cs: Mejora tu clase Book con un identificador único y seguimiento del estado. Cada libro debe tener un Id (string), Title (string), Author (string) y IsAvailable (bool, con un valor predeterminado de true). Añade los métodos Borrow() y Return(), que cambien el estado de disponibilidad y devuelvan un mensaje que indique si la operación tuvo éxito o falló. Si alguien intenta tomar prestado un libro no disponible, devuelve "{Title} is not available". Si intenta devolver un libro que ya está disponible, devuelve "{Title} was not borrowed". Las operaciones exitosas deben devolver "{Title} has been borrowed" o "{Title} has been returned".
  • User.cs: Amplía tu clase User para realizar un seguimiento de los libros prestados. Incluye Name (string), MemberId (int) y una lista privada para almacenar los identificadores de los libros prestados. Añade una propiedad de solo lectura BorrowedCount que devuelva cuántos libros tiene actualmente el usuario. Incluye los métodos AddBorrowedBook(string bookId) y RemoveBorrowedBook(string bookId) para gestionar los libros prestados del usuario. Añade también un método HasBook(string bookId) que devuelva true si el usuario ha tomado prestado ese libro específico.
  • Library.cs: Tu clase Library debe mantener colecciones de libros y usuarios. Incluye los métodos AddBook(Book book) y RegisterUser(User user) para llenar la biblioteca. Añade un método GetBookById(string id) que devuelva el libro con ese identificador (o null si no se encuentra) y GetUserById(int memberId), que funcione de forma similar para los usuarios.
  • Program.cs: Integra todo procesando las operaciones de la biblioteca según la entrada.

Recibirás las siguientes entradas:

  • Nombre de la biblioteca
  • Número de libros que se añadirán
  • Para cada libro: id|title|author
  • Número de usuarios que se registrarán
  • Para cada usuario: name|memberId
  • Número de operaciones que se realizarán
  • Para cada operación: action|bookId|memberId, donde action es borrow o return

Para cada operación, imprime el resultado de la acción de préstamo o devolución. Después de todas las operaciones, imprime un resumen para cada usuario que muestre su nombre y cuántos libros tiene actualmente prestados, con el formato {Name}: {BorrowedCount} book(s).

Por ejemplo, si las entradas son:

Downtown Library
2
B001|Clean Code|Robert Martin
B002|Design Patterns|Gang of Four
2
Alice|101
Bob|102
4
borrow|B001|101
borrow|B002|101
borrow|B001|102
return|B001|101

La salida debe ser:

Clean Code has been borrowed
Design Patterns has been borrowed
Clean Code is not available
Clean Code has been returned
Alice: 1 book(s)
Bob: 0 book(s)

Observa cómo Alice toma prestados correctamente dos libros, pero cuando Bob intenta tomar prestado Clean Code (que Alice ya tiene), la operación falla. Después de que Alice devuelve Clean Code, su cantidad disminuye a 1. ¡Esto demuestra cómo tus modelos trabajan juntos para hacer cumplir las reglas de la biblioteca!

Pruébalo tú mismo

using System;
using System.Collections.Generic;

namespace LibrarySystem
{
    class Program
    {
        public static void Main(string[] args)
        {
            // Leer el nombre de la biblioteca
            string libraryName = Console.ReadLine();
            
            // Crear una instancia de Library con el nombre de la biblioteca
            Library library = new Library(libraryName);
            
            // Leer el número de libros
            int numBooks = Convert.ToInt32(Console.ReadLine());
            
            // Leer y agregar libros
            for (int i = 0; i < numBooks; i++)
            {
                string bookInput = Console.ReadLine();
                string[] bookParts = bookInput.Split('|');
                string bookId = bookParts[0];
                string bookTitle = bookParts[1];
                string bookAuthor = bookParts[2];
                
                Book book = new Book(bookId, bookTitle, bookAuthor);
                library.AddBook(book);
            }
            
            // Leer el número de usuarios
            int numUsers = Convert.ToInt32(Console.ReadLine());
            
            // Leer y registrar usuarios
            List<User> usersList = new List<User>();
            for (int i = 0; i < numUsers; i++)
            {
                string userInput = Console.ReadLine();
                string[] userParts = userInput.Split('|');
                string userName = userParts[0];
                int memberId = Convert.ToInt32(userParts[1]);
                
                User user = new User(userName, memberId);
                library.RegisterUser(user);
                usersList.Add(user);
            }
            
            // Leer el número de operaciones
            int numOperations = Convert.ToInt32(Console.ReadLine());
            
            // Procesar operaciones
            for (int i = 0; i < numOperations; i++)
            {
                string operationInput = Console.ReadLine();
                string[] opParts = operationInput.Split('|');
                string action = opParts[0];
                string bookId = opParts[1];
                int memberId = Convert.ToInt32(opParts[2]);
                
                Book book = library.GetBookById(bookId);
                User user = library.GetUserById(memberId);
                
                if (action == "borrow")
                {
                    string result = book.Borrow();
                    Console.WriteLine(result);
                    if (result.Contains("has been borrowed"))
                    {
                        user.AddBorrowedBook(bookId);
                    }
                }
                else if (action == "return")
                {
                    string result = book.Return();
                    Console.WriteLine(result);
                    if (result.Contains("has been returned"))
                    {
                        user.RemoveBorrowedBook(bookId);
                    }
                }
            }
            
            // Imprimir resumen para cada usuario
            foreach (User user in usersList)
            {
                Console.WriteLine($"{user.Name}: {user.BorrowedCount} book(s)");
            }
        }
    }
}

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de C# online