Programmation Java Orientee Objet

Classe SDA 7 2025-2026

Projet Final : Systeme de Gestion de Bibliotheque

Une application Java complète démontrant les piliers de la POO avec architecture professionnelle

Contexte Professionnel

Vous êtes developpeur Java junior dans une startup specialisee dans les logiciels de gestion pour bibliotheques. Votre equipe doit developper un systeme robuste et extensible pour gerer differents types de medias (livres, magazines, CD, DVD). Le systeme doit supporter les operations courantes d'une bibliotheque (emprunt, retour, recherche) tout en maintenant une architecture propre et professionnelle.

Objectifs Pedagogiques et Competences

Ce projet couvre les fondamentaux de la POO en Java et vous permet de :

Architecture Globale du Projet

Votre projet doit etre organise selon une structure claire :

src/ ├── models/ │ ├── Media.java # Classe abstraite de base │ ├── Livre.java │ ├── Magazine.java │ ├── CD.java │ ├── DVD.java │ └── Empruntable.java # Interface ├── exceptions/ │ ├── MediaNonTrouveException.java │ ├── MediaDejaEmprunteException.java │ ├── QuantiteInsuffisanteException.java │ └── InvalidMediaException.java ├── services/ │ ├── Bibliotheque.java # Service principal │ ├── GestionnaireEmprunt.java │ ├── RechercheService.java │ └── PersistenceService.java ├── ui/ │ └── Menu.java # Interface utilisateur ├── utils/ │ ├── DateUtils.java │ └── ValidationUtils.java └── Main.java # Point d'entree

Missions a Realiser

1Hierarchie de Classes et Polymorphisme

Objectif : Creer une structure flexible pour representer differents types de medias.
  • Creez une classe abstraite Media avec :
    • Attributs : id (unique), titre, auteur, anneePublication, disponible (boolean)
    • Methode abstraite afficherDetails()
    • Methodes concretes : getId(), getTitre(), isDisponible(), etc.
  • Creez des sous-classes concretes : Livre (avec nbPages), Magazine (avec numeroEdition, dateParution), CD (avec artiste, duree), DVD (avec realisateur, format)
  • Implementez afficherDetails() de maniere specifique pour chaque type de media.
  • Utilisez le polymorphisme : stockez tous les medias dans une ArrayList<Media> et appelez les methodes polymorphes.

2Interfaces et Contrats

Objectif : Definir un contrat clair pour tous les medias empruntables.
  • Creez l'interface Empruntable avec les methodes :
    • boolean emprunter(Membre m, Date dateEmprunt)
    • boolean rendre(Date dateRetour)
    • boolean isEmpruntable()
  • Implementez cette interface dans Livre, Magazine et CD (DVD non-empruntable).
  • Implementez une logique d'emprunt avec date : enregistrement du membre qui emprunte, date d'emprunt, date de retour prevue.

3Gestion des Exceptions Personnalisees

Objectif : Creer une gestion d'erreurs robuste et informative.
  • Creez une classe de base BibliothequeException qui etend Exception.
  • Creez les exceptions specifiques suivantes (heritant de BibliothequeException) :
    • MediaNonTrouveException : Leve quand on cherche un media inexistant
    • MediaDejaEmprunteException : Leve quand on essaie d'emprunter un media deja emprunte
    • QuantiteInsuffisanteException : Leve quand il n'y a plus de copie disponible
    • InvalidMediaException : Leve quand les donnees du media sont invalides
    • MembereNonTrouveException : Leve quand un membre n'existe pas
  • Utilisez try-catch dans les methodes appropriees pour capturer et traiter les exceptions.
  • Afficher des messages d'erreur clairs a l'utilisateur sans planter le programme.

4Modele de Donnees pour les Membres

Objectif : Gerer les membres de la bibliotheque et leur historique d'emprunts.
  • Creez une classe Membre avec :
    • Attributs : idMembre, nom, email, dateInscription, actif (boolean)
    • Liste des emprunts actuels (ArrayList<Emprunt>)
    • Historique des emprunts passes
    • Limite de 5 emprunts simultanees
  • Creez une classe Emprunt avec : media, membre, dateEmprunt, dateRetourPrevue, dateRetourReelle, amende (si retard)
  • Implementez la gestion des amendes pour les retards (ex: 1 euro par jour).

5Collections Java Optimisees

Objectif : Choisir les structures de donnees appropriees pour optimiser les performances.
  • Utilisez HashMap<Integer, Media> pour stocker les medias par ID (recherche O(1)).
  • Utilisez HashMap<Integer, Membre> pour stocker les membres par ID.
  • Utilisez ArrayList<Emprunt> pour l'historique des emprunts.
  • Implementez des methodes de recherche efficaces utilisant les HashMap.
  • Comparez les performances HashMap vs ArrayList dans les commentaires.

6Service Bibliotheque (Orchestration)

Objectif : Creer la logique metier de la bibliotheque.
  • Creez la classe Bibliotheque qui gere :
    • Ajout/suppression/modification de medias
    • Emprunt d'un media : verifiez que le media existe, n'est pas deja emprunte, limite de 5 emprunts
    • Retour d'un media : marquez comme disponible, calculez les amendes potentielles
    • Recherche de medias par titre, auteur, categorie
    • Affichage de tous les medias disponibles/empruntes
    • Gestion des membres : inscription, consultation historique
  • Toutes les methodes doivent gerer les exceptions appropriees.
  • Implementez un systeme de logging pour tracer les operations importantes.

7Persistance des Donnees

Objectif : Sauvegarder et restaurer l'etat de la bibliotheque.
  • Creer une classe PersistenceService qui :
    • Serialise la bibliotheque (medias et membres) dans un fichier bibliotheque.dat avec ObjectOutputStream
    • Deserialise et restaure l'etat au demarrage du programme
    • Gere les exceptions de serialisation (IOException, NotSerializableException)
  • Assurez-vous que les classes Media, Membre, Emprunt implementent Serializable.
  • Implementez une sauvegarde automatique apres chaque operation critique.

8Interface Utilisateur Interactive

Objectif : Creer une interface conviviale et intuitive.
  • Creez une classe Menu avec une boucle infinie affichant les options :
    • Gestion des medias (ajouter, voir, modifier, supprimer)
    • Gestion des membres (inscire, voir, voir historique)
    • Emprunter/rendre un media
    • Rechercher (par titre, auteur, categorie)
    • Afficher les statistiques (nb medias, nb membres, emprunts en cours)
    • Quitter
  • Utilisez Scanner pour lire les entrees utilisateur.
  • Validez toutes les entrees et afficher des messages clairs.
  • Gerez les erreurs utilisateur sans planter le programme.

9Design Patterns et Principes SOLID

Objectif : Appliquer les meilleures pratiques de developpement.
  • Appliquez le pattern Singleton pour la classe Bibliotheque.
  • Utilisez le pattern Service Locator ou Dependency Injection pour injecter les dependances.
  • Respectez le principe Single Responsibility : chaque classe a une responsabilite unique.
  • Respectez le principe Open/Closed : le code doit etre extensible sans modification (ex: facile d'ajouter Livre Numerique).
  • Utilisez l'heritage et les interfaces pour eviter la duplication de code (DRY).

Exigences Techniques et Qualite

Qualite du Code Java

  • Suivez les conventions de nommage Java (camelCase pour les variables/methodes, PascalCase pour les classes).
  • Utilisez les modificateurs d'acces appropries (private, protected, public).
  • Implementez des getters et setters pour les attributs prives.
  • Utilisez toString(), equals() et hashCode() dans vos classes.
  • Documentez votre code avec des Javadoc pour les classes et methodes publiques.

Gestion des Donnees

  • Validation stricte de toutes les entrees (pas de titre vide, dates coherentes, etc.).
  • Verifiez l'integrite des donnees avant d'effectuer des operations.
  • Implementez l'encapsulation : les attributs doivent etre prives, acces via getters/setters.

Performance et Scalabilite

  • Utilisez HashMap pour les recherches rapides (O(1) vs O(n) avec ArrayList).
  • Evitez les operations couteuses en boucle (ex: recherches lineaires multipliees).
  • Laissez des commentaires sur les choix de performance.

Gestion des Erreurs

  • Creer des exceptions personnalisees pour chaque cas d'erreur metier.
  • Utiliser try-catch pour capturer et gerer les exceptions de maniere appropriee.
  • Ne jamais faire un catch(Exception e) generic : soyez specifique.
  • Fournir des messages d'erreur clairs et utiles a l'utilisateur.

Livrables Attendus

1. Code Source Complet

Projet bien organise avec tous les fichiers .java dans les packages appropries (models, services, exceptions, ui, utils).

2. Diagramme UML de Classes

Diagramme UML montrant la hierarchie des classes, les interfaces, les associations et les dependances. Peut etre cree avec un outil comme draw.io ou Lucidchart.

3. Documentation Technique (Note Technique)

Document detaille incluant :

  • Introduction et objectives du projet
  • Architecture et design : explication des choix (why HashMap vs ArrayList, pourquoi Singleton, etc.)
  • Description des classes principales et leurs responsabilites
  • Exceptions personnalisees et leurs cas d'usage
  • Patterns de conception utilises
  • Guide d'utilisation : comment compiler et executer
  • Difficultees rencontrees et solutions appliquees
  • Possibilites d'extension futur

4. Fichier de Donnees Exemple

Un fichier bibliotheque.dat contenant quelques medias et membres pour tester la persistance.

5. Presentation Orale (10 minutes)

Presentation concise incluant : demo du programme en fonctionnement, explication de l'architecture, discussion des defis techniques et solutions apportees, reflexion sur ce qui a ete appris.

Bareme de Notation

1. Architecture et Design (Hierarchie, Interfaces, Patterns) 20 pts
2. Modelisation des Donnees (Media, Membre, Emprunt) 15 pts
3. Gestion des Exceptions et Validation 15 pts
4. Logique Metier (Bibliotheque Service, Emprunts) 15 pts
5. Persistance des Donnees (Serialisation) 10 pts
6. Interface Utilisateur et Experience 10 pts
7. Qualite du Code et Documentation 10 pts
8. Diagramme UML et Note Technique 5 pts
TOTAL : 100 points

Points Bonus (Optionnel)

  • +10 pts : Implementer un systeme de recommandations : suggerer des livres bases sur l'historique d'emprunts d'un membre.
  • +8 pts : Ajouter d'autres types de medias (LivreNumerique, AudioLivre) et montrer l'extensibilite.
  • +8 pts : Implementer des statistiques avancees (medias les plus empruntes, membres les plus actifs, revenus amendes).
  • +8 pts : Interface graphique avec Swing (au lieu de console uniquement).
  • +7 pts : Systeme de notations/avis sur les medias laisse par les membres.
  • +7 pts : Reservation de medias non disponibles.
  • +5 pts : Export des donnees en fichier CSV.

Fonctionnalites Recommandees pour un Projet Plus Interessant

  • Gestion des Categories : Organiser les medias par categories (fiction, non-fiction, jeunesse, technologie).
  • Etiquettes/Tags : Permettre les recherches avancees par tags multiples.
  • Panier d'Emprunt : Permettre a un membre de creer un panier avant de confirmer l'emprunt de plusieurs medias.
  • Notification d'Amendes : Afficher les amendes dues lors du retour.
  • Disponibilite des Copies : Gerer plusieurs copies du meme media (ex: 3 copies de "Harry Potter").
  • Emprunts Renouveles : Permettre de renouveler un emprunt si personne d'autre n'attend le media.
  • Historique Detaille : Afficher dates d'emprunt, de retour, amendes payees pour chaque membre.
  • Alertes de Retard : Afficher les medias actuellement en retard avec montant d'amende.

Conseils pour Reussir

  • Commencez par la conception : Dessinez votre diagramme UML avant de coder.
  • Construisez incrementalement : Commencez par les classes de base (Media, Membre), puis les services.
  • Testez en continu : Apres chaque classe, testez-la avec du code de test dans main().
  • Gestion d'erreurs en priorite : Pensez aux cas d'erreur pendant la conception, pas apres.
  • Utilisez des outils : Utilisez un IDE comme IntelliJ IDEA ou Eclipse pour vous aider a generer getters/setters et detecter les erreurs.
  • Documentation au fur et a mesure : N'attendez pas la fin pour ecrire les Javadoc et commentaires.
  • Refactorisez : Si vous voyez du code duplique, refactorisez-le dans une methode commune.
  • Extensibilite : Pensez a comment quelqu'un d'autre pourrait ajouter de nouvelles fonctionnalites a votre code.

Ressources et References

  • Oracle Java Documentation : https://docs.oracle.com/javase/
  • Effective Java (Joshua Bloch) - Un incontournable pour la qualite du code
  • Design Patterns: Elements of Reusable Object-Oriented Software (Gang of Four)
  • UML et les Design Patterns
  • Serialization in Java: https://www.baeldung.com/java-serialization

Delai et Format de Remise

Delai : A definir selon votre calendrier academique.

Format : Archive ZIP contenant :

  • Dossier src/ avec tout le code source
  • Dossier docs/ avec la note technique et le diagramme UML
  • Fichier README.txt avec instructions de compilation et execution
  • Fichier bibliotheque.dat (donnees de test)

Questions Frequemment Posees

Est-ce que je dois vraiment avoir 4 types de medias differents ?

Oui, c'est important pour montrer votre comprehension du polymorphisme. DVD est non-empruntable pour montrer comment gerer les cas differents.

Comment gerer plusieurs copies du meme media ?

Vous pouvez soit ajouter un attribut "nbCopies" dans Media, soit creer des instances separees de Media avec le meme titre mais des IDs differents.

La serialisation est complexe, puis-je utiliser JSON a la place ?

La serialisation est au programme, donc c'est preferable. Mais si vous voulez, vous pouvez utiliser une librairie comme Jackson pour JSON.

Dois-je implementer l'interface Comparable pour trier les medias ?

Ce n'est pas obligatoire pour ce projet, mais c'est une bonne pratique et peut etre un bonus.

Comment gerer les dates correctement ?

Utilisez la classe java.time.LocalDate (moderne) plutot que java.util.Date (ancienne).