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 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 exclusivo e rastreamento de status. Cada livro deve ter umId(string),Title(string),Author(string) eIsAvailable(bool, com 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 emprestar 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 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 popular a biblioteca. Adicione um métodoGetBookById(string id)que retorna o livro com esse ID (ou null se não for encontrado) eGetUserById(int memberId)que funciona de forma semelhante para 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|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 tem emprestados no momento 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 empresta com sucesso dois livros, mas quando Bob tenta emprestar Clean Code (que Alice já possui), a operação falha. Depois que Alice devolve Clean Code, sua contagem cai para 1. Isso demonstra como seus modelos trabalham juntos para aplicar as regras da biblioteca!
Experimente você mesmo
using System;
namespace LibrarySystem
{
class Program
{
public static void Main(string[] args)
{
// Lê as entradas
string libraryName = Console.ReadLine();
string bookInput = Console.ReadLine();
string userInput = Console.ReadLine();
// Analisa a entrada do livro (formato: title|author)
string[] bookParts = bookInput.Split('|');
string bookTitle = bookParts[0];
string bookAuthor = bookParts[1];
// Analisa a entrada do usuário (formato: name|memberId)
string[] userParts = userInput.Split('|');
string userName = userParts[0];
int memberId = Convert.ToInt32(userParts[1]);
// Cria uma instância de Library com o nome da biblioteca
Library library = new Library(libraryName);
// Cria uma instância de Book com o título e o autor
Book book = new Book(bookTitle, bookAuthor);
// Cria uma instância de User com o nome e o ID de membro
User user = new User(userName, memberId);
// Imprime as informações da biblioteca usando GetInfo()
Console.WriteLine(library.GetInfo());
// Imprime as informações do livro no formato: Book: {Title} by {Author} - Available: {IsAvailable}
Console.WriteLine($"Book: {book.Title} by {book.Author} - Available: {book.IsAvailable}");
// Imprime as informações do usuário no formato: User: {Name} (ID: {MemberId})
Console.WriteLine($"User: {user.Name} (ID: {user.MemberId})");
}
}
}
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ário