2i002 - UML (light), diagramme mémoire et...

26
2i002 - UML (light), diagramme mémoire et pointeurs Vincent Guigue Vincent Guigue 2i002 - UML et mémoire 1/13

Transcript of 2i002 - UML (light), diagramme mémoire et...

2i002 - UML (light), diagramme mémoire etpointeurs

Vincent Guigue

Vincent Guigue 2i002 - UML et mémoire 1/13

Philosophie

On ne programme pas pour soi-même... Mais pour les autres :◦ Respecter les codes syntaxiques : majuscules, minuscules...◦ Donner des noms explicites (classes, méthodes, attributs)◦ Développer une documentation du code (cf cours javadoc)◦ ... Et proposer une vision synthétique d’un ensemble de

classes : ⇒ UML

◦ nom de la classe◦ attributs◦ méthodes (et constructeurs)

+ code pour visualiser public/private+ liens entre classes pour lesdépendances (cf cours sur lacomposition)

Vincent Guigue 2i002 - UML et mémoire 2/13

Philosophie

On ne programme pas pour soi-même... Mais pour les autres :◦ Respecter les codes syntaxiques : majuscules, minuscules...◦ Donner des noms explicites (classes, méthodes, attributs)◦ Développer une documentation du code (cf cours javadoc)◦ ... Et proposer une vision synthétique d’un ensemble de

classes : ⇒ UML

◦ nom de la classe◦ attributs◦ méthodes (et constructeurs)

+ code pour visualiser public/private+ liens entre classes pour lesdépendances (cf cours sur lacomposition)

Vincent Guigue 2i002 - UML et mémoire 2/13

UML Client vs DéveloppeurPlusieurs types de diagrammes pour plusieurs usages :◦ Pour les développeurs : représentation complète◦ Pour les utilisateurs : représentation public uniquement

Idée :Le code doit être pensé pour les autres :◦ Tous les noms doivent être aussi clairs que possible◦ Un diagramme plus limité est plus facile à lire

Vincent Guigue 2i002 - UML et mémoire 3/13

Philosophie (suite)

2 manières de voir l’UML :1 Outil pour une visualisation globale d’un code complexe2 Outil de conception / développement indépendant du langage

Dans le cadre de 2i002 : seulement l’approche 1

Limites de l’UML :◦ Vision architecte...◦ Mais pas d’analyse de l’exécution du code

Que se passe-t-il lors de l’exécution du programme :Nouveau type de représentation :

Diagramme mémoire

Vincent Guigue 2i002 - UML et mémoire 4/13

Coté JVM : exécution du code

1 Po in t p = new Po in t ( 1 , 2 ) ;

Comment décrire cette ligne de code ?

La variable p, de type Point, référence une instance dont lesattributs x et y ont pour valeur respective 1 et 2.

Comment représenter cette ligne de code ?

double x = 1double y = 2

PointPoint p1

◦ Représentation des classes sans les méthodes◦ Valeur des attributs◦ Type & noms des variables◦ Lien de référencement

Vincent Guigue 2i002 - UML et mémoire 5/13

Coté JVM : exécution du code

1 Po in t p = new Po in t ( 1 , 2 ) ;

Comment décrire cette ligne de code ?

La variable p, de type Point, référence une instance dont lesattributs x et y ont pour valeur respective 1 et 2.

Comment représenter cette ligne de code ?

double x = 1double y = 2

PointPoint p1

◦ Représentation des classes sans les méthodes◦ Valeur des attributs◦ Type & noms des variables◦ Lien de référencement

Vincent Guigue 2i002 - UML et mémoire 5/13

Coté JVM : exécution du code

1 Po in t p = new Po in t ( 1 , 2 ) ;

Comment décrire cette ligne de code ?

La variable p, de type Point, référence une instance dont lesattributs x et y ont pour valeur respective 1 et 2.

Comment représenter cette ligne de code ?

double x = 1double y = 2

PointPoint p1

◦ Représentation des classes sans les méthodes◦ Valeur des attributs◦ Type & noms des variables◦ Lien de référencement

Vincent Guigue 2i002 - UML et mémoire 5/13

Types de base vs Objet : signification de =Les types de base et les objets ne se comportent pas de lamême façon avec =

◦ Liste des types de base :int, double, boolean, char, byte, short, long, float

1 double a , b ;2 a = 1 ;3 b = a ; // d u p l i c a t i o n de l a v a l e u r 1

⇒ Si b est modifié, pas d’incidence sur a

◦ et pour un Objet :

4 Po in t p = new Po in t ( 1 , 2 ) ;5 Po in t q = p ; // d u p l i c a t i o n de l a r é f é r e n c e . . .6 // 1 s e u l e i n s t a n c e !

double x = 1double y = 2

PointPoint pPoint q

2 variables, 2 références, mais 1 seule instance

Vincent Guigue 2i002 - UML et mémoire 6/13

Types de base vs Objet : signification de =Les types de base et les objets ne se comportent pas de lamême façon avec =

◦ Liste des types de base :int, double, boolean, char, byte, short, long, float

1 double a , b ;2 a = 1 ;3 b = a ; // d u p l i c a t i o n de l a v a l e u r 1

⇒ Si b est modifié, pas d’incidence sur a

◦ et pour un Objet :

4 Po in t p = new Po in t ( 1 , 2 ) ;5 Po in t q = p ; // d u p l i c a t i o n de l a r é f é r e n c e . . .6 // 1 s e u l e i n s t a n c e !

double x = 1double y = 2

PointPoint pPoint q

2 variables, 2 références, mais 1 seule instance

Vincent Guigue 2i002 - UML et mémoire 6/13

Types de base vs Objet : signification de =Les types de base et les objets ne se comportent pas de lamême façon avec =

◦ Liste des types de base :int, double, boolean, char, byte, short, long, float

1 double a , b ;2 a = 1 ;3 b = a ; // d u p l i c a t i o n de l a v a l e u r 1

⇒ Si b est modifié, pas d’incidence sur a

◦ et pour un Objet :

4 Po in t p = new Po in t ( 1 , 2 ) ;5 Po in t q = p ; // d u p l i c a t i o n de l a r é f é r e n c e . . .6 // 1 s e u l e i n s t a n c e !

double x = 1double y = 2

PointPoint pPoint q

2 variables, 2 références, mais 1 seule instanceVincent Guigue 2i002 - UML et mémoire 6/13

Clonage vs copie de surface

1 pub l i c s t a t i c vo id main ( S t r i n g [ ] a r g s ) {2 Po in t p1 = new Po in t (1 , 2 ) ;3 Po in t p2 = p1 ;45 Po in t p3 = new Po in t (1 , 2 ) ;6 Po in t p4 = new Po in t (1 , 2 ) ;7 }

double x = 1double y = 2

PointPoint p1Point p2

double x = 1double y = 2

PointPoint p3Point p4

double x = 1double y = 2

Point

◦ Les variables p1 et p2référencent la mêmeinstance◦ p3 et p4 référencent

des instancesdifférentes

Vincent Guigue 2i002 - UML et mémoire 7/13

Références & arguments de fonctions

◦ Passer un argument à une fonction revient à utiliser un signe =◦ ... Objets et types de base se comportent différemment !

1 // c l a s s e UnObjet ,2 // ( c l a s s e sans impor tance )3 . . .4 p u b l i c v o i d maFonction1 ( Po in t p){5 . . .6 p . move ( 1 . , 1 . ) ;7 . . .8 }9

10 p u b l i c v o i d maFonction2 ( doub l e d){11 . . .12 d = 3 . ; // s yn t a x e c o r r e c t e13 // mais t r è s moche !14 . . .15 }

1 // dans l e main2 UnObjet ob j = new UnObjet ( ) ;34 Po in t p = new Po in t ( 1 . , 2 . ) ;5 doub l e d = 2 . ;67 ob j . maFonction1 ( p ) ;8 ob j . maFonction2 ( d ) ;9

10 // p a pour a t t r i b u t s ( x=2. , y=3.)11 // d vaut 2

◦ Quand un objet est passé en argument :il n’y a pas duplication de l’instance (simplement 2références vers 1 instance)◦ Quand un type de base est passé en argument : duplication.

Vincent Guigue 2i002 - UML et mémoire 8/13

Types de base vs Objet : signification de ==

◦ Opérateur == : prend 2 opérandes de même type et retourneun boolean◦ Type de base : vérification de l’égalité des valeurs

◦ Objet : vérification de l’égalité des références

◦ ATTENTION aux classes enveloppes (qui sont des objets)

1 double d1 = 1 . ;2 double d2 = 1 . ;3 System . out . p r i n t l n ( d1==d2 ) ; // a f f i c h a g e de t r u e4 // dans l a c on s o l e

5 Po in t p1 = new Po in t (1 , 2 ) ;6 Po in t p2 = p1 ;7 System . out . p r i n t l n ( p1==p2 ) ; // a f f i c h a g e de true89 Po in t p3 = new Po in t (1 , 2 ) ;

10 Po in t p4 = new Po in t (1 , 2 ) ;11 System . out . p r i n t l n ( p3==p4 ) ; // a f f i c h a g e de false12 Double d3 = 1 . ; // c l a s s e enve l oppe Double = ob j e t13 Double d4 = 1 . ;14 System . out . p r i n t l n ( d3==d4 ) ; // a f f i c h a g e de false

Vincent Guigue 2i002 - UML et mémoire 9/13

Types de base vs Objet : signification de ==

◦ Opérateur == : prend 2 opérandes de même type et retourneun boolean◦ Type de base : vérification de l’égalité des valeurs◦ Objet : vérification de l’égalité des références

◦ ATTENTION aux classes enveloppes (qui sont des objets)

1 double d1 = 1 . ;2 double d2 = 1 . ;3 System . out . p r i n t l n ( d1==d2 ) ; // a f f i c h a g e de t r u e4 // dans l a c on s o l e5 Po in t p1 = new Po in t (1 , 2 ) ;6 Po in t p2 = p1 ;7 System . out . p r i n t l n ( p1==p2 ) ; // a f f i c h a g e de true89 Po in t p3 = new Po in t (1 , 2 ) ;

10 Po in t p4 = new Po in t (1 , 2 ) ;11 System . out . p r i n t l n ( p3==p4 ) ; // a f f i c h a g e de false

12 Double d3 = 1 . ; // c l a s s e enve l oppe Double = ob j e t13 Double d4 = 1 . ;14 System . out . p r i n t l n ( d3==d4 ) ; // a f f i c h a g e de false

Vincent Guigue 2i002 - UML et mémoire 9/13

Types de base vs Objet : signification de ==

◦ Opérateur == : prend 2 opérandes de même type et retourneun boolean◦ Type de base : vérification de l’égalité des valeurs◦ Objet : vérification de l’égalité des références

◦ ATTENTION aux classes enveloppes (qui sont des objets)

1 double d1 = 1 . ;2 double d2 = 1 . ;3 System . out . p r i n t l n ( d1==d2 ) ; // a f f i c h a g e de t r u e4 // dans l a c on s o l e5 Po in t p1 = new Po in t (1 , 2 ) ;6 Po in t p2 = p1 ;7 System . out . p r i n t l n ( p1==p2 ) ; // a f f i c h a g e de true89 Po in t p3 = new Po in t (1 , 2 ) ;

10 Po in t p4 = new Po in t (1 , 2 ) ;11 System . out . p r i n t l n ( p3==p4 ) ; // a f f i c h a g e de false12 Double d3 = 1 . ; // c l a s s e enve l oppe Double = ob j e t13 Double d4 = 1 . ;14 System . out . p r i n t l n ( d3==d4 ) ; // a f f i c h a g e de false

Vincent Guigue 2i002 - UML et mémoire 9/13

Classes enveloppes

Les types de base en JAVA sont doublés de wrappers ou classesenveloppes pour :◦ utiliser les classes génériques (cf cours ArrayList)◦ fournir quelques outils fort utiles

int, double, boolean, char, byte, short, long, float ⇒Integer, Double...Outils

1 Double d1 = Double .MAX_VALUE; // v a l e u r maximum p o s s i b l e2 Double d2 = Double . POSITIVE_INFINITY ; // v a l e u r s p é c i f i q u e3 // gé r é e dans l e s o p é r a t i o n s4 Double d3 = Double . v a l u e o f ( " 3 .5 " ) ; // S t r i n g => doub l e5 // Double . isNaN ( doub l e d ) , Double . i s I n f i n i t e ( doub l e d ) . . .

Documentation : http://docs.oracle.com/javase/7/docs/api/java/lang/Double.html

6 // c o n v e r s i o n s i m p l i c i t e s = ( un ) box ing ( d epu i s JAVA 5)7 double d4 = d1 ;8 Double d5 = d4 ;

Vincent Guigue 2i002 - UML et mémoire 10/13

Classes enveloppes

Les types de base en JAVA sont doublés de wrappers ou classesenveloppes pour :◦ utiliser les classes génériques (cf cours ArrayList)◦ fournir quelques outils fort utiles

int, double, boolean, char, byte, short, long, float ⇒Integer, Double...Outils

1 Double d1 = Double .MAX_VALUE; // v a l e u r maximum p o s s i b l e2 Double d2 = Double . POSITIVE_INFINITY ; // v a l e u r s p é c i f i q u e3 // gé r é e dans l e s o p é r a t i o n s4 Double d3 = Double . v a l u e o f ( " 3 .5 " ) ; // S t r i n g => doub l e5 // Double . isNaN ( doub l e d ) , Double . i s I n f i n i t e ( doub l e d ) . . .

Documentation : http://docs.oracle.com/javase/7/docs/api/java/lang/Double.html

6 // c o n v e r s i o n s i m p l i c i t e s = ( un ) box ing ( d epu i s JAVA 5)7 double d4 = d1 ;8 Double d5 = d4 ;

Vincent Guigue 2i002 - UML et mémoire 10/13

Classe enveloppe : des objets avant tout

Historique :◦ A l’origine : Philosophie tout objet

⇒ propre, mais pas pratique◦ Evolution : plus de dérogation pour faciliter les usages

⇒ classes enveloppes bcp moins utilisées

⇒ Classe enveloppe = objet ! ! !1 double d1b = 1 . ;2 double d2b = d1b ;3 double d3b = 1 . ;4 System . out . p r i n t l n ( d1b == d2b ) ;5 System . out . p r i n t l n ( d1b == d3b ) ;

6 // t r u e & t r u e7 Double d1 = 1 . ;8 Double d2 = d1 ;9 Double d3 = 1 . ;

10 System . out . p r i n t l n ( d1 == d2 ) ;11 System . out . p r i n t l n ( d1 == d3 ) ;12 // t r u e & false

Vincent Guigue 2i002 - UML et mémoire 11/13

Classe enveloppe : des objets avant tout

Historique :◦ A l’origine : Philosophie tout objet

⇒ propre, mais pas pratique◦ Evolution : plus de dérogation pour faciliter les usages

⇒ classes enveloppes bcp moins utilisées

⇒ Classe enveloppe = objet ! ! !1 double d1b = 1 . ;2 double d2b = d1b ;3 double d3b = 1 . ;4 System . out . p r i n t l n ( d1b == d2b ) ;5 System . out . p r i n t l n ( d1b == d3b ) ;6 // t r u e & t r u e

7 Double d1 = 1 . ;8 Double d2 = d1 ;9 Double d3 = 1 . ;

10 System . out . p r i n t l n ( d1 == d2 ) ;11 System . out . p r i n t l n ( d1 == d3 ) ;12 // t r u e & false

Vincent Guigue 2i002 - UML et mémoire 11/13

Classe enveloppe : des objets avant tout

Historique :◦ A l’origine : Philosophie tout objet

⇒ propre, mais pas pratique◦ Evolution : plus de dérogation pour faciliter les usages

⇒ classes enveloppes bcp moins utilisées

⇒ Classe enveloppe = objet ! ! !1 double d1b = 1 . ;2 double d2b = d1b ;3 double d3b = 1 . ;4 System . out . p r i n t l n ( d1b == d2b ) ;5 System . out . p r i n t l n ( d1b == d3b ) ;6 // t r u e & t r u e7 Double d1 = 1 . ;8 Double d2 = d1 ;9 Double d3 = 1 . ;

10 System . out . p r i n t l n ( d1 == d2 ) ;11 System . out . p r i n t l n ( d1 == d3 ) ;

12 // t r u e & false

Vincent Guigue 2i002 - UML et mémoire 11/13

Classe enveloppe : des objets avant tout

Historique :◦ A l’origine : Philosophie tout objet

⇒ propre, mais pas pratique◦ Evolution : plus de dérogation pour faciliter les usages

⇒ classes enveloppes bcp moins utilisées

⇒ Classe enveloppe = objet ! ! !1 double d1b = 1 . ;2 double d2b = d1b ;3 double d3b = 1 . ;4 System . out . p r i n t l n ( d1b == d2b ) ;5 System . out . p r i n t l n ( d1b == d3b ) ;6 // t r u e & t r u e7 Double d1 = 1 . ;8 Double d2 = d1 ;9 Double d3 = 1 . ;

10 System . out . p r i n t l n ( d1 == d2 ) ;11 System . out . p r i n t l n ( d1 == d3 ) ;12 // t r u e & false

Vincent Guigue 2i002 - UML et mémoire 11/13

Pointeur nullQue se passe-t-il quand on déclare une variable (sans l’instancier) ?

1 Po in t p ;

◦ p vaut null.◦ On peut écrire de manière équivalente1 Po in t p = nu l l ;

◦ On ne peut pas invoquer de méthode1 p . move ( 1 . , 2 . ) ; // => CRASH de l ’ e x é c u t i o n :2 // Nu l l P o i n t e r E x c e p t i o n

◦ N’importe quel objet peut être null et réciproquement, onpeut donner null à n’importe quel endroit où un objet estattendu... Même si ça provoque parfois des crashs.

1 // c l a s s e UnObjet ,2 // ( c l a s s e sans impor tance )3 . . .4 p u b l i c v o i d maFonction ( Po in t p ){5 . . .6 p . move ( 1 . , 1 . ) ;7 . . .8 }

1 // dans l e main2 UnObjet ob j = new UnObjet ( ) ;34 ob j . maFonction ( n u l l ) ;

Vincent Guigue 2i002 - UML et mémoire 12/13

Pointeur nullQue se passe-t-il quand on déclare une variable (sans l’instancier) ?

1 Po in t p ;

◦ p vaut null.◦ On peut écrire de manière équivalente1 Po in t p = nu l l ;

◦ On ne peut pas invoquer de méthode1 p . move ( 1 . , 2 . ) ; // => CRASH de l ’ e x é c u t i o n :2 // Nu l l P o i n t e r E x c e p t i o n

◦ N’importe quel objet peut être null et réciproquement, onpeut donner null à n’importe quel endroit où un objet estattendu... Même si ça provoque parfois des crashs.

1 // c l a s s e UnObjet ,2 // ( c l a s s e sans impor tance )3 . . .4 p u b l i c v o i d maFonction ( Po in t p ){5 . . .6 p . move ( 1 . , 1 . ) ;7 . . .8 }

1 // dans l e main2 UnObjet ob j = new UnObjet ( ) ;34 ob j . maFonction ( n u l l ) ;

Vincent Guigue 2i002 - UML et mémoire 12/13

Pointeur nullQue se passe-t-il quand on déclare une variable (sans l’instancier) ?

1 Po in t p ;

◦ p vaut null.◦ On peut écrire de manière équivalente1 Po in t p = nu l l ;

◦ On ne peut pas invoquer de méthode1 p . move ( 1 . , 2 . ) ; // => CRASH de l ’ e x é c u t i o n :2 // Nu l l P o i n t e r E x c e p t i o n

◦ N’importe quel objet peut être null et réciproquement, onpeut donner null à n’importe quel endroit où un objet estattendu... Même si ça provoque parfois des crashs.

1 // c l a s s e UnObjet ,2 // ( c l a s s e sans impor tance )3 . . .4 p u b l i c v o i d maFonction ( Po in t p ){5 . . .6 p . move ( 1 . , 1 . ) ;7 . . .8 }

1 // dans l e main2 UnObjet ob j = new UnObjet ( ) ;34 ob j . maFonction ( n u l l ) ;

Vincent Guigue 2i002 - UML et mémoire 12/13

Execution d’une méthode

Une méthode est exécutée sur une instance...

1 Po in t p = new Po in t ( 1 , 2 ) ;2 Po in t p2 = p ;3 p . move ( 1 . , 1 . ) ;4 // méthode ex é cu t é e s u r l ’ i n s t a n c e5 // ( qu i e s t r é f é r e n c é e par p e t p2 )6 System . out . p r i n t l n ( p2 ) ;7 // [ x=2. , y =3. ]

⇒ Il faut toujours se représenter se qui se passe dans la mémoirelors de l’exécution d’un programme.

Vincent Guigue 2i002 - UML et mémoire 13/13