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