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
Top Related