Menu
Coddy logo textTech

Système d'emprunt

Fait partie de la section Programmation Orientée Objet du Journey GO de Coddy — leçon 100 sur 107.

challenge icon

Défi

Facile

Construisons le système d'emprunt pour notre projet de gestion de bibliothèque ! Vous allez créer une structure Library qui gère des collections de livres et d'utilisateurs, avec des méthodes pour gérer les opérations d'emprunt et de retour — le tout avec une validation appropriée.

Vous organiserez votre code sur quatre fichiers :

  • book.go : Votre structure Book de la leçon précédente avec les champs ID, Title, Author, ISBN, et Available. Incluez le constructeur NewBook qui initialise les livres comme disponibles.

  • user.go : Votre structure User avec les champs ID, Name, Email, et BorrowedBooks (une tranche d'IDs de livres). Incluez le constructeur NewUser qui initialise les utilisateurs avec une liste d'emprunts vide.
  • library.go : Créez une structure Library qui stocke les livres et les utilisateurs dans des maps (indexées par leurs IDs). Construisez ces composants :
    • Un constructeur NewLibrary qui initialise des maps vides pour les livres et les utilisateurs
    • Une méthode AddBook qui ajoute un livre à la bibliothèque
    • Une méthode AddUser qui ajoute un utilisateur à la bibliothèque
    • Une méthode Borrow qui prend un ID d'utilisateur et un ID de livre, valide l'opération, marque le livre comme indisponible, ajoute l'ID du livre à la liste d'emprunts de l'utilisateur, et retourne une erreur si quelque chose ne va pas
    • Une méthode Return qui inverse le processus d'emprunt — marque le livre comme disponible et le retire de la liste d'emprunts de l'utilisateur

    Votre méthode Borrow doit retourner ces erreurs :

    • user not found si l'ID de l'utilisateur n'existe pas
    • book not found si l'ID du livre n'existe pas
    • book not available si le livre est déjà emprunté

    Votre méthode Return doit retourner ces erreurs :

    • user not found si l'ID de l'utilisateur n'existe pas
    • book not found si l'ID du livre n'existe pas
    • book not borrowed si le livre est déjà disponible
  • main.go : Rassemblez le tout en créant une bibliothèque, en ajoutant des livres et des utilisateurs, puis en traitant les opérations d'emprunt/retour.

    Lisez le nombre de livres, puis pour chaque livre, lisez son ID, son titre, son auteur et son ISBN. Ensuite, lisez le nombre d'utilisateurs, et pour chaque utilisateur, lisez son ID, son nom et son email. Enfin, lisez le nombre d'opérations, où chaque opération est soit borrow [userID] [bookID] soit return [userID] [bookID].

    Pour chaque opération, affichez soit OK en cas de succès, soit Error: [message] en cas d'échec.

Les entrées suivantes seront fournies :

  • Le nombre de livres, puis l'ID, le titre, l'auteur et l'ISBN de chaque livre (chacun sur des lignes séparées)
  • Le nombre d'utilisateurs, puis l'ID, le nom et l'email de chaque utilisateur (chacun sur des lignes séparées)
  • Le nombre d'opérations, puis chaque opération sur une ligne séparée

Par exemple, pour :

2
B001
The Go Programming Language
Alan Donovan
978-0134190440
B002
Clean Code
Robert Martin
978-0132350884
1
U001
Alice Smith
alice@library.com
4
borrow U001 B001
borrow U001 B001
return U001 B001
borrow U002 B001

Votre sortie devrait être :

OK
Error: book not available
OK
Error: user not found

Et pour :

1
B100
Design Patterns
Gang of Four
978-0201633610
2
U001
Bob Jones
bob@email.com
U002
Carol White
carol@email.com
3
borrow U001 B100
borrow U002 B100
return U001 B100

Votre sortie devrait être :

OK
Error: book not available
OK

Et pour :

1
B001
Go in Action
William Kennedy
978-1617291784
1
U001
Dave Miller
dave@test.com
2
return U001 B001
borrow U001 B999

Votre sortie devrait être :

Error: book not borrowed
Error: book not found

Remarquez comment la Library agit comme le coordinateur central — elle valide toutes les opérations avant de modifier l'état, garantissant que les livres et les utilisateurs restent synchronisés. L'utilisation de récepteurs de pointeurs permet à vos méthodes de modifier les données réelles stockées dans les maps !

Essayez vous-même

package main

import (
	"bufio"
	"fmt"
	"os"
	"strings"
)

func main() {
	reader := bufio.NewReader(os.Stdin)

	// Lire le nombre de livres
	var numBooks int
	fmt.Scanln(&numBooks)

	// TODO: Créer une nouvelle bibliothèque

	// TODO: Lire les détails de chaque livre (ID, Title, Author, ISBN sur des lignes séparées)
	// et les ajouter à la bibliothèque
	for i := 0; i < numBooks; i++ {
		id, _ := reader.ReadString('\n')
		id = strings.TrimSpace(id)
		title, _ := reader.ReadString('\n')
		title = strings.TrimSpace(title)
		author, _ := reader.ReadString('\n')
		author = strings.TrimSpace(author)
		isbn, _ := reader.ReadString('\n')
		isbn = strings.TrimSpace(isbn)

		// TODO: Créer le livre et l'ajouter à la bibliothèque
	}

	// Lire le nombre d'utilisateurs
	var numUsers int
	fmt.Scanln(&numUsers)

	// TODO: Lire les détails de chaque utilisateur (ID, Name, Email sur des lignes séparées)
	// et les ajouter à la bibliothèque
	for i := 0; i < numUsers; i++ {
		id, _ := reader.ReadString('\n')
		id = strings.TrimSpace(id)
		name, _ := reader.ReadString('\n')
		name = strings.TrimSpace(name)
		email, _ := reader.ReadString('\n')
		email = strings.TrimSpace(email)

		// TODO: Créer l'utilisateur et l'ajouter à la bibliothèque
	}

	// Lire le nombre d'opérations
	var numOps int
	fmt.Scanln(&numOps)

	// TODO: Traiter chaque opération
	// Format : "borrow [userID] [bookID]" ou "return [userID] [bookID]"
	for i := 0; i < numOps; i++ {
		line, _ := reader.ReadString('\n')
		line = strings.TrimSpace(line)
		parts := strings.Split(line, " ")

		// TODO: Analyser l'opération et appeler la méthode appropriée
		// Afficher "OK" en cas de succès ou "Error: [message]" en cas d'échec
	}
}

Toutes les leçons de Programmation Orientée Objet