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
- Crée un nouveau dépôt Git local (ou utilise un projet Java existant).
- Crée une branche nommée
feature/bibliothequeet bascule dessus.
git branch feature/bibliotheque
git switch feature/bibliotheque
- 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éthode | Description |
|---|---|
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 :
- Ajoute au moins 5 chansons de 3 artistes différents.
- Tente d'ajouter une chanson dont le titre existe déjà.
- Recherche un titre existant et un titre inexistant.
- Supprime une chanson, puis affiche la bibliothèque pour confirmer.
- 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.
- Retourne sur
mainsans avoir fusionné :
git switch main
- Sur
main, modifie la méthodeafficherBibliotheque()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"
- 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
<<<<<<< HEADet=======est ce qui existe surmain. - La section entre
=======et>>>>>>> feature/bibliothequevient 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
- Pourquoi un
HashMapest-il plus approprié qu'unArrayListpour cette application ? - Que se passerait-il si on utilisait un
HashSet<String>à la place ? Qu'est-ce qu'on perdrait ? - Dans
ajouterChanson, quelle méthode duHashMappermet de vérifier si une clé existe déjà avant d'insérer ? - Pourquoi avoir fait deux commits séparés plutôt qu'un seul gros commit à la fin ?
- 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 ?