2013 2014 Université Paris Diderot Paris 7 Master 1 Informatique UFR Informatique Olden Fabre, Cynthia Thimon, Jakub Kaluza, Jean Desravines, Oliver Hamm Spécification fonctionnelle Syllabus -1-
TABLE DES MATIERES 1 INTRODUCTION...3 2 SPECIFICATIONS GENERALES...4 2.1 Présentation et Environnement du logiciel...4 2.2 Déploiement de l'application...4 2.3 Le système...5 2.3.1 Performances...5 2.3.2 Installation...5 2.3.3 Evolutions...5 2.3.4 Les outils...5 3 SPECIFICATIONS FONCTIONNELLES...6 3.1 Définition des acteurs...6 3.2 Diagrammes de cas d'utilisation...7 3.3 Diagrammes de séquence...11 3.4 Types de données abstraits...20 3.1 3.5 Structure du logiciel...25 3.4.1 Diagramme de Paquetages...25 3.4.2 Diagrammes de Classes...26 Package Reponse :...28 Package BasedeDonnees :...28 Package Web :...28 Package Web.Core :...29 3.4.3 Modules...30 3.5 Interfaces...31-2-
1 INTRODUCTION Syllabus est une plate-forme de cours qui répond à la demande des étudiants d'avoir un outil fiable sur lequel ils peuvent s'instruire, travailler et apprendre de nouvelles connaissances. C'est aussi un moyen de recevoir des corrections et notes de manière rapide contrairement au système de cours traditionnel. Nous développerons ainsi à travers ce documents les différentes charges fonctionnelles de notre produit. -3-
2 SPECIFICATIONS GENERALES 2.1 Présentation et Environnement du logiciel Syllabus est une plate-forme de cours disponible sur un site internet en ligne. Le but est de permettre à quiconque le souhaite de suivre des cours, de participer à des examens ou réaliser des exercices sans avoir à se déplacer. Cette plate-forme a aussi la particularité d'envoyer par e-mail les notes obtenues aux examens directement aux étudiants. En ce qui concerne l'architecture, la plate-forme est réalisée à l'aide d'un Servlet. Elle communique avec une base de données sur laquelle seront stockées les informations concernant les étudiants, les professeurs,les cours ainsi que les différents rendus et corrections d'exercices et examens. Ainsi, tous ces éléments fonctionnent sur un seul et unique serveur que notre équipe a mis en place. 2.2 Déploiement de l'application Illustration 1: Diagramme de Déploiement -4-
2.3 Le système 2.3.1 Performances Le système est conçu de façon à ce que tout se fasse de manière rapide. Tous les formats, les outils et langages utilisés ont été choisis afin que tout soit parfaitement optimisé. 2.3.2 Installation Le produit final ne nécessite aucune installation. Il s'agit comme dit précédemment d'un site internet en ligne. Néanmoins pour l'utiliser une authentification préalable est obligatoire. 2.3.3 Evolutions Dans un premier temps l'application sera capable d'utiliser des fichiers, représentants des exercices et, ayants étés exportés depuis une autre application utilisant le format commun défini avec les autres équipes de développeurs. Il est envisageable, à l'avenir de pouvoir définir un nouveau format permettant l'échange de cours. 2.3.4 Les outils Tout d'abord la base de données du système est réalisée en PostgreSql avec l'aide de PgAdminIII. Ensuite, le programme principal permettant le développement des fonctionnalités et modules est implémenté en Java avec NetBeans et Glassfish. Enfin l'interface utilisateur est réalisée en HTML. Afin que l'implantation de notre logiciel soit menée à bien notre équipe a décidé d'utiliser Gitlab dans le but d'évoluer dans le développement de manière efficace et de communiquer facilement. Nous avons aussi réussi à obtenir un serveur pour notre base de donnée à l'université, mais à cause des différents systèmes de sécurité mis en place, cette base n'est pas utilisable à l'extérieur de l'université et celle-ci a donc été abandonnée. Il sera donc nécessaire, afin d'utiliser l'application d'y renseigner des identifiants d'accès vers une base de données compatible avec notre configuration. -5-
3 SPECIFICATIONS FONCTIONNELLES 3.1 Définition des acteurs La plate-forme met en relation deux acteurs principaux : les professeurs ainsi que les étudiants. Les professeurs ont un rôle supérieur à celui des étudiants puisque ce sont eux qui créent les cours, les examens et les exercices sur lesquelles les étudiants travaillent. Vous pouvez donc voir ce que peuvent faire chacun des acteurs lorsqu'ils sont sur le site. Illustration 2: Relation des acteurs avec le système -6-
3.2 Diagrammes de cas d'utilisation Voici les différents cas d'utilisation du logiciel : Illustration 3: Use Case Devoir Etudiant Ici, on peut voir les différentes actions que peut effectuer un élève au moment de rendre son devoir ainsi que les relations entre les différents actions nécessaires à leurs réalisations. -7-
Illustration 4: Use Case Etudiant Ici, on peut voir le cheminement des actions possibles lorsqu'un étudiant se connecte sur la plate-forme. Ici, lorsque l'on met l'action «suivre un cours» signifie en fait «s'inscrire à un cours». -8-
Illustration 5: Use Case Ajout Exercice Le diagramme précédent décrit les différentes actions possibles d'un professeur dans le cadre d'ajout d'exercices sur le site. Nous précisons ce cas à part, car il est un peu plus compliqué et présente beaucoup de possibilités. -9-
Illustration 6: Use Case Professeur Global Ce diagramme décrit les actions possibles du professeur lorsqu'il est connecté sur le site. Comme dit précédemment, nous avons détaillé la démarche de création d'exercices, car celle-ci est un peu plus compliquée qu'une simple action comme le sont les autres. - 10 -
3.3 Diagrammes de séquence Notre équipe a réalisé un certain nombre de diagrammes de séquences que vous pouvez découvrir ci-dessous : Tout d'abord, voici le diagramme qui présente la connexion d'une personne sur la plate-forme. Illustration 7: Diagramme de séquence - Connexion Lorsqu'une personne demande à se connecter, vous constatez que notre système va vérifier l'existence de cette personne. Voici le diagramme associé à cette recherche : - 11 -
Illustration 8: Diagramme de séquence - Recherche membre Bien évidemment si une personne n'est pas inscrite sur Syllabus elle peut procéder à une inscription : - 12 -
Illustration 9: Diagramme de séquence - Inscription Voilà maintenant tous les diagrammes concernant le professeur. Tout d'abord le diagramme de création de page d'exercices : - 13 -
Illustration 10: Diagramme de séquence - Création d'une page - 14 -
Lorsque l'on crée une page, la nécessité de créer des exercices en découle. Le diagramme suivant illustre donc la création d'un exercice quelconque : Illustration 11: Diagramme de séquence - Création exercice - 15 -
Enfin les diagrammes respectifs de création de QCM, de QRF, de programme, et enfin de question libres se trouvent ci-dessous : Illustration 12: Diagramme de séquence - Création QCM Illustration 13: Diagramme de séquence - Création QRF - 16 -
Illustration 14: Diagramme de séquence - Création Programme Illustration 15: Diagramme de séquence - Création Question Libre - 17 -
Maintenant, les diagrammes concernant les étudiants. Ce diagramme décrit le déroulement des actions effectuées entre le système, la base de données et l'étudiant lorsque ce dernier veut travailler sur un devoir. - 18 -
Ce tout dernier diagramme explique en détails ce qui se passe lorsqu'un étudiant travaille sur un devoir en particulier. - 19 -
3.4 Types de données abstraits Lors de la modélisation de notre logiciel nous sommes passés par une phase de mise en place de types de données abstraits pour les modules de création d'exercices et de corrections. Voici donc ce que nous avons créé : /*Les types de choix possibles pour les choix d'un QCM*/ Domaine: type_choix Constante: bon_choix, mauvais_choix: type_choix Opération de test: est_bon_choix: type_choix -> bool est_mauvais_choix: type_choix -> bool /*Les différents choix possibles dans un QCM*/ Domaine: choix Opération de construction: cons_reponse:{x:entier 0 <= x <= 20, t: type_choix} -> choix Opération d'accès : nbpoints: {x:choix} -> {x:entier 0 <= x <= 20} type: choix -> type_choix /*Liste de choix multiples*/ Domaine: liste_choix_multiple Constante: liste_vide : liste_choix_multiple Opération de construction: cons_liste_choix_multiple: choix X liste_choix_multiple Opération de test: est_vide:liste_choix_multiple -> bool Opération d'accès: head:{x:liste_choix_multiple not(est_vide(x)} -> choix tail:{x:liste_choix_multiple not(est_vide(x)} -> liste_choix_multiple - 20 -
/*Définition d'une question à choix multiple*/ Domaine: question_a_choix_multiple Opération de construction: cons_question: {q:string, l:liste_choix_multiple} -> question_a_choix_multiple Opération d'accès: question: question_a_choix_multiple -> String liste_reponses: question_a_choix_multiple -> liste_choix_multiple /*Entrée d'un programme*/ Domaine: entree Opération de construction: cons_entree: String -> entree Opération d'accès: format: entree->string /*Sortie d'un programme*/ Domaine: sortie Opération de construction: cons_sortie: String -> entree Opération d'accès: format: sortie->string /*Définition question*/ Domaine: question Constante: sujet_qcm_vide: question Opération de construction: cons_sujet_qcm: {x:question_a_choix_multiple, liste:question est_sujet_qcm(liste)} -> question cons_sujet_qrf: String -> question cons_sujet_programme: String X entree X sortie -> question cons_sujet_question_libre: String -> question Opération de test: - 21 -
est_sujet_qcm_vide: {liste: question est_sujet_qcm(liste)} -> bool est_sujet_qcm: question -> bool est_sujet_qrf: question -> bool est_sujet_programme: question -> bool est_sujet_question_libre: question -> bool Opération d'accès: head:{x:question not(est_sujet_qcm_vide(x)) est_sujet_qcm(x)} -> question_a_choix_multiple tail:{x:question not(est_sujet_qcm_vide(x)) est_sujet_qcm(x)} -> question format_qrf: {x:question est_sujet_qrf(x)} -> String sujet_programme: {x:question est_sujet_programme(x)} -> String entree_makefile: {x:question est_sujet_programme(x)} -> entree sortie_makefile: {x:question est_sujet_programe(x)} -> sortie sujet_question_libre: {x:question est_sujet_question_libre(x)} -> String /*Réponse aux questions*/ Domaine: reponse Constante: reponse_qcm_vide: reponse Opération de construction: cons_reponse_qcm: {x:choix est_bon_choix(type_choix(x)), liste:reponse est_reponse_qcm(liste)} -> reponse cons_reponse_qrf: String -> reponse cons_reponse_programme: entree X sortie -> reponse cons_reponse_libre: String -> reponse Opération de test: est_reponse_qcm_vide: {liste: reponse est_reponse_qcm(liste)} -> bool est_reponse_qcm: question -> bool est_reponse_qrf : question -> bool est_reponse_programme: question -> bool est_reponse_libre: question -> bool Opération d'accès: head:{x:reponse not(est_vide(x) est_reponse_qcm(x)} -> choix tail:{x:reponse not(est_vide(x) est_reponse_qcm(x)} -> reponse format_reponse: {x: reponse est_reponse_qrf(x)} -> String entree_programme: {x: reponse est_reponse_programme(x)}-> entree sortie_programme: {x: reponse est_reponse_programme(x)}-> sortie texte_reponse: {x: reponse est_reponse_libre(x)} -> String - 22 -
/*Définition d'un exercice*/ Domaine: exercice Operation de construction: cons_qcm:{x:entier 0 <= x <= 20, q:question est_sujet_qcm(q), r: reponse est_reponse_qcm(r)} -> exercice cons_qrf:{x:entier 0 <= x <= 20, q:question est_sujet_qrf(q), r: reponse est_reponse_qrf(r)} -> exercice cons_programme:{x:entier 0 <= x <= 20, q:question est_sujet_programme(q), r: reponse est_reponse_programme(r)} -> exercice cons_question_libre:{x:entier 0 <= x <= 20, q:question est_sujet_question_libre(q), r: reponse est_reponse_question_libre(r)} -> exercice Operation de test: est_qcm: exercice -> bool est_qrf: exercice -> bool est_programme: exercice -> bool est_question_libre: exercice -> bool Opération d'accès: bareme_qcm: {x: exercice est_qcm(x)} -> entier bareme_qrf: {x: exercice est_qrf(x)} -> entier bareme_programme: {x: exercice est_programme(x)} -> entier bareme_question_libre: {x: exercice est_question_libre(x)} -> entier sujet_qcm: {x: exercice est_qcm(x)} -> question sujet_qrf: {x: exercice est_qrf(x)} -> question sujet_programme: {x: exercice est_programme(x)} -> question sujet_question_libre: {x: exercice est_question_libre(x)} -> question reponse_qcm: {x: exercice est_qcm(x)} -> reponse reponse_qrf: {x: exercice est_qrf(x)} -> reponse reponse_programme: {x: exercice est_programme(x)} -> reponse reponse_libre: {x: exercice est_question_libre(x)} -> reponse /*Définition d'une personne*/ Domaine: personne Opération de construction: cons_etudiant:{n: String, p:string, e:string m:string} -> personne cons_professeur:{n: String, p:string, e:string m:string} -> personne Opération de test: est_etudiant: personne -> bool est_professeur: personne -> bool Opération d'accès: nom_etudiant: {x:personne est_etudiant(x)} -> String - 23 -
prenom_etudiant: {x:personne est_etudiant(x)} -> String email_etudiant: {x:personne est_etudiant(x)} -> String motdepasse_etudiant: {x:personne est_etudiant(x)} -> String nom_professeur: {x:personne est_professeur(x)} -> String prenom_professeur: {x:personne est_professeur(x)} -> String email_professeur: {x:personne est_professeur(x)} -> String motdepasse_professeur: {x:personne est_professeur(x)} -> String /*Définition de la réponse d'un étudiant*/ Domaine: reponse_etudiant Opération de construction: cons_reponse_etudiant:{ex: exercice, p:personne est_etudiant(p)} -> reponse_etudiant Opération d'accès: exo: reponse_etudiant -> exercice etudiant: reponse_etudiant -> personne /*Définition d'une correction*/ Domaine: correction Opération de construction: cons_correction_auto:{r: reponse_etudiant not(est_question_libre(exo_reponse_etudiant(r))} -> correction cons_correction_etudiant:{r: reponse_etudiant, c: personne est_etudiant(p)} -> correction cons_correction_professeur:{r: reponse_etudiant, c: personne est_professeur(p)} -> correction Opération de test: est_correction_auto: correction -> bool est_correction_etudiant: correction -> bool est_correction_professeur: correction -> bool Opération d'accès: reponse_etudiant_correction_auto:{c:correction est_correction_auto(c)} -> reponse reponse_etudiant_correction_auto:{c:correction est_correction_etudiant(c)} -> reponse reponse_etudiant_correction_auto:{c:correction est_correction_professeur(c)} -> reponse correcteur_etudiant:{c:correction est_correction_etudiant(c)} -> personne correcteur_professeur:{c:correction est_correction_professeur(c)} -> personne - 24 -
3.1 3.5 Structure du logiciel 3.4.1 Diagramme de Paquetages Illustration 16: Diagramme de Package - 25 -
3.4.2 Diagrammes de Classes Package Administration Illustration 17: Package Administration Package Enseignement : Illustration 18: Package Enseignement - 26 -
Package Evaluation : Illustration 19: Package Evaluation Illustration 20: Package Evalution.Exercice Illustration 21: Package Evaluation.Page - 27 -
Package Reponse : Illustration 22: Package Reponse Package BasedeDonnees : Illustration 23: Package BaseDeDonnees Package Web : Illustration 24: Package Web.Controllers - 28 -
Package Web.Core : Illustration 25: Package Web.Core - 29 -
3.4.3 Modules Syllabus est un système méticuleusement découpé autour de différents modules. Voici donc une liste détaillée de ceux-ci organisée suivant les packages dans lesquels ils sont développés. Pour chaque module, une fiche technique sera fournie par la suite. Package Administration : Les modules principaux : - Inscription - Connexion - Création de cours (avec gestion des intervenants et des responsables) - Inscription à un cours - Gestion des cours suivis par un étudiant - Gestion des cours enseignés par un professeur Les modules optionnels : - Désinscription à un cours - Suppression d'un cours - Désinscription du site Package Enseignement : Les modules principaux : - Ajouter un cours - Récupérer tous les cours - Récupérer un examen lié à un cours - Récupérer un cours à partir de son id - Ajouter une partie - Récupérer une partie à partir de son id - Récupérer toutes les parties liées à un cours - Ajouter un chapitre - Récupérer tous les chapitres liés à une partie - Suppression - Récupérer un chapitre à partir de son id Package Rendu : Les modules principaux : - Récupération des réponses de l'interface web - Remplissage de structures de données - Envoi de ces données au correcteur - Affichage des données de la correction Package Evaluation : Les modules principaux : - 30 -
- Sauvegarde du choix d'un QCM - Sauvegarde d'un Programme - Sauvegarde d'un QCM - Sauvegarde d'un QRF - Sauvegarde d'une question Libre - Sauvegarde d'un mémoire - Sauvegarde d'un projet Package Réponse : Les modules principaux : - Réception et renvoi des réponses libres Package Web : Les Modules Principaux - Accès aux pages - Connexion / Déconnexion 3.5 Interfaces Afin de séparer les classes modèles du fonctionnement de l'application ainsi que des accès à la base de données, il a été développé des classes façades permettant d'accéder à la base de données afin d'y récupérer des données contextuelles à des classes modèles. De cette manière une classe telle que celle représentant les étudiants ne possédera pas directement les fonctions d'accès à la base de données et les modules extérieurs pourront accéder à ses informations par un mécanisme homogène dans tout les packages. Le nom de ces classes est préfixé du mot «Model». Donc, par exemple, pour récupérer un étudiant en possédant son id, il faut appeler la fonction «recuperer(int id)» de la classe ModelEtudiant - 31 -