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 allez organiser 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 étant disponibles.
  • user.go : votre structure User avec ID, Name, Email et BorrowedBooks (une tranche d’identifiants 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 identifiants). Créez les composants suivants :
    • 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 reçoit un identifiant d’utilisateur et un identifiant de livre, valide l’opération, marque le livre comme indisponible, ajoute l’identifiant du livre à la liste des emprunts de l’utilisateur et renvoie une erreur en cas de problème
    • Une méthode Return qui inverse le processus d’emprunt : marque le livre comme disponible et le retire de la liste des emprunts de l’utilisateur

    Votre méthode Borrow doit renvoyer les erreurs suivantes :

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

    Votre méthode Return doit renvoyer les erreurs suivantes :

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

    Lisez le nombre de livres, puis, pour chaque livre, lisez son identifiant, son titre, son auteur et son ISBN. Ensuite, lisez le nombre d’utilisateurs et, pour chaque utilisateur, lisez son identifiant, son nom et son adresse e-mail. Lisez ensuite le nombre d’opérations, chaque opération étant soit borrow [userID] [bookID], soit return [userID] [bookID].

    Pour chaque opération, affichez OK si elle réussit, ou Error: [message] en cas d’échec.

Les entrées suivantes seront fournies :

  • Le nombre de livres, puis l’identifiant, le titre, l’auteur et l’ISBN de chaque livre (chacun sur une ligne distincte)
  • Le nombre d’utilisateurs, puis l’identifiant, le nom et l’adresse e-mail de chaque utilisateur (chacun sur une ligne distincte)
  • Le nombre d’opérations, puis chaque opération sur une ligne distincte

Par exemple, étant donné :

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 doit être :

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

Et étant donné :

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 doit être :

OK
Error: book not available
OK

Et étant donné :

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 doit être :

Error: book not borrowed
Error: book not found

Remarquez comment la bibliothèque agit comme coordinateur central. Elle valide toutes les opérations avant de modifier l’état, ce qui garantit que les livres et les utilisateurs restent synchronisés. L’utilisation de récepteurs 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.Fscanln(reader, &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.Fscanln(reader, &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.Fscanln(reader, &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
		// Affiche "OK" en cas de succès ou "Error: [message]" en cas d'échec
	}
}

Toutes les leçons de Programmation Orientée Objet

Entraînez-vous par vous-même : Compilateur Go en ligne