Aller au contenu

TP Semaine 3 – Design Patterns & Tests JUnit 5 & Projet Complet Chocolaterie

Ensemble de 8 TP pour mettre en pratique les notions abordées cette semaine. On pourra aussi envisager de modifier et améliorer une partie des projets et du code des 2 premières semaines de formation.

TP 1 – Factory Pattern (Univers : Cuisine / Pizzeria) pour changer

Objectif

Comprendre la différence entre :

Contexte

Vous développez une petite application de gestion de commandes pour une pizzeria.

L’application doit pouvoir créer plusieurs types de pizzas :

Chaque pizza possède un nom et un prix.

Énoncé

Partie A – Version simple avec if

  1. Créez une classe abstraite Pizza contenant :
    • un attribut nom
    • un attribut prix
    • une méthode afficher()
  2. Créez les classes concrètes :
    • PizzaMargherita
    • PizzaReine
    • PizzaQuatreFromages
  3. Créez une classe PizzaService contenant une méthode :
public Pizza creerUnePizzaSelonSonType(String type)
  1. Dans cette méthode, utilisez des if pour instancier la bonne pizza selon le type demandé.
  2. Dans une classe Main, testez la création de plusieurs pizzas.

Partie B – Refactorisation avec Factory

  1. Créez une classe PizzaFactory.
  2. Déplacez toute la logique d’instanciation dans une méthode statique :
public static Pizza creerPizza(String type)
  1. Modifiez PizzaService pour qu’il utilise PizzaFactory.
  2. Vérifiez que le comportement reste identique.

Contraintes

Questions de réflexion


TP 2 – Singleton Pattern (Univers : Log d’application)

Objectif

Comprendre comment garantir qu’une classe ne possède qu’une seule instance.

Contexte

Vous développez une application qui doit écrire des messages dans un journal unique.

Il ne doit exister qu’un seul logger dans toute l’application, afin que tous les messages passent par le même objet.

Énoncé

Partie A – Version sans Singleton

  1. Créez une classe Logger contenant une méthode :
public void log(String message)
  1. Dans une classe Main, créez deux objets Logger différents.
  2. Affichez leurs références et observez qu’il s’agit de deux objets distincts.

Partie B – Mise en place du Singleton

  1. Transformez Logger en Singleton.
  2. Le constructeur doit devenir private.
  3. Ajoutez un attribut statique pour stocker l’unique instance.
  4. Ajoutez une méthode :
public static Logger getInstance()
  1. Vérifiez dans le Main que deux appels à getInstance() renvoient la même référence.

Contraintes

Questions de réflexion


TP 3 – DAO Pattern (Univers : Bibliothèque)

Objectif

Comprendre comment séparer :

Contexte

Vous développez une mini-application de gestion de bibliothèque.

L’application doit manipuler des livres avec :

Pour commencer, les données seront stockées en mémoire dans une liste.

Énoncé

  1. Créez une classe Livre avec :
    • id
    • titre
    • auteur
  2. Créez une interface LivreDAO avec les méthodes suivantes :
void save(Livre livre);
Livre findById(int id);
List<Livre> findAll();
boolean deleteById(int id);
  1. Créez une implémentation LivreDAOMemory qui stocke les livres dans une ArrayList.
  2. Créez une classe BibliothequeService qui utilise le DAO.
  3. Dans une classe Main, réalisez les opérations suivantes :
    • ajouter 3 livres
    • afficher tous les livres
    • rechercher un livre par identifiant
    • supprimer un livre
    • réafficher la liste

Contraintes

Questions de réflexion


TP 4 – Builder Pattern (Univers : Configuration d’ordinateur)

Objectif

Comprendre comment construire proprement un objet comportant plusieurs options.

Contexte

Vous développez une application de configuration de PC.

Un ordinateur peut avoir plusieurs caractéristiques :

Toutes les options ne sont pas obligatoires au départ.

Énoncé

  1. Créez une classe Ordinateur avec les attributs suivants :
    • processeur
    • ram
    • stockage
    • carteGraphique
    • systeme
  2. Créez une classe OrdinateurBuilder permettant de construire un objet Ordinateur étape par étape.
  3. Chaque méthode du builder doit retourner this pour permettre l’enchaînement.
  4. Ajoutez une méthode build() qui retourne l’objet final.
  5. Dans le Main, créez :
    • un PC bureautique simple
    • un PC gamer
    • un PC sans carte graphique dédiée

Contraintes

Questions de réflexion


TP 5 – Command Pattern (Univers : Télécommande de maison connectée) - optionnel

Objectif

Comprendre comment encapsuler une action dans un objet.

Contexte

Vous développez une télécommande pour une maison connectée.

La télécommande doit pouvoir exécuter différentes actions :

Énoncé

  1. Créez une interface Command avec la méthode :
void execute();
  1. Créez des classes représentant les appareils :
    • Lumiere
    • Volet
  2. Créez les commandes concrètes :
    • AllumerLumiereCommand
    • EteindreLumiereCommand
    • OuvrirVoletCommand
    • FermerVoletCommand
  3. Créez une classe Telecommande capable de recevoir une commande et de l’exécuter.
  4. Dans le Main, testez plusieurs commandes successives.

Contraintes

Questions de réflexion


TP libre

Ajouter JUnit dans l’un de vos anciens projets (tp) des semaines passées et ajoutez-y des tests unitaires.

TP 6 – Tests JUnit 5 n°1 (Gestion d’un panier d’achat)

Objectif

Écrire des tests unitaires sur une petite classe métier.

Contexte

Vous développez un panier d’achat simplifié.

Le panier doit permettre :

Énoncé

  1. Créez une classe Panier avec une liste d’articles.
  2. Ajoutez les méthodes suivantes :
void ajouterArticle(String article);
int getNombreArticles();
void vider();
boolean estVide();
  1. Écrivez une classe de test PanierTest avec JUnit 5.
  2. Vérifiez au minimum :
    • qu’un panier vide contient 0 article
    • que l’ajout d’un article augmente le compteur
    • que vider() rend le panier vide

Contraintes


TP 7 – Tests JUnit 5 n°2 (Conversion de température)

Objectif

Tester plusieurs cas simples de calcul.

Contexte

Vous développez un utilitaire de conversion de températures.

Énoncé

  1. Créez une classe TemperatureConverter avec les méthodes :
double celsiusVersFahrenheit(double celsius);
double fahrenheitVersCelsius(double fahrenheit);
  1. Écrivez une classe TemperatureConverterTest.
  2. Testez plusieurs conversions connues :
    • 0°C -> 32°F
    • 100°C -> 212°F
    • 32°F -> 0°C
    • 212°F -> 100°C

Contraintes


TP 8 – Tests JUnit 5 n°3 (Gestion d’un mot de passe)

Objectif

Tester des règles de validation métier.

Contexte

Vous développez un validateur de mot de passe.

Un mot de passe sera considéré comme valide s’il :

Énoncé

  1. Créez une classe PasswordValidator avec une méthode :
boolean isValid(String password)
  1. Écrivez une classe PasswordValidatorTest.
  2. Rédigez plusieurs tests pour vérifier :
    • un mot de passe valide
    • un mot de passe trop court
    • un mot de passe sans majuscule
    • un mot de passe sans chiffre

Contraintes


Bilan

Ces TP permettent de mettre en pratique ce que l’on voit cette semaine en Java :


Conseils

Projet Complet - Chocolaterie

Lien vers le Projet Chocolaterie - peut-être pour la semaine avec Spring Boot…