Sistema de Empréstimos
Parte da seção Object Oriented Programming do Journey de Python da Coddy — lição 57 de 64.
Desafio
MédioNeste desafio, você implementará um sistema de gerenciamento de biblioteca com funcionalidade de empréstimo.
Implemente a funcionalidade necessária nos seguintes arquivos:
book.py- Contém a definição da classe Bookuser.py- Contém a definição da classe Userlibrary.py- Contém a classe Library onde você implementará o métodoborrow_book
Siga os comentários TODO em cada arquivo para orientações de implementação passo a passo. O método borrow_book deve lidar com vários cenários, incluindo livro/usuário não encontrado e verificações de disponibilidade.
Folha de consulta
Este desafio foca na implementação de um sistema de gerenciamento de biblioteca usando princípios de programação orientada a objetos. O sistema envolve três classes principais:
- Classe Book - Representa livros individuais na biblioteca
- Classe User - Representa usuários da biblioteca que podem pegar livros emprestados
- Classe Library - Gerencia a coleção de livros e lida com operações de empréstimo
A funcionalidade principal envolve a implementação de um método borrow_book que lida com:
- Verificar se livros e usuários existem no sistema
- Verificar a disponibilidade do livro antes de emprestar
- Gerenciar o processo de empréstimo entre usuários e livros
Experimente você mesmo
from book import Book
from user import User
from library import Library
import random
# Manipulador abrangente de casos de teste
test_case = input()
# Testes de funcionalidade básica
if test_case == "borrow_success":
library = Library("Community Library")
# Adicionar livros e usuários
book = Book("The Great Gatsby", "F. Scott Fitzgerald", "123456")
library.add_book(book)
user = User("U001", "Alice")
library.add_user(user)
# Emprestar livro
result = library.borrow_book("123456", "U001")
print(result)
print(f"Book available: {book.available}")
print(f"Books borrowed by user: {len(user.books_borrowed)}")
elif test_case == "book_not_found":
library = Library("Community Library")
user = User("U001", "Alice")
library.add_user(user)
result = library.borrow_book("nonexistent", "U001")
print(result)
elif test_case == "user_not_found":
library = Library("Community Library")
book = Book("The Great Gatsby", "F. Scott Fitzgerald", "123456")
library.add_book(book)
result = library.borrow_book("123456", "nonexistent")
print(result)
elif test_case == "book_not_available":
library = Library("Community Library")
# Adicionar livros e usuários
book = Book("The Great Gatsby", "F. Scott Fitzgerald", "123456")
book.available = False # O livro já está emprestado
library.add_book(book)
user = User("U001", "Alice")
library.add_user(user)
# Tentar emprestar livro indisponível
result = library.borrow_book("123456", "U001")
print(result)
# Casos de borda e testes adicionais
elif test_case == "multiple_books":
library = Library("Community Library")
user = User("U001", "Alice")
library.add_user(user)
# Criar múltiplos livros
books = [
Book("Book 1", "Author 1", "111"),
Book("Book 2", "Author 2", "222"),
Book("Book 3", "Author 3", "333")
]
for book in books:
library.add_book(book)
# Emprestar múltiplos livros
results = []
for book in books:
results.append(library.borrow_book(book.isbn, "U001"))
for result in results:
print(result)
print(f"Total books borrowed: {len(user.books_borrowed)}")
elif test_case == "multiple_users":
library = Library("Community Library")
book = Book("Popular Book", "Famous Author", "999")
library.add_book(book)
# Criar múltiplos usuários
users = [
User("U001", "Alice"),
User("U002", "Bob"),
User("U003", "Charlie")
]
for user in users:
library.add_user(user)
# Tentar emprestar o mesmo livro com usuários diferentes
result1 = library.borrow_book("999", "U001")
result2 = library.borrow_book("999", "U002") # Deve falhar
print(result1)
print(result2)
print(f"Book's borrower: {book.borrower.name}")
elif test_case == "return_book":
library = Library("Community Library")
book = Book("The Great Gatsby", "F. Scott Fitzgerald", "123456")
library.add_book(book)
user = User("U001", "Alice")
library.add_user(user)
# Emprestar o livro
borrow_result = library.borrow_book("123456", "U001")
print(borrow_result)
# Verificar status do livro
print(f"Book available: {book.available}")
print(f"Book borrower: {book.borrower.name}")
print(f"User's borrowed books: {len(user.books_borrowed)}")
print(f"First borrowed book title: {user.books_borrowed[0].title}")
elif test_case == "empty_library":
library = Library("Empty Library")
result = library.borrow_book("any_isbn", "any_user_id")
print(result)
elif test_case == "stress_test":
library = Library("Large Library")
# Criar e adicionar 100 livros
for i in range(1, 101):
book = Book(f"Book {i}", f"Author {i}", f"ISBN-{i}")
library.add_book(book)
# Criar e adicionar 50 usuários
for i in range(1, 51):
user = User(f"U{i:03d}", f"User {i}")
library.add_user(user)
# Realizar 200 operações de empréstimo
successful = 0
book_not_found = 0
user_not_found = 0
not_available = 0
for _ in range(200):
# Gerar ISBNs e IDs de usuário aleatórios (alguns válidos, outros inválidos)
isbn = f"ISBN-{random.randint(1, 120)}" # Alguns serão inválidos
user_id = f"U{random.randint(1, 60):03d}" # Alguns serão inválidos
result = library.borrow_book(isbn, user_id)
if result == "Book borrowed successfully":
successful += 1
elif result == "Book not found":
book_not_found += 1
elif result == "User not found":
user_not_found += 1
elif result == "Book is not available":
not_available += 1
print(f"Successful borrows: {successful}")
print(f"Book not found: {book_not_found}")
print(f"User not found: {user_not_found}")
print(f"Book not available: {not_available}")
elif test_case == "borrower_reference":
library = Library("Community Library")
book = Book("The Great Gatsby", "F. Scott Fitzgerald", "123456")
library.add_book(book)
user = User("U001", "Alice")
library.add_user(user)
# Emprestar o livro
library.borrow_book("123456", "U001")
# Verificar referências
print(f"Book's borrower name: {book.borrower.name}")
print(f"First book in user's borrowed list: {user.books_borrowed[0].title}")Todas as lições de Object Oriented Programming
1Fundamentos de POO
Arquivos ExternosIntrodução à POOClasses vs ObjetosO Parâmetro selfMétodosAtributosMétodo Construtor (__init__)Recapitulação - Calculadora Simples4Herança
Herança BásicaA Função super()Sobrescrita de MétodoHerança MúltiplaOrdem de Resolução de MétodosRecapitulação - Hierarquia de Funcionários7Métodos Especiais
Introdução aos Métodos MágicosSobrecarga de OperadoresMétodos Mágicos de ContêinerRecapitulação - Lista Personalizada10Padrões de Projeto Parte 1
Introdução a Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão Strategy2Decoradores
Introdução aos DecoradoresDecorador de PropriedadeDecorador de Método EstáticoDecorador de Método de Classe5Polimorfismo
Sobrescrita de Método RevisitadaDuck TypingClasses e Métodos AbstratosDesign de InterfacesRecapitulação - Calculadora de Formas8Conceitos Avançados de POO
Composição vs HerançaMixinsMétodos Estáticos e de ClasseDecoradores de ClasseGerenciadores de Contexto11Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão Composite3Propriedades de Classe
Variáveis de Instância vs de ClasseDecoradores de PropriedadeAtributos PrivadosRecapitulação - Gerenciador de Conta Bancária6Encapsulamento
Membros Públicos, Protegidos e PrivadosModificadores de AcessoOcultação de InformaçãoProperty Decorators AvançadosRecapitulação - Sistema de Registro de Alunos12Projeto: Gerenciamento de Biblioteca
Visão Geral do ProjetoClasses Livro e Usuário