Menu
Coddy logo textTech

Système d'emprunt

Fait partie de la section Object Oriented Programming du Journey Python de Coddy — leçon 57 sur 64.

challenge icon

Défi

Moyen

Dans ce défi, vous allez implémenter un système de gestion de bibliothèque avec une fonctionnalité d'emprunt.

Implémentez la fonctionnalité requise dans les fichiers suivants :

  • book.py - Contient la définition de la classe Book
  • user.py - Contient la définition de la classe User
  • library.py - Contient la classe Library où vous implémenterez la méthode borrow_book

Suivez les commentaires TODO dans chaque fichier pour un guidage d'implémentation étape par étape. La méthode borrow_book doit gérer divers scénarios, notamment le cas où le livre ou l'utilisateur n'est pas trouvé, ainsi que les vérifications de disponibilité.

Aide-mémoire

Ce défi se concentre sur la mise en œuvre d'un système de gestion de bibliothèque utilisant les principes de la programmation orientée objet. Le système comprend trois classes principales :

  • Classe Book - Représente les livres individuels dans la bibliothèque
  • Classe User - Représente les utilisateurs de la bibliothèque qui peuvent emprunter des livres
  • Classe Library - Gère la collection de livres et s'occupe des opérations d'emprunt

La fonctionnalité clé consiste à implémenter une méthode borrow_book qui gère :

  • La vérification de l'existence des livres et des utilisateurs dans le système
  • La vérification de la disponibilité des livres avant le prêt
  • La gestion du processus d'emprunt entre les utilisateurs et les livres

Essayez vous-même

from book import Book
from user import User
from library import Library
import random

# Gestionnaire de cas de test complet
test_case = input()

# Tests de fonctionnalités de base
if test_case == "borrow_success":
    library = Library("Community Library")
    
    # Ajouter des livres et des utilisateurs
    book = Book("The Great Gatsby", "F. Scott Fitzgerald", "123456")
    library.add_book(book)
    
    user = User("U001", "Alice")
    library.add_user(user)
    
    # Emprunter un livre
    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")
    
    # Ajouter des livres et des utilisateurs
    book = Book("The Great Gatsby", "F. Scott Fitzgerald", "123456")
    book.available = False  # Le livre est déjà emprunté
    library.add_book(book)
    
    user = User("U001", "Alice")
    library.add_user(user)
    
    # Essayer d'emprunter un livre non disponible
    result = library.borrow_book("123456", "U001")
    print(result)

# Cas limites et tests supplémentaires
elif test_case == "multiple_books":
    library = Library("Community Library")
    user = User("U001", "Alice")
    library.add_user(user)
    
    # Créer plusieurs livres
    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)
    
    # Emprunter plusieurs livres
    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)
    
    # Créer plusieurs utilisateurs
    users = [
        User("U001", "Alice"),
        User("U002", "Bob"),
        User("U003", "Charlie")
    ]
    
    for user in users:
        library.add_user(user)
    
    # Essayer d'emprunter le même livre avec différents utilisateurs
    result1 = library.borrow_book("999", "U001")
    result2 = library.borrow_book("999", "U002")  # Devrait échouer
    
    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)
    
    # Emprunter le livre
    borrow_result = library.borrow_book("123456", "U001")
    print(borrow_result)
    
    # Vérifier le statut du livre
    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")
    
    # Créer et ajouter 100 livres
    for i in range(1, 101):
        book = Book(f"Book {i}", f"Author {i}", f"ISBN-{i}")
        library.add_book(book)
    
    # Créer et ajouter 50 utilisateurs
    for i in range(1, 51):
        user = User(f"U{i:03d}", f"User {i}")
        library.add_user(user)
    
    # Effectuer 200 opérations d'emprunt
    successful = 0
    book_not_found = 0
    user_not_found = 0
    not_available = 0
    
    for _ in range(200):
        # Générer des ISBN et des IDs utilisateur aléatoires (certains valides, d'autres non)
        isbn = f"ISBN-{random.randint(1, 120)}"  # Certains seront invalides
        user_id = f"U{random.randint(1, 60):03d}"  # Certains seront invalides
        
        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)
    
    # Emprunter le livre
    library.borrow_book("123456", "U001")
    
    # Vérifier les références
    print(f"Book's borrower name: {book.borrower.name}")
    print(f"First book in user's borrowed list: {user.books_borrowed[0].title}")

Toutes les leçons de Object Oriented Programming