Interfaz de Consola / Interfaz de Administrador
Parte de la sección Programación Orientada a Objetos del Journey de C# de Coddy. Lección 66 de 70.
Desafío
Fácil¡Completa tu sistema de biblioteca creando una interfaz de consola que reúna todos tus componentes! Crearás una interfaz de administración que procese comandos para gestionar la biblioteca: añadir libros, registrar usuarios, gestionar operaciones de préstamo y buscar en el catálogo.
Seguirás trabajando sobre la estructura existente de tu proyecto:
Book.cs: Conserva tu clase Book conId,Title,Author,IsAvailabley los métodosBorrow()yReturn().User.cs: Conserva tu clase User con el seguimiento de préstamos, la constanteMaxBooks,CanBorrow()y los métodos para gestionar los libros prestados.Library.cs: Conserva tu clase Library con toda la lógica de préstamos y los métodos de búsqueda con LINQ que has creado. Añade un nuevo métodoGetAllBooks()que devuelva todos los libros de la biblioteca, yGetAllUsers()que devuelva todos los usuarios registrados.Program.cs: ¡Aquí es donde cobra vida tu interfaz de consola! Crearás un procesador de comandos que lea los comandos y ejecute las operaciones correspondientes de la biblioteca. Piensa en esto como el panel de administración de tu sistema de biblioteca.
Tu interfaz de consola debe gestionar estos comandos:
ADD_BOOK|id|title|author- Añade un libro nuevo e imprimeAdded: {Title}ADD_USER|name|memberId- Registra un usuario nuevo e imprimeRegistered: {Name}BORROW|bookId|memberId- Procesa una solicitud de préstamo (usa la lógica existente de BorrowBook)RETURN|bookId|memberId- Procesa una solicitud de devolución (usa la lógica existente de ReturnBook)SEARCH|type|value- Busca en el catálogo, donde type estitle,author,availableoborrowedSTATUS- Imprime un resumen que muestra el total de libros, los libros disponibles, el total de usuarios y el total de libros prestados
Para el comando STATUS, imprime el resumen con este formato:
--- Library Status ---
Total Books: {count}
Available: {count}
Total Users: {count}
Books Borrowed: {count}Para los resultados de búsqueda, imprime cada libro como {Title} by {Author} en su propia línea, o No books found si no hay resultados.
Recibirás las siguientes entradas:
- Nombre de la biblioteca
- Número de comandos que se procesarán
- Cada comando en su propia línea, con los formatos descritos anteriormente
Por ejemplo, si las entradas son:
Downtown Library
8
ADD_BOOK|B001|Clean Code|Robert Martin
ADD_BOOK|B002|The Pragmatic Programmer|David Thomas
ADD_USER|Alice|101
ADD_USER|Bob|102
BORROW|B001|101
SEARCH|available
BORROW|B002|102
STATUSLa salida debe ser:
Added: Clean Code
Added: The Pragmatic Programmer
Registered: Alice
Registered: Bob
Alice borrowed Clean Code
The Pragmatic Programmer by David Thomas
Bob borrowed The Pragmatic Programmer
--- Library Status ---
Total Books: 2
Available: 0
Total Users: 2
Books Borrowed: 2Tu interfaz de consola actúa como el pegamento que conecta la entrada del usuario con tus componentes de biblioteca bien organizados. Cada comando delega en el método apropiado de tu clase Library, lo que demuestra cómo una arquitectura limpia facilita la creación de interfaces de usuario.
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 comandos
int numCommands = Convert.ToInt32(Console.ReadLine());
// Procesar cada comando
for (int i = 0; i < numCommands; i++)
{
string commandLine = Console.ReadLine();
string[] parts = commandLine.Split('|');
string command = parts[0];
// TODO: Manejar el comando ADD_BOOK
// Formato: ADD_BOOK|id|title|author
// Imprimir: Added: {title}
// TODO: Manejar el comando ADD_USER
// Formato: ADD_USER|name|memberId
// Imprimir: Registered: {name}
// TODO: Manejar el comando BORROW
// Formato: BORROW|bookId|memberId
// Imprimir el resultado de library.BorrowBook()
// TODO: Manejar el comando RETURN
// Formato: RETURN|bookId|memberId
// Imprimir el resultado de library.ReturnBook()
// TODO: Manejar el comando SEARCH
// Formato: SEARCH|type|value (type puede ser title, author, available, borrowed)
// Imprimir cada libro como "{Title} by {Author}" o "No books found"
// TODO: Manejar el comando STATUS
// Imprimir:
// --- Library Status ---
// Total Books: {count}
// Available: {count}
// Total Users: {count}
// Books Borrowed: {count}
}
}
}
}
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 UsuarioLógica del Sistema de PréstamosLINQ para BúsquedasInterfaz de Consola / Interfaz de AdministradorPruebas Unitarias (NUnit/xUnit)Practica por tu cuenta: Compilador de C# online