MI3/GL Cours de Génie Logiciel Programmation Orientée Objet
Transcription
MI3/GL Cours de Génie Logiciel Programmation Orientée Objet
Aperçu du cours Mise à niveau Java 5 MI3/GL Cours de Génie Logiciel Programmation Orientée Objet (Avancée) Daniel Le Berre CRIL-CNRS FRE 2499, Université d’Artois, Lens, FRANCE {leberre}@cril.univ-artois.fr 13 janvier 2005 MI3GL 2004/2005 1 Aperçu du cours Mise à niveau Java 5 Mise à niveau Java 5 Les types paramétrés (aka Generics) Autres extensions du langage Annotations MI3GL 2004/2005 2 Aperçu du cours Mise à niveau Java 5 Les types paramétrés en Java Dès l’apparition du langage, des propositions pour l’étendre avec des types paramétrés sont apparues : Origine Making the future safe for the past: Adding Genericity to the Java Programming Language Gilad Bracha, Martin Odersky, David Stoutamire, and Philip Wadler. OOPSLA 98, Vancouver, October 1998. Plébiscité dans Guy L. Steele, Jr., “Growing a Language”, Journal of Higher-Order and Symbolic Computation (Kluwer) 12, 3 (October 1999), 221–236. Disponible dans Java 5 depuis le 30 septembre 2004. 1 DOD = Department of Defense http://opensource.org/halloween/ 3 http://www.linux-france.org/article/these/magic-cauldron/ magic-cauldron-fr_monoblock.html 2 MI3GL 2004/2005 3 Aperçu du cours Mise à niveau Java 5 Implantations possibles des types paramétrés Spécialisation du code Crée automatiquement un nouveau fichier source à partir de la classe paramétrée et de l’argument. pro code efficace, permet de spécialiser une classe pour n’importe quoi (dont les types primitifs). cons la quantité de code source et d’exécutable peut vite devenir importante. Partage du code Utilise le même code pour toutes “spécialisation” de la classe à l’aide de techniques de généralisation de types et par des vérifications de type à la compilation. pro pas de multiplication du code cons approche limitée à des références sur des objets MI3GL 2004/2005 4 Aperçu du cours Mise à niveau Java 5 C++ vs Java vs C# C++ spécialisation de code avec possibilité de donner code spécifique à un type donné. Java partage du code I contrainte supplémentaire : compatibilité avec la JVM actuelle I conséquence : perte de l’information “générique” à l’exécution I simplifie la vie du programmeur sans gain de performance C# spécialisation pour les types valeurs et partage de code pour les références. MI3GL I En cassant la compatibilité avec le Common Language Runtime I Informations sur le type générique disponibles dans des metadata dans l’Intermediate Language I Gain en efficacité : le meilleur des deux mondes ? 2004/2005 5 Aperçu du cours Mise à niveau Java 5 Une collection en Java 5 p u b l i c i n t e r f a c e C o l l e c t i o n <E> e x t e n d s I t e r a b l e <E> { int size (); boolean isEmpty ( ) ; boolean contains ( Object o ) ; I t e r a t o r <E> i t e r a t o r ( ) ; Object [ ] toArray ( ) ; <T> T [ ] t o A r r a y (T [ ] a ) ; b o o l e a n add ( E o ) ; b o o l e a n remove ( O b j e c t o ) ; b o o l e a n c o n t a i n s A l l ( C o l l e c t i o n <?> c ) ; b o o l e a n a d d A l l ( C o l l e c t i o n <? e x t e n d s E> c ) ; b o o l e a n r e m o v e A l l ( C o l l e c t i o n <?> c ) ; b o o l e a n r e t a i n A l l ( C o l l e c t i o n <?> c ) ; void clear ( ) ; boolean equals ( Object o ) ; i n t hashCode ( ) ; } MI3GL 2004/2005 6 Aperçu du cours Mise à niveau Java 5 Un iterateur en Java 5 p u b l i c i n t e r f a c e I t e r a t o r <E> { boolean hasNext ( ) ; E next ( ) ; v o i d remove ( ) ; } MI3GL 2004/2005 7 Aperçu du cours Mise à niveau Java 5 Paramétrage de classe On souhaite déclarer un paramètre formel qui sera utilisé dans toute la classe. On peut considérer qu’un paramètre effectif remplace le paramètre formel à l’instanciation (même si ce n’est pas comme cela que ca se passe en Java). MI3GL I Utiliser la notation <T> juste après le nom de la classe I Utiliser T dans le reste du code I Convention : utiliser une lettre majuscule comme identifiant du paramètre I T sera remplacé par la classe donnée en paramètre à l’instanciation. 2004/2005 8 Aperçu du cours Mise à niveau Java 5 Paramétrage de méthode On souhaite limiter la généricité à une méthode particulière. MI3GL I Utiliser la notation <T> juste avant la signature de la méthode. I Utiliser T dans le reste du code de la méthode. I T sera inféré à partir du type des arguments de la méthode. 2004/2005 9 Aperçu du cours Mise à niveau Java 5 Déclarations génériques invariance <A> une classe A bivariance <?> joker, n’importe quelle classe covariance I I <A extends B> toute classe A qui spécialise B <? extends B> toute classe qui spécialise B contravariance <? super B> toute classe qui généralise B MI3GL 2004/2005 10 Aperçu du cours Mise à niveau Java 5 Définitions covariance Toutes les sous classes sont acceptables. contravariance Toutes les super classes sont acceptables. bivariance covariance ∪ contravariance : toutes les classes sont acceptables. invariance covariance ∩ contravariance : seule la classe déclarée est acceptable. La covariance a été introduites dans Java 5 afin de permettre l’utilisation de types paramétrés. MI3GL 2004/2005 11 Aperçu du cours Mise à niveau Java 5 Utilisation de ces notions // I n v a r i a n c e L i s t <I n t e g e r > l = new A r r a y L i s t <I n t e g e r > ( ) ; // p a s p o s s i b l e : i n v a r i a n c e p a r d e f a u t // L i s t <Number> l 1 = l // p o s s i b l e : c o v a r i a n c e L i s t <? e x t e n d s Number> l 1 = l ; // b i v a r i a n c e : p e r t e du t y p e L i s t <?> l 2 = new A r r a y L i s t <O b j e c t > ( ) ; // c o n t r a v a r i a n c e L i s t <? s u p e r Number> l 3 = new A r r a y L i s t <O b j e c t > ( ) ; f o r ( Number n : l 1 ) { // E r r e u r : l 2 p o u r r a i t e t r e une l i s t e de Double ! // l 2 . add ( n ) ; l 3 . add ( n ) ; // OK } MI3GL 2004/2005 12 Aperçu du cours Mise à niveau Java 5 Utilisation de la covariance et de la contravariance p u b l i c s t a t i c <T> v o i d copy ( C o l l e c t i o n <? e x t e n d s T> s r c , C o l l e c t i o n <? s u p e r T> d e s t ) { f o r (T t : s r c ) { d e s t . add ( t ) ; } } L i s t <I n t e g e r > l 1 = new A r r a y L i s t <I n t e g e r > ( ) ; f o r ( i n t i = 0 ; i < 1 0 ; i ++) { l 1 . add ( i ) ; } L i s t <Number> l 2 = new A r r a y L i s t <Number > ( ) ; copy ( l 1 , l 2 ) ; copy ( l 2 , l 1 ) ; // E r r e u r a l a c o m p i l a t i o n // on ne p e u t p a s m e t t r e d e s Number dan s une // l i s t e de I n t e g e r ! ! ! MI3GL 2004/2005 13 Aperçu du cours Mise à niveau Java 5 Les problèmes non résolus : les tableaux Il n’est pas possible d’initialiser un tableau de type paramétré ! // S e u l moyen d ’ i n i t i a l i s e r un t a b l e a u ” g e n e r i q u e ” T [ ] e l e m s = (T [ ] ) new O b j e c t [ 1 0 ] ; p u b l i c s t a t i c <T> T [ ] t e s t T a b l e a u ( i n t n , T pad ) { T [ ] t s = (T [ ] ) new O b j e c t [ n ] ; f o r ( i n t i = 0 ; i < n ; i ++) { t s [ i ] = pad ; } return ts ; } // C l a s s C a s t E x c e p t i o n : on a un t a b l e a u d ’ O b j e c t ! ! ! ! I n t e g e r [ ] r e s = t e s t T a b l e a u ( 1 2 , new I n t e g e r ( 4 5 ) ) ; out . p r i n t l n ( Arrays . a s L i s t ( r e s ) ) ; MI3GL 2004/2005 14 Aperçu du cours Mise à niveau Java 5 Type Erasure Permet “d’enlever” toute trace de “généricité” dans le bytecode. 1. Remplace chaque paramètre par Object (invariance, bivariance) ou par la borne fournie (covariance,contravariance). 2. Crée des “méthodes ponts” (bridge method) pour résoudre les problèmes de signature de méthode (paramètres). 3. La covariance ajoutée à Java 5 permet de résoudre le problème des types de retour MI3GL 2004/2005 15 Aperçu du cours Mise à niveau Java 5 Type Erasure c l a s s Toto i m p l e m e n t s Comparable<Toto > { i n t compareTo ( Toto t ) { // . . . } } // d e v i e n t c l a s s Toto i m p l e m e n t s Comparable { i n t compareTo ( Toto t ) { // . . . } // b r i d g e method i n t compareTo ( O b j e c t o ) { r e t u r n compareTo ( ( Toto ) o ) ; } } MI3GL 2004/2005 16 Aperçu du cours Mise à niveau Java 5 Type Erasure c l a s s M o n I t e r a t e u r i m p l e m e n t s I t e r a t o r <I n t e g e r > { p r i v a t e i n t n ; p r i v a t e f i n a l i n t c p t =0; MonIterateur ( int n ) { t h i s . n=n ; } p u b l i c boolean hasNext ( ) { r e t u r n cpt <n ; } // C o v a r i a n c e : // r e d e f i n i t O b j e c t n e x t ( ) dan s I t e r a t o r p u b l i c I n t e g e r next () { // a u t o b o x i n g : −=) r e t u r n c p t ++∗2+1; } p u b l i c v o i d remove ( O b j e c t o ) { } } MI3GL 2004/2005 17 Aperçu du cours Mise à niveau Java 5 La promesse d’une réduction du temps de codage MI3GL 2004/2005 18 Aperçu du cours Mise à niveau Java 5 Boucle for each I fonctionne avec les tableaux int [ ] t = {1 ,2 ,3 ,4 ,5}; for ( int i : t ) { System . o u t . p r i n t l n ( i ∗ 2 ) ; } I fonctionne avec tout objet réalisant Iterable p u b l i c i n t e r f a c e I t e r a b l e <E> { I t e r a t o r <E> i t e r a t o r ( ) ; } L i s t <I n t e g e r > l = . . . ; i n t sum = 0 ; for ( Integer i : l ) { sum += i . i n t V a l u e ( ) ; } MI3GL 2004/2005 19 Aperçu du cours Mise à niveau Java 5 L’autoboxing Il s’agit de remplacer automatiquement un type primitif par l’objet “wrapper” correspondant (boxing) ou inversement (unboxing). L i s t <I n t e g e r > l = new A r r a y L i s t <I n t e g e r > ( ) ; f o r ( i n t i = 0 ; i <10; i ++) { // b o x i n g l . add ( i ) ; // l . add ( new I n t e g e r ( i ) ; } i n t sum = 0 ; for ( Integer i : l ) { // u n b o x i n g sum += i ; // sum += i . i n t V a l u e ( ) ; } MI3GL 2004/2005 20 Aperçu du cours Mise à niveau Java 5 Le piège de l’autoboxing Globalement, l’unboxing ne coûte pas trop cher en terme de performance (juste un appel à une fonction). Par contre, le boxing crée un nouvel objet : cela peut engendrer de gros problèmes de performance. Integer s = 0; for ( Integer i : l ) { s += i ; // s = new I n t e g e r ( s . i n t V a l u e ()+ i . i n t V a l u e ( ) ) ; } MI3GL 2004/2005 21 Aperçu du cours Mise à niveau Java 5 Nombre d’arguments variable p u b l i c v o i d show ( O b j e c t . . . a r g s ) { f o r ( Object t : args ) { out . p r i n t l n ( t ) ; } } show ( ” t r u c ” , ” machin ” , ” c h o u e t t e ” ) ; // a u t o b o x i n g show ( 1 , 2 , 3 , 4 , 5 ) ; MI3GL 2004/2005 22 Aperçu du cours Mise à niveau Java 5 Affichage formatté (printf) I rendu possible grâce à l’autoboxing et aux méthodes à nombre d’arguments variable. I même comportemant que la fonction printf() en C. I Devrait faciliter la migration du code C existant en Java. o u t . p r i n t f ( ”C ’ e s t mon % s p r e f e r e : % . 2 f /20\ n” , ” tableau ” ,14.5); // a f f i c h a g e ( l o c a l i s e ) C ’ e s t nom t a b l e a u p r e f e r e : 1 4 , 5 0 MI3GL 2004/2005 23 Aperçu du cours Mise à niveau Java 5 Amélioration de la gestion de l’entrée standard Ajout d’une classe java.util.Scanner pour lire des types primitifs et des chaı̂nes de caractère sur l’entrée standard. // 1 . 4 . 2 B u f f e r e d R e a d e r b r = new B u f f e r e d R e a d e r ( new I n p u t S t r e a m R e a d e r ( System . i n ) ) ; S t r i n g s t r = br . readLine ( ) ; int n = Integer . parseInt ( str ); // 1 . 5 / 5 . 0 S c a n n e r r e a d e r = new S c a n n e r ( System . i n ) ; int n = reader . nextInt (); MI3GL 2004/2005 24 Aperçu du cours Mise à niveau Java 5 Enumérations MI3GL I nouveau mot clé enum I crée une classe réalisant le DP “typesafe enum”. I nombreuses méthodes disponibles : values() retourne un tableau de valeurs valueOf(String) conversion String to enum toString() conversion enum to String compareTo() ordre de déclaration des valeurs I on peut utiliser ses valeurs dans un switch ! 2004/2005 25 Aperçu du cours Mise à niveau Java 5 Enumérations : exemple c l a s s Example { p u b l i c enum MainMenu { FILE , EDIT , FORMAT, VIEW} p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g v ) { f o r ( MainMenu menu : MainMenu . v a l u e s ( ) ) System . o u t . p r i n t l n ( menu ) ; f o r ( MainMenu menu : MainMenu . v a l u e s ( ) ) { s w i t c h ( menu ) { c a s e FILE : o u t . p r i n t l n ( ” FILE Menu” ) ; b r e a k ; c a s e EDIT : o u t . p r i n t l n ( ”EDIT Menu” ) ; b r e a k ; c a s e FORMAT : o u t . p r i n t l n ( ”FORMAT Menu” ) ; b r e a k ; c a s e VIEW : o u t . p r i n t l n ( ”VIEW Menu” ) ; b r e a k ; } } } } MI3GL 2004/2005 26 Aperçu du cours Mise à niveau Java 5 Enumérations : exemple L i s t <MainMenu> l = new A r r a y L i s t <MainMenu > ( ) ; l . add ( MainMenu . VIEW ) ; l . add ( MainMenu . EDIT ) ; l . add ( MainMenu .FORMAT) ; l . add ( MainMenu . FILE ) ; System . o u t . p r i n t l n ( l ) ; Collections . sort ( l ); System . o u t . p r i n t l n ( l ) ; Collections . reverse ( l ); System . o u t . p r i n t l n ( l ) ; // a f f i c h a g e [ VIEW , EDIT , FORMAT, FILE ] [ FILE , EDIT , FORMAT, VIEW ] [ VIEW , FORMAT, EDIT , FILE ] MI3GL 2004/2005 27 Aperçu du cours Mise à niveau Java 5 Enumérations : exemple Une énumération est une classe comme les autres : elle peut être spécialisée. p u b l i c enum MainMenu { FILE ( ”new f i l e ” ) , EDIT ( ” e d i t c o n t e n t ” ) , FORMAT( ” p r e t t y p r i n t ” ) , VIEW( ” show me” ) ; MainMenu ( S t r i n g t i p ) { this . tip = tip ; } public String toString () { r e t u r n s u p e r . t o S t r i n g ()+ ” ( ”+t i p+” ) ” ; } private f i n a l String tip ; } // a f f i c h a g e [ VIEW( show me ) , EDIT ( e d i t c o n t e n t ) , FORMAT( p r e t t y p r i n MI3GL 2004/2005 28 Aperçu du cours Mise à niveau Java 5 Import de membres de classe I pour éviter de réaliser des interfaces pour avoir un accès direct aux constantes quand cela n’a pas de sens. I pour faciliter l’écriture du code i m p o r t s t a t i c j a v a . l a n g . System . o u t ; // Ne f o n c t i o n n e p a s s o u s E c l i p s e 3 . 1M4 // u t i l i s e r i m p o r t s t a t i c j a v a . l a n g . Math . ∗ ; i m p o r t s t a t i c j a v a . l a n g . Math . max ; public s t a t i c i nt trimax ( i nt a , i nt b , i nt c ) { r e t u r n max ( max ( a , b ) , c ) ; } ... out . p r i n t l n ( trimax ( 7 , 1 4 , 1 ) ) ; MI3GL 2004/2005 29 Aperçu du cours Mise à niveau Java 5 Les annotations MI3GL I extension du mécanisme des doclets de la JavaDoc I permet d’étendre l’expressivité du langage sans ajouter de nouveaux mots clés. I laisse l’utilisateur ajouter des informations “sémantiques” dans le code qu’il pourra ensuite traiter. I introduction d’un nouvel outil APT : annotation processing tool 2004/2005 30 Aperçu du cours Mise à niveau Java 5 Exemple /∗ ∗ ∗ D e s c r i b e s t h e Request −For−Enhancement ( RFE ) t h a t l e d ∗ t o t h e p r e s e n c e o f t h e a n n o t a t e d API e l e m e n t . ∗/ p u b l i c @ i n t e r f a c e RequestForEnhancement { int id (); String synopsis (); String engineer () default ” [ unassigned ] ” ; S t r i n g date ( ) ; d e f a u l t ” [ unimplemented ] ” ; } MI3GL 2004/2005 31 Aperçu du cours Mise à niveau Java 5 Exemple @RequestForEnhancement ( id = 2868724 , s y n o p s i s = ” E n a b l e time−t r a v e l ” , e n g i n e e r = ”Mr . Peabody ” , date = ” 4/1/3007 ” ) p u b l i c s t a t i c v o i d t r a v e l T h r o u g h T i m e ( Date d e s t i n a t i o n ) { MI3GL 2004/2005 32 Aperçu du cours Mise à niveau Java 5 Deux utilisations possibles A la compilation : permet de marquer des classes, méthodes, attributs afin de générer du code ou des documents, permettre à tous d’étendre le langage. A l’exécution : permet de marquer des éléments du langage pour un traitement utilisant la réflexivité. MI3GL 2004/2005 33 Aperçu du cours Mise à niveau Java 5 Annotations prédéfinies Override permet d’indiquer qu’une méthode doit redéfinir une méthode. Si ce n’est pas le cas, erreur à la compilation. Deprecated permet d’indiquer qu’une méthode est dépréciée. Affiche un avertissement à la compilation. p u b l i c Toto { // E r r e u r d e t e c t e e a l a c o m p i l a t i o n @ O v e r r i d e p u b l i c S t r i n g t o S t r i n g ( Toto o ) { r e t u r n ” Toto ” ; } } MI3GL 2004/2005 34 Aperçu du cours Mise à niveau Java 5 Mieux que JUnit ? import java . lang . annotation . ∗ ; /∗ ∗ ∗ I n d i c a t e s t h a t t h e a n n o t a t e d method i s a t e s t method . ∗ T h i s a n n o t a t i o n s h o u l d be u s e d o n l y on p a r a m e t e r l e s s ∗/ @ R e t e n t i o n ( R e t e n t i o n P o l i c y . RUNTIME) @Target ( ElementType .METHOD) p u b l i c @ i n t e r f a c e Test { } MI3GL 2004/2005 35 Aperçu du cours Mise à niveau Java 5 Mieux que JUnit ? p u b l i c c l a s s Foo { @Test p u b l i c s t a t i c v o i d m1 ( ) { } p u b l i c s t a t i c v o i d m2 ( ) { } @Test p u b l i c s t a t i c v o i d m3 ( ) { t hro w new R u n t i m e E x c e p t i o n ( ”Boom” ) ; } p u b l i c s t a t i c v o i d m4 ( ) { } @Test p u b l i c s t a t i c v o i d m5 ( ) { } p u b l i c s t a t i c v o i d m6 ( ) { } @Test p u b l i c s t a t i c v o i d m7 ( ) { t hro w new R u n t i m e E x c e p t i o n ( ” C r a s h ” ) ; } p u b l i c s t a t i c v o i d m8 ( ) { } } MI3GL 2004/2005 36 Aperçu du cours Mise à niveau Java 5 Mieux que JUnit ? p u b l i c c l a s s RunTests { p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) t h r o w s E x c e p t i o n i n t passed = 0 , f a i l e d = 0; f o r ( Method m : C l a s s . forName ( a r g s [ 0 ] ) . g e t M e t ho ds ( ) ) i f (m. i s A n n o t a t i o n P r e s e n t ( T e s t . c l a s s ) ) { try { m. i n v o k e ( n u l l ) ; p a s s e d ++; } c a t c h ( Throwable ex ) { System . o u t . p r i n t f ( ” T e s t % s f a i l e d : % s %n” , m, f a i l e d ++; } } } System . o u t . p r i n t f ( ” P a s s e d : % d , F a i l e d %d%n” , p a s s e d , } } MI3GL 2004/2005 37 Aperçu du cours Mise à niveau Java 5 Kent Beck. eXtreme Programming eXplained, Embrace Change. Addison Wesley, 2000. B. Boehm. Software Engineering Project Management, chapter A spiral model of software development and enhancement. 1987. Bernd Bruegge and Allen H. Dutoit. Object Oriented Software Engineering: Conquering Complex and Changing Systems. Prentice Hall, 2000. ISBN: 0-13-017452-1. Martin Fowler. Refactoring: Improving the Design of Existing Code. Object Technology Series. Addison Wesley, 2000. MI3GL 2004/2005 38 Aperçu du cours Mise à niveau Java 5 Indispensable ! Martin Fowler. Patterns of Enterprise Application Architecture. The Addison-Wesley Signature Series. Addison Wesley, 2003. Martin Fowler. UML distilled: A brief Guide to the Standard Object Modelling Language. Object Technology series. Addison Wesley, 3rd edition, 2004. Indispensable ! Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides. Design Patterns, Elements of Reusable Object-Oriented Software. Addison Wesley, 1995. A posséder absolument! MI3GL 2004/2005 39 Aperçu du cours Mise à niveau Java 5 Marie-Claude Gaudel, Bruno Marre, Françoise Schienger, and Gilles Bernot. Précis de Génie Logiciel. Enseignement de l’Informatique. Masson, 1996. ISBN : 2-225-85189-1. Andrew Hunt and David Thomas. The Pragmatic Programmer. Addison Wesley, 2000. Un livre interessant (mais en anglais) pour tous les programmeurs. Robert C. Martin. Agile Software Development: Principles, Patterns and Practices. Prentice Hall, 2003. Utile. MI3GL 2004/2005 40 Aperçu du cours Mise à niveau Java 5 Robert C. Martin. UML for Java Programmers. Prentice Hall, 2003. Bertrand Meyer. Conception et programmation orientées objet. Eyrolles, 1997. Indispensable pour tout programmeur dans un langage objet, même si les exemples donnés sont plutôt en Eiffel. P. G. Neumann. Computer-Related Risks. Reading. Addison-Wesley, MA, 1995. W. W. Royse. Managing the development of large software systems. MI3GL 2004/2005 41 Aperçu du cours Mise à niveau Java 5 In IEEE Computer Society, editor, Tutorial: Software Engineering Project Management, pages 118–127, Washington, DC, 1970. Jack Shirazi. Java Performance Tuning, 2nd edition. O’Reilly, 2003. MI3GL 2004/2005 42