Aller au contenu principal

Atelier 11. Bibliothèque Musicale (HashMap + Git)

Contexte

Tu travailles sur une petite application de gestion de bibliothèque musicale. L'application doit permettre de stocker des chansons et de les retrouver rapidement par titre.

Tu vas développer cette fonctionnalité sur une branche Git dédiée, puis la fusionner dans main une fois complétée.


Partie 1 — Mise en place Git

  1. Crée un nouveau dépôt Git local (ou utilise un projet Java existant).
  2. Crée une branche nommée feature/bibliotheque et bascule dessus.
git branch feature/bibliotheque
git switch feature/bibliotheque
  1. Vérifie que tu es bien sur la bonne branche :
git branch

Partie 2 — Implémentation Java

Crée une classe Bibliotheque qui utilise un HashMap<String, String> pour associer le titre d'une chanson à son artiste.

Méthodes à implémenter :

MéthodeDescription
ajouterChanson(String titre, String artiste)Ajoute une chanson. Si le titre existe déjà, affiche un avertissement et n'écrase pas.
rechercherArtiste(String titre)Retourne l'artiste associé au titre, ou un message si introuvable.
supprimerChanson(String titre)Supprime une chanson par titre.
afficherBibliotheque()Affiche toutes les chansons dans le format Titre → Artiste.
compterChansons()Retourne le nombre de chansons dans la bibliothèque.

Dans le main, teste les cas suivants :

  1. Ajoute au moins 5 chansons de 3 artistes différents.
  2. Tente d'ajouter une chanson dont le titre existe déjà.
  3. Recherche un titre existant et un titre inexistant.
  4. Supprime une chanson, puis affiche la bibliothèque pour confirmer.
  5. Affiche le nombre de chansons restantes.

Partie 3 — Commits Git

Une fois ta classe Bibliotheque fonctionnelle, effectue deux commits distincts :

Commit 1 — après avoir implementé la classe avec ajouterChanson et afficherBibliotheque :

git add .
git commit -m "feat: ajouter la structure de base de Bibliotheque avec HashMap"

Commit 2 — après avoir ajouté les méthodes rechercherArtiste, supprimerChanson et compterChansons :

git add .
git commit -m "feat: ajouter recherche, suppression et comptage dans Bibliotheque"

Vérifie l'historique de ta branche :

git log --oneline

Partie 4 — Provoquer un conflit de merge

Avant de fusionner, on va simuler ce qui arrive quand deux développeurs modifient la même méthode en parallèle.

  1. Retourne sur main sans avoir fusionné :
git switch main
  1. Sur main, modifie la méthode afficherBibliotheque() pour qu'elle affiche les chansons avec un format différent, par exemple :
// Version main : format numéroté
System.out.println((i++) + ". " + titre + " par " + artiste);

Commit ce changement sur main :

git add .
git commit -m "fix: afficher la bibliothèque avec numérotation"
  1. Tente maintenant de fusionner ta branche de fonctionnalité :
git merge feature/bibliotheque

Git va détecter que les deux branches ont modifié la même méthode et va s'arrêter :

CONFLICT (content): Merge conflict in Bibliotheque.java
Automatic merge failed; fix conflicts then commit the result.

Partie 5 — Résoudre le conflit

Ouvre le fichier en conflit. Git a marqué les zones problématiques :

<<<<<<< HEAD
// Version main : format numéroté
System.out.println((i++) + ". " + titre + " par " + artiste);
=======
// Version feature/bibliotheque : format flèche
System.out.println(titre + " → " + artiste);
>>>>>>> feature/bibliotheque
  • La section entre <<<<<<< HEAD et ======= est ce qui existe sur main.
  • La section entre ======= et >>>>>>> feature/bibliotheque vient de ta branche.

À toi de décider quelle version garder (ou d'en écrire une troisième qui combine les deux). Supprime les marqueurs de conflit (<<<<<<<, =======, >>>>>>>), puis :

git add .
git commit -m "merge: résoudre le conflit dans afficherBibliotheque"

Vérifie l'historique final pour voir le merge commit :

git log --oneline --graph

Tu devrais voir quelque chose comme :

* c3f1a2b merge: résoudre le conflit dans afficherBibliotheque
|\
| * 9e4d1f0 feat: ajouter recherche, suppression et comptage dans Bibliotheque
| * 7b2c3a1 feat: ajouter la structure de base de Bibliotheque avec HashMap
* | 4a8e2d3 fix: afficher la bibliothèque avec numérotation
|/
* 1f0c9b2 Initial commit

Questions de réflexion

  1. Pourquoi un HashMap est-il plus approprié qu'un ArrayList pour cette application ?
  2. Que se passerait-il si on utilisait un HashSet<String> à la place ? Qu'est-ce qu'on perdrait ?
  3. Dans ajouterChanson, quelle méthode du HashMap permet de vérifier si une clé existe déjà avant d'insérer ?
  4. Pourquoi avoir fait deux commits séparés plutôt qu'un seul gros commit à la fin ?
  5. Lors d'un conflit, Git ne peut pas décider seul quelle version garder. Pourquoi ? Dans quel cas Git réussit-il à merger automatiquement sans conflit ?