Menu
Coddy logo textTech

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.

challenge icon

Desafio

Fácil

Vamos 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 um Id (string), Title (string), Author (string) e IsAvailable (bool, com valor padrão true). Adicione os métodos Borrow() e Return() 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. Inclua Name (string), MemberId (int) e uma lista privada para armazenar os IDs dos livros emprestados. Adicione uma propriedade somente leitura BorrowedCount que retorna quantos livros o usuário possui atualmente. Inclua os métodos AddBorrowedBook(string bookId) e RemoveBorrowedBook(string bookId) para gerenciar os livros emprestados do usuário. Adicione também um método HasBook(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étodos AddBook(Book book) e RegisterUser(User user) para popular a biblioteca. Adicione um método GetBookById(string id) que retorna o livro com aquele ID (ou null se não for encontrado) e GetUserById(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|memberId onde action é borrow ou return

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|101

A 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