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 class 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 ) { this. name=name ; this. 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 java. u t i l. Vector ; public class 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 ( ) ; for ( 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 class Main { public static void main ( S t r i n g [ ] args ) { 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 J L i s t J L i s t ( ListModel datamodel ) I n t e r f a c e ListModel void addlistdatalistener ( L i s t D a t a L i s t e n e r l ) Object getelementat ( int index ) int g e t S i z e ( ) void removelistdatalistener ( L i s t D a t a L i s t e n e r l ) 2
I n t e r f a c e L i s t D a t a L i s t e n e r void contentschanged ( ListDataEvent e ) void intervaladded ( ListDataEvent e ) void intervalremoved ( ListDataEvent e ) Class ListDataEvent ListDataEvent ( Object source, int type, int index0, int index1 ) source L o b j e t source 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 index0 début de l i n t e r v a l l e index1 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 java. i o. PrintStream ; public class DefaultLogger implements Logger { private PrintStream ps ; public DefaultLogger ( PrintStream ps ) { setprintstream ( ps ) ; public void l o g ( java. lang. S t r i n g msg) { getprintstream ( ). p r i n t l n (msg ) ; private void setprintstream ( PrintStream value ) { ps = value ; private PrintStream getprintstream ( ) { i f ( ps==null ) { return System. out ; return ps ; public class LoggerConsole extends L o g g e r F i l t e r { LoggerConsole ( Logger l ) { System. e r r. append (msg ) ; public class 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 ) ; l. l o g (msg ) ; private void setlogger ( Logger l ) { this. l = l ; 2 source http://smeric.developpez.com/java/uml/decorateur/ 4
public class LoggerHorodate extends L o g g e r F i l t e r { public LoggerHorodate ( Logger l ) { 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 ( ) ) ; public interface Logger { void l o g ( S t r i n g msg ) ; import javax. swing. JFrame ; import javax. swing. JTextArea ; public class 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 ) { 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 ) ; j t a. append (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