IFT785 Approches Orientées Objets
FINAL Hiver 2006
Début : Vendredi 21 avril 2006 à 12h00 midi Professeur : Sylvain
GIROUX
Remise : Lundi 24 avril 2006 à 12h00 midi
Note :…/100 points
Remarques :
Les énoncés sont flous à dessein. Il y aura plusieurs alternatives possibles. Vous aurez
donc plusieurs décisions de design à prendre. N’hésitez pas à les prendre.
L’examen est secret. Vous ne devez pas en dévoiler le contenu avant la fin de la seconde
session d’examen afin de s’assurer que le processus reste équitable pour tous.
L’examen est individuel.
Vous pouvez en tout temps demander des clarifications sur les questions, par contre
aucune explication ne sera donnée sur la matière en tant que telle.
Vous aurez besoin de programmer en Java. Pour ce faire, vous pouvez utiliser Eclipse ou
tout autre environnement de développement.
Vous devez utiliser JUnit pour écrire des tests. Je m’attends à ce que des tests (pas
nécessairement exhaustifs) soient écrit pour toutes les questions.
Vous devez remettre vos réponses par e-mail avant 12h00 (midi) le 24 avril.
Vous devrez remettre par e-mail Sylvain.Giroux@USherbrooke.ca
1. un fichier jar contenant les programmes que vous aurez développés
2. un document texte contenant
a. vos réponses aux questions théoriques
b. pour la partie pratique, les noms des patrons de conceptions que vous avez
utilisés.
PARTIE THEORIQUE (30 points)
ObjVlisp : Métaclasses, classes et instances terminales
Question 1
Expliquer l’affirmation suivante :
En ObjVlisp, la différence entre instance terminale, classe et méta-classes en est une de
comportement et non de nature.
Utiliser des schémas et un exemple pour appuyer votre argumentation.
Question 2
a) Ecrire les classes et méta-classes nécessaires pour permettre à une instance ou une classe
d’avoir des variables indexées. Une variable indexée est une variable qui est accédée à
l’aide d’un indice. Le nombre de variables indexée sera fixé à la création de l’instance.
Les indices seront numérotés à partir de 1.
b) Implémenter la classe Fifa dont les instances possèdent 11 variables indexées pour
représenter les 11 joueurs sur le terrain. La classe Fifa possède elle-même 17 variables
indexées qui représentent les 17 règles. Ainsi nous pourrons écrire
(send ??? ‘new :name ‘EquipeDeFootball:supers ’( ??? ))
(send Fifa ‘?← 1 ‘(Loi 1 : Terrain de jeu….))
(send Fifa ‘?← 2 ‘(Loi 2 : Ballon ….))
(setq Italie (send EquipeDeFootball ‘new))
(send Italie ‘? 10)
Si vous ne connaissez pas Lisp, vous pouvez utiliser du pseudo-code et/ou des figures pour
décrire votre réponse.
Rappels :
l’accès à la valeur d’une variable d’instance se fait via la méthode « ? » définie dans la
classe Object.
l’accès à la valeur d’une variable d’instance se fait via la méthode « ? » définie dans la
classe Object. Il faudra redéfinir cette méthode.
En ObjVlisp, l’héritage multiple est permis.
PARTIE PRATIQUE (70 points)
Étude de cas : Du multimédia partagé…
Vous avez été engagé par XULIN pour faire un système d’échange P2P (peer-to-peer) de
contenu multimédia. Ce système comporte les éléments suivants :
Une place centrale Agora où les agents se connectent
Pour chaque nœud participant, un agent MultimediaP2P qui sert de point d’entrée au
nœud. Cet agent gère trois sous-agents :
o AgentDeRecherche
o AgentPlayerMultimedia
o AgentRepertoire
AGORA
MultimediaP2P
AgentDeRecherche
AgentRépertoire
AgentPlayerMultimedia
MultimediaP2P
AgentDeRecherche
AgentRépertoire
AgentPlayerMultimedia
Joindre, quitter,
trouver les pairs
Joindre, quitter,
trouver les pairs
Rechercher
Echanger
Première étape : Ecouter du multimédia
Question 1 : Refactorisation et poly morphisme
Comme première étape, vous devez construire un agent capable d’utiliser le « player » approprié
(vidéo, MP3, WAV, etc.) pour la plateforme il s’exécute (Apple, Windows, etc.). Cet agent
est capable de contrôler le nombre d’utilisation du contenu. Les contenus multimédias sont soit
vendus ou gratuits (nombre illimité d’utilisation), soit loué pour un certain nombre d’utilisation.
Une utilisation correspond soit à une écoute complète (i.e. la fonction « stop » du lecteur a été
invoquée), soit à une écoute incomplète non reprise, i.e. l’utilisateur a appuyé sur la fonction
« pause » et n’a jamais repris l’écoute). Ainsi la séquence PLAY, PAUSE, RESUME, PAUSE
correspond à une utilisation.
Refactoriser le programme suivant de manière à faire disparaître, autant que faire se peut, les
conditionnelles qu’il contient en les remplaçant par du polymorphisme.
Avant de commencer la refactorisation, écrire au moins 10 tests unitaires pour s’assurer que le
comportement du programme sera préservé. Il se peut que à la suite des autres questions, vous
ayez à modifier et adapter vos tests.
public class AgentPlayerMultiMedia {
final static private int VIDEO = 0;
final static private int MUSIQUE = 1;
final static private int CREATED = 0;
final static private int STARTED = 1;
final static private int PAUSED = 2;
final static private int RESUMED = 3;
final static private int STOPPED = 4;
private int etat_; private int type_;
private int maximum_; private int joue_;
private boolean location_; private String titre_;
private Object contents_;
private MediaPlayer player_;
public AgentPlayerMultiMedia( boolean location, int nbFois,
int type, String titre,
Object contents) {
location_ = location; maximum_ = nbFois;
titre_ = titre; contents_ = contents;
joue_ = 0; etat_ = CREATED;
}
public void start() {
if (etat_ != CREATED) { return; // on commence à jouer le contenu
}
if (location_ && joue_ < maximum_) { return;
}
if (type_ == MUSIQUE) { player_ = new iTunes();
player_.play(this);
etat_ = STARTED;
}
if (type_ == VIDEO) { player_ = new QuickTime();
player_.play(this);
etat_ = STARTED;
}
}
public void pause() {
//le contenu doit jouer pour que cette opération soit valide
if (etat_ == PAUSED) { return;
}
if (etat_ == STOPPED_) { return;
}
if (type_ == MUSIQUE) { player_.pause(this);
if (location_) { joue_ = joue_ + 1; }
etat_ = PAUSED;
}
if (type_ == VIDEO) { player_.pause(this);
if (location_) { joue_ = joue_ + 1; }
etat_ = PAUSED;
}
}
public void resume() {
// cette opération n’est valide qu’après une pause
if (etat_ != PAUSED) { return;
}
if (location_) { { joue_ = joue_ - 1; }
}
if (type_ == MUSIQUE) { player_.play(this);
etat_ = RESUMED;
}
if (type_ == VIDEO) { player_.play(this);
}
}
public void stop() {
//le contenu doit jouer pour que cette opération soit valide
if (etat_ == PAUSED) { return;
}
if (etat_ == STOPPED) { return;
}
if (type_ == MUSIQUE) { player_.close(this);
if (location_) { joue_ = joue_ + 1; }
}
if (type_ == VIDEO) { player_.close(this);
if (location_) { joue_ = joue_ + 1; }
}
}
}
1 / 8 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !