Modelos de Livro e Usuário
Parte da seção Programação Orientada a Objetos do Journey de C# da Coddy — lição 63 de 70.
Desafio
FácilVamos expandir o seu Sistema de Biblioteca construindo os modelos Book e User com funcionalidades mais ricas. Você adicionará rastreamento de status para livros, recursos de empréstimo para usuários e encapsulamento adequado para manter seus dados seguros.
Você continuará trabalhando com sua estrutura de quatro arquivos:
Book.cs: Aprimore sua classe Book com um identificador único e rastreamento de status. Cada livro deve ter umId(string),Title(string),Author(string) eIsAvailable(bool, com valor padrão true). Adicione os métodosBorrow()eReturn()que alteram o status de disponibilidade e retornam uma mensagem indicando sucesso ou falha. Se alguém tentar pegar emprestado um livro indisponível, retorne"{Title} is not available". Se tentarem devolver um livro que já está disponível, retorne"{Title} was not borrowed". Operações bem-sucedidas devem retornar"{Title} has been borrowed"ou"{Title} has been returned".User.cs: Expanda sua classe User para rastrear livros emprestados. IncluaName(string),MemberId(int) e uma lista privada para armazenar os IDs dos livros emprestados. Adicione uma propriedade somente leituraBorrowedCountque retorna quantos livros o usuário possui atualmente. Inclua os métodosAddBorrowedBook(string bookId)eRemoveBorrowedBook(string bookId)para gerenciar os livros emprestados do usuário. Adicione também um métodoHasBook(string bookId)que retorna true se o usuário tiver pegado aquele livro específico emprestado.Library.cs: Sua classe Library deve manter coleções de livros e usuários. Inclua os métodosAddBook(Book book)eRegisterUser(User user)para popular a biblioteca. Adicione um métodoGetBookById(string id)que retorna o livro com aquele ID (ou null se não for encontrado) eGetUserById(int memberId)que funciona de forma semelhante para usuários.Program.cs: Junte tudo processando as operações da biblioteca com base na entrada.
Você receberá as seguintes entradas:
- Nome da biblioteca
- Número de livros a serem adicionados
- Para cada livro:
id|title|author - Número de usuários a serem registrados
- Para cada usuário:
name|memberId - Número de operações a serem realizadas
- Para cada operação:
action|bookId|memberIdonde action éborrowoureturn
Para cada operação, imprima o resultado da ação de empréstimo ou devolução. Após todas as operações, imprima um resumo para cada usuário mostrando seu nome e quantos livros ele possui atualmente emprestados no formato {Name}: {BorrowedCount} book(s).
Por exemplo, se as entradas forem:
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|101A saída deve 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)Observe como Alice pega dois livros emprestados com sucesso, mas quando Bob tenta pegar Clean Code (que Alice já possui), a operação falha. Depois que Alice devolve Clean Code, a contagem dela cai para 1. Isso demonstra como seus modelos trabalham juntos para aplicar as regras da biblioteca!
Experimente você mesmo
using System;
using System.Collections.Generic;
namespace LibrarySystem
{
class Program
{
public static void Main(string[] args)
{
// Ler o nome da biblioteca
string libraryName = Console.ReadLine();
// Criar uma instância de Library com o nome da biblioteca
Library library = new Library(libraryName);
// Ler o número de livros
int numBooks = Convert.ToInt32(Console.ReadLine());
// Ler e adicionar livros
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);
}
// Ler o número de usuários
int numUsers = Convert.ToInt32(Console.ReadLine());
// Ler e registrar usuários
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);
}
// Ler o número de operações
int numOperations = Convert.ToInt32(Console.ReadLine());
// Processar operações
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 resumo para cada usuário
foreach (User user in usersList)
{
Console.WriteLine($"{user.Name}: {user.BorrowedCount} book(s)");
}
}
}
}Todas as lições de Programação Orientada a Objetos
1Fundamentos de POO
Arquivos ExternosNamespaces e DiretivasIntrodução a Classes e ObjetosA Palavra-chave 'this'Métodos e ParâmetrosCampos vs PropriedadesConstrutoresInicializadores de ObjetosRecapitulação - Calculadora Simples4Herança
Sintaxe Básica de Herança (:)A Palavra-chave 'base'Palavras-chave Virtual e OverrideClasses SeladasA Classe Base 'object'Recapitulação - Hierarquia de Funcionários7Recursos Avançados
Sobrecarga de OperadoresIndexadores (this[])Sobrescrita de ToString()Métodos de ExtensãoRecapitulação - Lista Personalizada10Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoSingleton Thread-SafePadrão FactoryPadrão Observer (Eventos)Padrão Strategy2Propriedades e Membros Estáticos
Propriedades AutoimplementadasPropriedades de Apenas Leitura/EscritaCampos e Métodos EstáticosClasses EstáticasMembros com Corpo de Expressão5Polimorfismo e Interfaces
Polimorfismo: Compilação vs ExecuçãoInterface vs Classe AbstrataMúltiplas InterfacesInterfaces ExplícitasUpcasting e DowncastingRecapitulação - Calculadora de Formas8Conceitos Avançados de POO
Composição sobre HerançaGenerics (Classes e Métodos)Delegates e EventosAtributos e ReflectionIDisposable e a Instrução usingFundamentos de Injeção de Dependência11Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão Composite3Arquitetura de Classes
Dados de Instância vs EstáticosPalavras-chave 'readonly' e 'const'Campos de SuporteRecapitulação - Gerenciador de Conta Bancária6Encapsulamento
Modificadores de AcessoPropriedades para EncapsulamentoImplementação de Ocultação de DadosPadrões de ImutabilidadeRecapitulação - Registros de Estudantes9Argumentos Variáveis
A Palavra-chave 'params'Parâmetros OpcionaisArgumentos NomeadosSobrecarga de Métodos12Projeto: Sistema de Biblioteca
Estrutura do ProjetoModelos de Livro e UsuárioLógica do Sistema de EmpréstimosLINQ para BuscasInterface de Console / Interface de AdminTestes de Unidade (NUnit/xUnit)