Aller au contenu principal

🧪 TP3 – QUIZ

danger

Le TP doit être développé à l'aide du logiciel Git. Vous devrez créer un nouveau dépôt dans GitHub et inviter votre professeur en tant que collaborateur.

Voici le format du dépôt exigé: H26-2P6-TP3-MATRICULE

  • Créer des commits réguliers et des messages de commit clairs et correctes
  • Évitez de faire un seul commit à la fin du projet.
  • Tout travail sans dépôt GitHub ou avec un dépôt inaccessible entraînera une note de 0 pour l'ensemble du TP3.
  • Un projet sans historique Git ou avec un historique non représentatif du travail pourra être pénalisé.
attention

La qualité du français fait partie de l’évaluation.

Elle sera évaluée principalement dans :

  • la documentation du projet ;
  • les messages de commit Git.

Des fautes fréquentes ou un manque de clarté pourront entraîner une pénalité.

🎯 Objectifs

Ce travail a pour objectif de vous permettre de :

  • appliquer les principes de la programmation orientée objet (héritage, polymorphisme, encapsulation, interfaces) ;
  • manipuler des collections (List<T>) ;
  • écrire des tests unitaires pour valider le comportement d’une classe ;
  • développer une application WinForms
  • utiliser les exceptions;
  • utiliser Git et GitHub pour le suivi d’un projet.

Télécharger la solution contenant le projet de départ.

Disponible ici 👉 TP3


Télécharger la démonstration

info

Une démonstration de l’application (exécutable de la solution) est fournie.

Vous pouvez l’utiliser pour mieux comprendre le fonctionnement attendu et les différentes fonctionnalités à implémenter.

Disponible ici 👉 Démonstration TP3 (nouvelle version)


Contexte

Un de vos collègues a commencé à développer une application de quiz. Il a entamé la conception du modèle de classes représentant les différentes questions du système, puis a mystérieusement disparu 🕵️‍♂️ juste avant de faire son dernier commit et de pousser son code 😄.

L’application doit permettre de générer un quiz à la demande à partir d’une banque de questions. L’utilisateur peut ensuite naviguer entre les questions, répondre à chacune d’elles et obtenir un résultat immédiat pour chaque réponse. Le score total est mis à jour au fur et à mesure de la progression dans le quiz.

En analysant son travail, vous constatez que certaines parties fonctionnent, mais que plusieurs éléments pourraient être améliorés afin de rendre le modèle plus clair, plus cohérent et plus facile à faire évoluer.

Votre mission est de reprendre ce diagramme et de proposer une version améliorée en appliquant les principes de la programmation orientée objet.

Le système doit supporter plusieurs types de questions :

  • Vrai/Faux
  • Choix unique
  • Choix multiples
  • Réponse courte
  • Réponse numérique

Chaque type de question possède un comportement spécifique pour valider et corriger une réponse.


🧭 Sommaire des tâches et évaluation

  • Partie 1 : Utiliser un dépôt GitHub (10%)
  • Partie 2 : Améliorer le diagramme de classes (20%)
  • Partie 3 : Implémenter le diagramme de classes (20%)
  • Partie 4 : Ajouter des questions à la banque (10%)
  • Partie 5 : Compléter la classe Quiz fournie (10%)
  • Partie 6 : Écrire des tests unitaires pour la classe Quiz (15%)
  • Partie 7 : Compléter le formulaire (15%)
  • Qualité du français : Le travail est noté sur 100 points. Toutefois, jusqu’à 10 points peuvent être retirés pour la qualité du français.
info

Pour la partie implémentation, vous avez deux possibilités :

  • utiliser le diagramme fourni tel quel ;
  • ou adapter votre implémentation à partir de votre diagramme amélioré.

Le diagramme fourni est suffisant pour compléter l’application.

👉 Important :
La partie 2 n’est pas bloquante. Elle permet d’améliorer le modèle proposé afin d’obtenir tous les points. Vous pouvez réaliser les autres parties du travail sans avoir complété cette section.

astuce

Faites un commit après chaque étape importante (diagramme, classes, formulaire, etc.).

attention
  • Créer des commits réguliers et des messages de commit clairs et correctes
  • Évitez de faire un seul commit à la fin du projet.
  • Assurez-vous que toutes les classes respectent les interfaces et les relations du diagramme.
danger
  • Tout projet sans historique Git pourrait être pénalisé.
  • Ne modifiez pas les signatures des méthodes déjà fournies.

📐 Diagramme de classes de départ

info

L’interface IQuestion ainsi que la classe QuestionVraiFaux sont déjà implémentées.

Cela permet :

  • de vous donner une idée sur le travail demandé
  • de vous permettre de tester votre application ;
  • d’écrire les tests unitaires de la classe Quiz.

Vous devez compléter le reste du modèle afin de supporter les autres types de questions.


🔧 Partie 1 – Utiliser un dépôt GitHub (10%)

Vous devez créer et utiliser un dépôt GitHub pour le suivi de votre projet.

Vous devez :

  • créer un dépôt GitHub pour le projet ;
  • y déposer votre code ;
  • effectuer des commits réguliers tout au long du développement ;
  • rédiger des messages de commit clairs et explicites.
astuce

Créez votre dépôt dès le début du projet et faites un commit après chaque étape importante.

attention

Évitez de faire un seul commit à la fin du projet.

danger

Tout travail sans dépôt GitHub ou avec un dépôt inaccessible entraînera une note de 0 pour l'ensemble du TP3.

Un projet sans historique Git ou avec un historique non représentatif du travail pourra être pénalisé.

🧱 Partie 2 : Améliorer le diagramme de classes (20%)

À partir du diagramme fourni et de la description des classes, proposez une version améliorée du diagramme de classes.

Vous devez réaliser un diagramme de classe UML avec visio et le remettre avec votre projet.

Votre solution doit notamment :

  • réduire les répétitions entre les classes;
  • placer les éléments communs au bon endroit;
  • améliorer la structure générale du modèle;
  • utiliser l’interface IReponseAvecIndice dans les classes concernées :
    • QuestionReponseCourte;
    • QuestionNumerique.

Vous devez conserver les comportements propres à chaque type de question.

Votre proposition doit respecter les principes de la programmation orientée objet, notamment l’héritage, le polymorphisme et l’utilisation appropriée des interfaces.

attention

Vous devez fournir :

  • un diagramme de classes UML amélioré (réalisé avec visio);
  • une courte justification de vos choix (5 à 10 lignes).

Remarque : Une amélioration mineure ou non justifiée ne permettra pas d’obtenir tous les points.

💻 Partie 3 – Implémentation du diagramme (20%)

Dans cette partie, vous devez implémenter les classes du modèle en respectant les relations et les comportements définis dans le diagramme de classes.

Deux approches sont possibles :

  • Implémentation à partir du diagramme fourni
  • Implémentation à partir de votre diagramme amélioré
attention

Votre implémentation doit être fonctionnelle, compilable et permettre de créer les différents types de questions prévus dans le modèle.

Elle doit notamment permettre :

  • la création de questions de différents types ;
  • la validation des réponses selon le type de question ;
  • le calcul du score obtenu ;
  • la gestion d’un indice pour les types de questions qui le permettent ;
  • le mélange des options pour les questions qui possèdent des choix.
info

Votre implémentation doit être cohérente avec le diagramme utilisé, qu’il s’agisse du diagramme fourni ou de votre diagramme amélioré.

🔥 Validations à implémenter dans les classes

danger

🟦 Énoncé d’une question (Enonce)

  • Règle : doit être non null, non vide, non composé uniquement d’espaces
  • Exception : ArgumentException

🟦 Points d’une question (Points)

  • Règle : doit être strictement supérieur à 0
  • Exception : ArgumentOutOfRangeException

🟦 Options d’une question à choix multiples (Options)

  • Règles :
    • ne peut pas être null
    • doit contenir au moins 2 éléments
  • Exceptions :
    • ArgumentNullException (si null)
    • ArgumentException (si < 2 éléments)

🟦 Bonne réponse (Question à réponse unique)

  • Règles :
    • ne peut pas être null, vide ou espaces
    • doit être présente dans Options
  • Exception : ArgumentException

🟦 Bonne réponse (Question à réponses multiples)

  • Règles :
    • ne peut pas être null
    • ne peut pas être vide
    • chaque réponse doit être contenue dans Options
  • Exceptions :
    • ArgumentNullException (si nulll)
    • ArgumentException (si vide ou au moins une bonne reponse n'est pas dans les options)

🟦 Réponse utilisateur (reponse)

  • Règles :
    • ne peut pas être null
    • si format incorrect → considéré comme faux (pas d’exception)
    • peut contenir des espaces ou casse différente selon type de question
  • Exception : aucune

🟦 Indice (Indice)

  • Règle : doit être non null, non vide, non espaces
  • Exception : ArgumentException

🟦 Pénalité d’indice (PenaliteIndice)

  • Règle : doit être compris entre 0 et 1 inclus
  • Exception : ArgumentOutOfRangeException

Vous pouvez utiliser les méthodes de la classe OutilsQuiz pour effectuer certaines validations (ex : vérification d’appartenance, inclusion de listes, etc.).


🗂️ Partie 4 - Ajouter des questions à la banque (10%)

Dans cette partie, vous devez compléter la classe BanqueQuestions en y ajoutant plusieurs questions.

Les questions doivent être variées et couvrir différents types définis dans le modèle (ex : numérique, vrai/faux, choix unique, choix multiples, réponse courte, etc.).

Vous devez également :

  • utiliser différentes catégories de questions ;
  • varier le nombre de points associés aux questions ;
  • respecter les contraintes propres à chaque type de question ;
  • intégrer un indice pour les questions qui le permettent.
info

Cette banque de questions sera utilisée pour générer des quiz de manière aléatoire.

astuce

Essayez de proposer des questions pertinentes et diversifiées.

🗂️ Partie 5 - Compléter la classe Quiz fournie (10%)

Dans cette partie, une classe Quiz vous est fournie. Cependant, certaines fonctionnalités sont incomplètes et doivent être implémentées.

Vous devez donc compléter cette classe afin qu’elle permette de gérer correctement le déroulement d’un quiz.

Les éléments à compléter sont indiqués directement dans le code source sous forme de commentaires TODO.

La classe doit notamment permettre :

  • de gérer la liste des questions ;
  • de conserver les réponses de l’utilisateur ;
  • de gérer la question courante ;
  • de naviguer entre les questions ;
  • d’enregistrer les réponses ;
  • de calculer les résultats du quiz.
info

La structure générale de la classe Quiz est déjà fournie afin de vous guider.

attention

Ne modifiez pas les méthodes et propriétés déjà fournies.

🧪 Partie 6 – Écrire des tests unitaires pour la classe Quiz (15%)

Dans cette partie, vous devez compléter les tests unitaires dans le projet de tests déjà créé.

Les tests doivent permettre de vérifier toutes les fonctionnalités de la classe Quiz et de valider son comportement dans différents cas.

info

Les tests unitaires doivent porter sur la logique de la classe Quiz, et non sur l’interface graphique.

astuce

Pensez à tester des cas normaux, mais aussi des cas limites, des validations et la levée des exceptions.

attention

Les tests doivent être exécutables et réussir lorsque la classe Quiz est correctement implémentée. Les tests unitaires doivent couvrir l’ensemble des fonctionnalités de la classe Quiz.

🖥️ Partie 7 – Compléter le formulaire (15%)

Le formulaire doit permettre :

  • d’afficher les questions ;
  • de saisir ou sélectionner les réponses ;
  • de naviguer entre les questions ;
  • d’afficher les résultats du quiz.

Un formulaire fonctionnel vous est fourni. Votre travail consiste à compléter ce formulaire afin de le rendre compatible avec tous les types de questions définis dans le modèle.

info
  • Le formulaire contient déjà plusieurs sections de code prévues pour les différents types de questions.
  • Votre travail consiste donc à compléter/adapter ce code afin qu’il fonctionne avec votre solution.
astuce

Commencez par faire fonctionner un type de question à la fois avant d’ajouter les autres.

attention

Le formulaire doit utiliser les interfaces et classes du modèle pour fonctionner correctement.

📦 Présentation des éléments fournis

Enum Categorie

Représente les catégories possibles d’une question.

Exemples :

  • Programmation
  • Culture générale
  • Mathématiques

Chaque question appartient à une catégorie.


Description des interfaces

IQuestion

Représente le contrat commun à toutes les questions du quiz.

Toute classe qui implémente cette interface doit fournir :

  • un énoncé;
  • une catégorie;
  • un nombre de points;
  • une méthode pour valider une réponse : Le mécanisme de validation dépend du type de question et peut varier d’une classe à une autre.
  • une méthode pour corriger une réponse et retourner le score obtenu : Toutes les questions utilisent la même logique de correction : une réponse valide donne tous les points; une réponse invalide donne 0.

Cette interface permet au quiz de manipuler toutes les questions de manière uniforme, peu importe leur type.

IReponseAvecIndice

Représente un comportement commun aux questions qui peuvent fournir un indice afin d’aider l’utilisateur.

Elle oblige la classe à fournir :

  • un indice;
  • une pénalité associée à l’utilisation de l’indice;
  • une méthode permettant d’indiquer que l’indice a été utilisé.

Par exemple, une question peut proposer un indice pour aider l’utilisateur, mais réduire le nombre de points obtenus si cet indice est utilisé.

Exemple :

  • Question (2 points) : Quelle est la capitale du Canada ?
  • Indice : C’est une ville située en Ontario.
  • Pénalité : 0.5 (l’étudiant obtient seulement 50 % des points s’il utilise l’indice)
attention

Cette interface doit être utilisée par :

  • QuestionReponseCourte.
  • QuestionNumérique.

🧱 Description des classes

QuestionVraiFaux

Représente une question dont la réponse est soit true, soit false.

Elle contient :

  • une bonne réponse booléenne.

La réponse de l’utilisateur est correcte si elle correspond exactement à la bonne réponse.

Exemple :

  • Énoncé : Le langage C# est orienté objet.
  • Bonne réponse : true

QuestionNumerique

Représente une question dont la réponse attendue est un nombre.

Elle contient :

  • une bonne réponse numérique;

La réponse de l’utilisateur est correcte si elle correspond exactement à la bonne réponse.

Exemple :

  • Quelle est la valeur approximative de PI?
  • Bonne réponse : 3.14

Classe QuestionReponseCourte

Représente une question dont la réponse est un court texte.

Elle contient :

  • une bonne réponse;

La comparaison doit ignorer les majuscules, les minuscules et les espaces inutiles.

Exemple :

  • Quelle est la capitale du Canada?
  • Bonne réponse : Ottawa

QuestionReponseUnique

Représente une question avec plusieurs options, mais une seule bonne réponse.

Elle contient :

  • une liste d’options;
  • une bonne réponse.

Elle doit permettre de :

  • vérifier si la réponse choisie est correcte;
  • mélanger l’ordre des options.

Exemple :

  • Quelle est la capitale de la France?
  • Options : Paris, Rome, Madrid
  • Bonne réponse : Paris

QuestionReponsesMultiples

Représente une question avec plusieurs bonnes réponses possibles.

Elle contient :

  • une liste d’options;
  • une liste de bonnes réponses;

Elle doit permettre de :

  • vérifier si la réponse choisie est correcte;
  • mélanger l’ordre des options.

Exemple :

  • Quels langages sont orientés objet?
  • Options : C#, Java, HTML, CSS
  • Bonnes réponses : C#, Java

Classe Quiz

Représente un quiz complet composé de plusieurs questions.

Elle contient :

  • un nom;
  • une liste de questions;
  • une liste de réponses données par l’utilisateur;
  • l’index de la question courante;

Elle doit permettre de :

  • ajouter une question;
  • consulter une question
  • répondre à une question;
  • passer à la question suivante;
  • revenir à la question précédente;
  • calculer le score total;
  • calculer le score obtenu;
  • compter le nombre de bonnes réponses.

La classe Quiz doit manipuler les questions à travers IQuestion, afin d’utiliser le polymorphisme.


Classe statique OutilsQuiz

Représente une classe utilitaire.

Elle contient des méthodes générales utilisées par plusieurs classes du projet.

Exemples :

  • mélanger une liste de questions.