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 seu Sistema de Biblioteca desenvolvendo os modelos Book e User com funcionalidades mais avançadas. Você adicionará o acompanhamento de status dos livros, recursos de empréstimo para os usuários e o 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 exclusivo e acompanhamento 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 tentar devolver um livro que já está disponível, retorne"{Title} was not borrowed". As operações bem-sucedidas devem retornar"{Title} has been borrowed"ou"{Title} has been returned".User.cs: Expanda sua classe User para acompanhar os livros emprestados. IncluaName(string),MemberId(int) e uma lista privada para armazenar os IDs dos livros emprestados. Adicione uma propriedade somente leituraBorrowedCountque retorne quantos livros o usuário possui atualmente. Inclua os métodosAddBorrowedBook(string bookId)eRemoveBorrowedBook(string bookId)para gerenciar os livros emprestados pelo usuário. Adicione também um métodoHasBook(string bookId)que retorne true se o usuário tiver pegado emprestado aquele livro específico.Library.cs: Sua classe Library deve manter coleções de livros e usuários. Inclua os métodosAddBook(Book book)eRegisterUser(User user)para preencher a biblioteca. Adicione um métodoGetBookById(string id)que retorne o livro com esse ID (ou null se não for encontrado) eGetUserById(int memberId), que funcione de maneira semelhante para os usuários.Program.cs: Reúna 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|memberId, em que action pode serborrowoureturn
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 deverá 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, sua contagem diminui 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)Pratique por conta própria: Compilador de C# online