Master M1 Informatique: Analyse et Conception des Logiciels

Transcription

Master M1 Informatique: Analyse et Conception des Logiciels
Master M1 Informatique: Analyse et Conception des Logiciels
Pascal Molli
Juin 2008
Les documents de cours sont autorisés
1
Exercice
en 5 lignes maximums répondez aux questions suivantes :
1. Qu’est ce qu’un logiciel ?
2. Pourquoi le génie logiciel est important ?
3. Quels sont les 4 propriétés d’un *bon* logiciel ?
4. Comment sont répartis les coûts de développement d’un logiciel ?
5. UML est elle un méthode de développement ? Justifiez votre réponse.
2
Exercice
1. Quelle est la différence entre une relation d’agrégation et une relation de composition ?
Donnez un exemple.
2. Que veut dire MDA ? Quelle est la différence entre “round-trip engineering” et MDA ?
3. Pourquoi décomposer un logiciel en composants ?
4. Que signifie couplage faible et cohésion ?
5. Donnez un exemple de 2 composants ayant un couplage fort. Faites le diagramme de
composants associé.
6. Donnez un exemple d’un composant ayant des problèmes de cohésion.
3
Exercice
Voici un code permettant de gérer une liste des scores d’un jeu quelconque. Je veux pouvoir
visualiser ce tableau des scores dans une JList.
1. Faites les modifications nécessaires à la classe HS.
2. Faites le diagramme de classe final de l’application. Les classes graphiques et différentes
interfaces requises doivent apparaı̂tre.
3. Faites le diagramme de séquence montrant l’instanciation des différentes classes de l’application.
1
4. Faites le diagramme de séquence correspondant à l’ajout d’une entrée dans le tableaux
des scores et son ré-affichage dans la JList.
5. Quels sont les patterns utilisés dans cet exemple ?
6. Donnez pour chacun des patterns la correspondances entre les classes de votre application et les classes du pattern
c l a s s Entry {
private S t r i n g name ;
private int s c o r e ;
Entry ( S t r i n g name , int s c o r e ) {
t h i s . name=name ;
t h i s . s c o r e=s c o r e ;
}
public S t r i n g t o S t r i n g ( ) {
return ”name : ”+name+” , s c o r e : ”+s c o r e ;
}
}
import j a v a . u t i l . Vector ;
public c l a s s HS {
private Vector<Entry> e n t r i e s=new Vector<Entry > ( ) ;
void add ( Entry e ) {
e n t r i e s . addElement ( e ) ;
}
public S t r i n g t o S t r i n g ( ) {
S t r i n g B u f f e r sb=new S t r i n g B u f f e r ( ) ;
f o r ( Entry e : e n t r i e s ) {
sb . append ( e . t o S t r i n g ( ) ) ;
}
return sb . t o S t r i n g ( ) ;
}
}
public c l a s s Main {
public s t a t i c void main ( S t r i n g [ ] a r g s ) {
HS hs=new HS ( ) ;
hs . add (new Entry ( ”momo” , 1 0 0 ) ) ;
System . out . p r i n t l n ( hs ) ;
}
}
Rappel des classes associées à la classe JList :
Class JList
J L i s t ( L i s t M o d e l dataModel )
I n t e r f a c e ListModel
void
addListDataListener ( ListDataListener l )
Object getElementAt ( int i n d e x )
int
getSize ()
void
removeListDataListener ( ListDataListener l )
2
Interface ListDataListener
void
contentsChanged ( ListDataEvent e )
void
i n t e r v a l A d d e d ( ListDataEvent e )
void
i nt e rv a lR e mo v ed ( ListDataEvent e )
C l a s s ListDataEvent
ListDataEvent ( Object s o u r c e , int type , int index0 , int i n d e x 1 )
s o u r c e − L ’ o b j e t s o u r c e de l ’ événement
type − Un e n t i e r r e p r é s e n t a n t CONTENTS CHANGED,
INTERVAL ADDED ou INTERVAL REMOVED
i n d e x 0 − début de l ’ i n t e r v a l l e
i n d e x 1 − f i n de l ’ i n t e r v a l l e
4
Exercice
1. Écrivez le code java correspondant aux diagrammes ci-dessous.
5
Exercice
La journalisation 1 consiste à garder les traces sur un support sûr des évènements survenus
dans un système ou dans une application. Un ou plusieurs fichiers de log au format prédéfini
sont générés en cours d’exécution et conservent des messages informant sur la date et l’heure de
l’événement, la nature de l’événement et sa gravité par un code ou une description sémantique,
éventuellement d’autres informations : utilisateur, classe, etc
Les journaux peuvent utilement être réutilisés par :
– un administrateur afin de produire des statistiques sur l’utilisation d’un système (par
exemple les logs du serveur web Apache)
– un développeur afin de détecter des défaillances et de corriger les bugs qui en sont
responsables, il est plus facile de repérer la source d’une défaillance si le journal est
dense en informations (fonctions appelées, valeurs des paramètres passés...)
– un développeur pour éviter de polluer son code avec des println()
1
source http://cyberzoide.developpez.com/java/logging/
3
– un utilisateur peut utiliser un journal afin de revenir sur un crash et refaire les opérations
qui n’auraient été perdues (transactions)
Le code ci-dessous 2 implante un système de journalisation (primitif) à l’aide d’un pattern
(le pattern mystère ;))
import j a v a . i o . Pr int Stre am ;
public c l a s s D e f a u l t L o g g e r implements Logger {
private Pr intS tre am ps ;
public D e f a u l t L o g g e r ( Pri ntSt rea m ps ) {
s e t P r i n t S t r e a m ( ps ) ;
}
public void l o g ( j a v a . l a n g . S t r i n g msg ) {
g e t P r i n t S t r e a m ( ) . p r i n t l n ( msg ) ;
}
private void s e t P r i n t S t r e a m ( Pri ntSt rea m v a l u e ) {
ps = v a l u e ;
}
private Pr intS tre am g e t P r i n t S t r e a m ( ) {
i f ( ps==null ) {
return System . out ;
}
return ps ;
}
}
public c l a s s L o g g e r C o n s o l e extends L o g g e r F i l t e r {
L o g g e r C o n s o l e ( Logger l ) {
super ( l ) ;
}
public void l o g ( S t r i n g msg ) {
System . e r r . append ( msg ) ;
super . l o g ( msg ) ;
}
}
public c l a s s L o g g e r F i l t e r implements Logger {
private Logger l ;
public L o g g e r F i l t e r ( Logger l ) {
setLogger ( l ) ;
}
public void l o g ( S t r i n g msg ) {
l . l o g ( msg ) ;
}
private void s e t L o g g e r ( Logger l ) {
this . l = l ;
}
2
source http://smeric.developpez.com/java/uml/decorateur/
4
}
public c l a s s LoggerHorodate extends L o g g e r F i l t e r {
public LoggerHorodate ( Logger l ) {
super ( l ) ;
}
public void l o g ( S t r i n g msg ) {
System . out . p r i n t ( System . c u r r e n t T i m e M i l l i s ( ) ) ;
super . l o g ( msg ) ;
}
}
public i n t e r f a c e Logger {
void l o g ( S t r i n g msg ) ;
}
import j a v a x . swing . JFrame ;
import j a v a x . swing . JTextArea ;
public c l a s s LoggerSwing extends L o g g e r F i l t e r {
private JTextArea j t a = new JTextArea ( ) ;
public LoggerSwing ( Logger l ) {
super ( l ) ;
JFrame f = new JFrame ( ” Logger ” ) ;
f . getContentPane ( ) . add ( j t a ) ;
f . pack ( ) ;
f . s e t V i s i b l e ( true ) ;
}
public void l o g ( S t r i n g msg ) {
j t a . append ( msg ) ;
super . l o g ( msg ) ;
}
}
1. Faites le diagramme de classe du code ci-dessous.
2. Quel est le pattern implanté ?
3. Écrivez pour chaque classe ci-dessous à quelle classe du pattern générique elle correspond.
4. Écrivez un diagramme de séquence montrant le comportement dynamique du pattern.
Re-concevez le système de journalisation en utilisant cette fois un pattern “fabrication”.
– Refaites le diagramme de classes adéquat.
– Pour un système de journalisation quelle est la meilleure de 2 conceptions ?
5

Documents pareils