L'examen est composé de 3 exercices qui doivent être traités dans l'ordre proposé. Il faut au moins avoir essayé de faire l'exercice 1 (même s'il n'est pas indispensable d'avoir répondu à toutes les questions pour poursuivre) avant de passer à l'exercice 2, etc
Rappel : vous devez configurer le workspace d'Eclipse (File > Switch WorkSpace) pour qu'il corresponde au répertoire EXAM présent dans le home de votre session de TP noté.
Vérifiez que tous vos fichiers sont bien dans le répertoire EXAM. Tout ce qui n'est pas dans ce répertoire est perdu quand vous vous déconnectez (ou en cas de panne).
Vous avez le droit de consulter les transparents du cours.
Le but de ce sujet est de réaliser l'architecture d'un site d'achat de films et de jeux vidéos (version simpliste et naïve).
Le sujet est composé comme suit:
D'un point de vue fonctionnel, le code demandé est très simple. Vous allez être évalué sur vos choix dans l'architecture du code: organisation des classes, choix des visibilités pour les champs et les méthodes, absences de duplication de code, respect des principes SOLID, choix des design-patterns...
Toutes vos classes pour cet exercice doivent être dans le package fr.uge.poo.amanet.items
.
Le site AmaNet
propose à la vente des DVD, Blu-Ray et des jeux vidéos.
Tous ces articles seront manipulés par une interface Item
qui contriendra (au moins) les deux méthodes suivantes:
String getShortDescription()
qui renvoie le titre et l'année au format suivant Avatar (2009)String getLongDescription()
qui renvoie une description détaillée (le format est donné ci-après).DVD : Avatar (2009) Audio : FRENCH, ENGLISH Zone : 1 BLU-RAY : Avatar (2009) Audio : FRENCH, ENGLISH, SPANISH 3D : true GAME : Doom 2020 (2020) Plateform : PC
Ecrivez une hiérarchie de classes permettant de représenter les différents objets vendus. Vous serez en particulier évalué sur l'absence de duplication de code.
Chez AmaNet
, on fait dans la quantité pas dans la qualité. Le prix d'un article est calculé comme suit:
Modifier votre hiérarchie pour avoir accès au prix des articles.
Sur chaque article, on veut pouvoir définir des restrictions sur les clients qui peuvent l'acheter.
Par exemple, on veut pouvoir exprimer que le jeu Doom ne peut être acheté que par des clients de plus de 18 ans. Ou encore, on veut pouvoir dire que le film Avatar ne peut pas être acheté par les clients résidant en France.
Toutes contraintes sur les clients sont fixées à la création de l'Item
. Les Item
offriront une méthode
boolean isAllowedForClient(Client client)
.
Faites évoluer vos classes pour pouvoir exprimer ces contraintes et toutes celles du même genre. Dans la classe Application
, codez les deux exemples ci-dessus. En commentaire dans votre classe donnez le nom du design-pattern implémenté.
Dans la classe Application
, on veut maintenant écrire 2 méthodes:
static List<Item> gamesAfter(int year,List<Item> list)
qui renvoie la liste des jeux vidéos de la liste list
sortis après year
;static int movies(List<Item> list)
qui renvoie le nombre de DVD et de Blu-Ray dans la liste list
. On prévoit qu'il y aura de nombreuses fonctions du même genre.
Faites évoluer votre code pour pouvoir réaliser ces méthodes et d'autres du même genre, tout en respectant le Open-Close principle.
Sauf mention explicite du contraire, vos classes pour cet exercice doivent être dans le package fr.uge.poo.amanet.client
.
Pour le site AmaNet
, on stockera les informations suivantes sur un client:
String
dont on ne vérifiera pas la validité.
Ces informations ne pourront pas être modifiées. Note: ce n'est pas très réaliste mais cela va simplifier le code que vous aurez à écrire.
Ecrire une classe Client
correspondant à ces caractéristiques. Dans la suite des exercices, il sera peut-être nécessaire d'ajouter des accesseurs. Pensez bien aux principes vus en cours.
Mettez en oeuvre un design-pattern permettant de rendre plus lisible la création d'un objet Client
. Donnez son nom en commentaire dans le code.
Dans le main d'une classe Application
se trouvant dans le package fr.uge.poo.amanet
, créez un client de votre choix et faites quelques tests.
Cette classe Application
va servir à montrer que vous savez utiliser le code qui vous écrivez. C'est aussi pour vous l'occasion de tester votre code. Vous pouvez mettre du code en commentaire mais n'effacez rien (pensez au correcteur!).
On veut maintenant pouvoir envoyer des messages aux clients. Pour cela, on dispose de la librairie Connect
qui permet d'envoyer des messages par mail, Twitter ou SMS. Vous pouvez télécharger la libraire ici.
Les contraintes sont les suivantes:
Client
doit permettre d'envoyer des messages au client avec une méthode void message(String msg)
;Mettez en place les messages pour les clients et décrivez en commentaire le design-pattern que vous avez utilisé. Pour les emails, le sujet du mail sera Nofication from AmaNet.
Avez vous géré le cas où l'on essaie de choisir la notification par SMS pour un client n'ayant pas de numéro de téléphone enregistré?
Dans le main de la classe Application
, donnez un exemple d'utilisation des notifications et du changement du type de notifications (SMS, Email,...).
Sauf mention explicite du contraire, vos classes pour cet exercice doivent être dans le package fr.uge.poo.amanet.inventory
.
Dans cet exercice, on modélise l'inventaire du site AmaNet
. La classe Inventory
maintient
pour chaque article en stock, le nombre de copies de cet article.
La classe Inventory
fournira (au moins) les méthodes suivantes:
add(Item item,int quantity)
qui ajoute la quantité quantity
de l'article item
au stock,boolean retrieve(Item item,Client client)
qui tente de prendre l'article item
du stock pour le client client
. Elle renvoie true
si le client client
peut acheter l'article item
et que cet article est en stock. Dans ce cas, elle retire une copie de item
du stock. Sinon, elle renvoie false
et ne modifie pas le stock.
Ecrivez la classe Inventory
.
En plus de la gestion de l'inventaire, on aimerait:
Inventory
,Connect
de l'exercice 1) lorsque la dernière copie d'un article est sortie du stock pour lancer une commande de ce produit.En commentaire dans votre code, expliquez quel(s) principe(s) SOLID ne serai(en)t pas respecté(s) si on ajoutait ces traitements dans la méthode retrieve
.
Implémentez une architecture logicielle qui permette d'implémenter ces traitements tout en respectant les principes SOLID. Bien entendu, vous devez aussi coder les 4 traitements demandés.
Dans la main
de la classe Application
, codez un exemple d'Inventory
et testez
les nouveaux traitements.