Lógica do Sistema de Empréstimos
Parte da seção Programação Orientada a Objetos do Journey de C# da Coddy — lição 64 de 70.
Desafio
FácilVamos dar vida ao seu Sistema de Biblioteca implementando a lógica central de empréstimo! Você criará um sistema centralizado que coordena entre livros e usuários, aplicando regras da biblioteca, como limites de empréstimo e garantindo que os livros só possam ser emprestados quando estiverem disponíveis.
Você continuará construindo sobre sua estrutura existente de quatro arquivos:
Book.cs: Mantenha sua classe Book com as propriedadesId,Title,AuthoreIsAvailable, junto com os métodosBorrow()eReturn()da lição anterior.User.cs: Mantenha sua classe User comName,MemberId,BorrowedCounte os métodos para gerenciar livros emprestados. Adicione uma constanteMaxBooksdefinida como 3 que representa o número máximo de livros que um usuário pode emprestar de uma vez. Adicione um métodoCanBorrow()que retorna true apenas se o usuário tiver emprestado menos deMaxBooks.Library.cs: É aqui que a lógica do seu sistema de empréstimo se une. Sua classe Library deve ter coleções de livros e usuários, além de métodos para adicioná-los. Implemente dois métodos principais:BorrowBook(string bookId, int memberId)- Coordena o processo de empréstimo. Ele deve verificar se o livro existe, se o usuário existe, se o livro está disponível e se o usuário pode emprestar mais livros. Retorne as mensagens apropriadas para cada caso de falha ou sucesso.ReturnBook(string bookId, int memberId)- Lida com devoluções verificando se o usuário realmente possui o livro antes de processar a devolução.
Program.cs: Processa as operações da biblioteca e exibe os resultados.
Seu método BorrowBook deve retornar estas mensagens com base na situação:
Book not found- quando o ID do livro não existeUser not found- quando o ID do membro não existe{Title} is not available- quando o livro já está emprestado{Name} has reached the borrowing limit- quando o usuário já possui 3 livros{Name} borrowed {Title}- em caso de empréstimo bem-sucedido
Seu método ReturnBook deve retornar:
Book not foundouUser not found- para IDs inválidos{Name} did not borrow {Title}- quando o usuário tenta devolver um livro que não possui{Name} returned {Title}- em caso de devolução bem-sucedida
Você receberá as seguintes entradas:
- Nome da biblioteca
- Número de livros, depois cada livro como
id|title|author - Número de usuários, depois cada usuário como
name|memberId - Número de operações, depois cada operação como
action|bookId|memberId
Imprima o resultado de cada operação em sua própria linha.
Por exemplo, se as entradas forem:
Central Library
4
B001|The Hobbit|Tolkien
B002|1984|Orwell
B003|Dune|Herbert
B004|Foundation|Asimov
2
Alice|101
Bob|102
6
borrow|B001|101
borrow|B002|101
borrow|B003|101
borrow|B004|101
borrow|B001|102
return|B002|101A saída deve ser:
Alice borrowed The Hobbit
Alice borrowed 1984
Alice borrowed Dune
Alice has reached the borrowing limit
The Hobbit is not available
Alice returned 1984Observe como a classe Library atua como coordenadora - ela valida todas as condições antes de permitir as operações, mantendo suas classes Book e User focadas em suas próprias responsabilidades. Essa separação torna seu código mais fácil de manter e testar!
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
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);
}
// 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]);
if (action == "borrow")
{
string result = library.BorrowBook(bookId, memberId);
Console.WriteLine(result);
}
else if (action == "return")
{
string result = library.ReturnBook(bookId, memberId);
Console.WriteLine(result);
}
}
}
}
}
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