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.
Desafío
FácilVamos a expandir tu Sistema de Biblioteca construyendo los modelos Book y User con una funcionalidad más rica. Agregarás seguimiento de estado para 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 de estado. Cada libro debe tener unId(string),Title(string),Author(string) eIsAvailable(bool, por defecto true). Agrega los métodosBorrow()yReturn()que cambien el estado de disponibilidad y devuelvan un mensaje indicando éxito o fallo. Si alguien intenta pedir prestado un libro no disponible, devuelve"{Title} is not available". Si intentan 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: Expande tu clase User para rastrear los libros prestados. IncluyeName(string),MemberId(int) y una lista privada para almacenar los IDs de los libros prestados. Agrega una propiedad de solo lecturaBorrowedCountque devuelva cuántos libros tiene el usuario actualmente. Incluye los métodosAddBorrowedBook(string bookId)yRemoveBorrowedBook(string bookId)para gestionar los libros prestados del usuario. También agrega un métodoHasBook(string bookId)que devuelva true si el usuario ha pedido prestado ese libro específico.Library.cs: Tu clase Library debe mantener colecciones de libros y usuarios. Incluye los métodosAddBook(Book book)yRegisterUser(User user)para poblar la biblioteca. Agrega un métodoGetBookById(string id)que devuelva el libro con ese ID (o null si no se encuentra), yGetUserById(int memberId)que funcione de manera similar para los usuarios.Program.cs: Une todo procesando las operaciones de la biblioteca basadas en la entrada.
Recibirás las siguientes entradas:
- Nombre de la biblioteca
- Número de libros a agregar
- Para cada libro:
id|title|author - Número de usuarios a registrar
- Para cada usuario:
name|memberId - Número de operaciones a realizar
- Para cada operación:
action|bookId|memberIddonde action esborroworeturn
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 mostrando su nombre y cuántos libros tiene prestados actualmente en 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|101La salida debería 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 pide prestados con éxito dos libros, pero cuando Bob intenta pedir prestado Clean Code (que Alice ya tiene), la operación falla. Después de que Alice devuelve Clean Code, su cuenta baja a 1. ¡Esto demuestra cómo tus modelos trabajan juntos para hacer cumplir las reglas de la biblioteca!
Pruébalo tú mismo
using System;
namespace LibrarySystem
{
class Program
{
public static void Main(string[] args)
{
// Leer entradas
string libraryName = Console.ReadLine();
string bookInput = Console.ReadLine();
string userInput = Console.ReadLine();
// Analizar la entrada del libro (formato: title|author)
string[] bookParts = bookInput.Split('|');
string bookTitle = bookParts[0];
string bookAuthor = bookParts[1];
// Analizar la entrada del usuario (formato: name|memberId)
string[] userParts = userInput.Split('|');
string userName = userParts[0];
int memberId = Convert.ToInt32(userParts[1]);
// Crear una instancia de Library con el nombre de la biblioteca
Library library = new Library(libraryName);
// Crear una instancia de Book con el título y el autor
Book book = new Book(bookTitle, bookAuthor);
// Crear una instancia de User con el nombre y el ID de miembro
User user = new User(userName, memberId);
// Imprimir la información de la biblioteca usando GetInfo()
Console.WriteLine(library.GetInfo());
// Imprimir la información del libro en formato: Book: {Title} by {Author} - Available: {IsAvailable}
Console.WriteLine($"Book: {book.Title} by {book.Author} - Available: {book.IsAvailable}");
// Imprimir la información del usuario en formato: User: {Name} (ID: {MemberId})
Console.WriteLine($"User: {user.Name} (ID: {user.MemberId})");
}
}
}
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de OOP
Archivos externosNamespaces y directivasIntro a clases y objetosLa palabra clave 'this'Métodos y parámetrosCampos vs PropiedadesConstructoresInicializadores de objetosResumen - Calculadora simple4Herencia
Sintaxis básica de herencia (:)La palabra clave 'base'Palabras clave Virtual y OverrideClases selladas (Sealed)La clase base 'object'Resumen: Jerarquía de empleados7Características avanzadas
Sobrecarga de operadoresIndexadores (this[])Sobrescritura de ToString()Métodos de extensiónResumen - Lista personalizada10Patrones de diseño - Parte 1
Introducción a los patrones de diseñoSingleton Thread-SafePatrón FactoryPatrón Observer (Eventos)Patrón Strategy2Propiedades y miembros estáticos
Propiedades autoimplementadasPropiedades de solo lectura y escrituraCampos y métodos estáticosClases estáticasMiembros con cuerpo de expresión5Polimorfismo e Interfaces
Polimorfismo: Compilación vs. EjecuciónInterfaz vs. Clase AbstractaInterfaces MúltiplesInterfaces ExplícitasUpcasting y DowncastingRepaso: Calculadora de Figuras8Conceptos avanzados de POO
Composición sobre herenciaGenéricos (clases y métodos)Delegados y eventosAtributos y ReflexiónIDisposable y la sentencia usingFundamentos de Inyección de dependencias11Patrones de diseño, parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón Composite3Arquitectura de clases
Datos de instancia vs. estáticosPalabras clave 'readonly' y 'const'Campos de respaldoResumen - Gestor de cuentas bancarias6Encapsulamiento
Modificadores de accesoPropiedades para el encapsulamientoImplementación de ocultamiento de datosPatrones de inmutabilidadRepaso - Registros de estudiantes9Argumentos variables
La palabra clave 'params'Parámetros opcionalesArgumentos con nombreSobrecarga de métodos12Proyecto: Sistema de Biblioteca
Estructura del ProyectoModelos de Libro y Usuario