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