INF 321 Classes, Objets, Exceptions · Plus g en eralement, les champs static sont communs a tous...
Transcript of INF 321 Classes, Objets, Exceptions · Plus g en eralement, les champs static sont communs a tous...
INF 321Classes, Objets, Exceptions...
Eric Goubault
Cours 4
3 juin 2013
1
Dans l’episode precedent...
Cours precedent
Les types produits - retour sur les tableaux
Les types somme
Les types recursifs
Dans ce cours
Classes et methodes dynamiques
Le traitement des erreurs et les exceptions
Classes abstraites, interfaces, packages
2
Programmation orientee objet?
class? : jusqu’a present:
On n’avait defini que des class contenant des donnees (avecconstructeurs neanmoins) - cf. types produits, enregistrements
Ou des class ne contenant que du code: les “programmes”
Melons les deux!
3
Programmation orientee objet?
class? : jusqu’a present:
On n’avait defini que des class contenant des donnees (avecconstructeurs neanmoins) - cf. types produits, enregistrements
Ou des class ne contenant que du code: les “programmes”
Melons les deux!
4
Exemple: static→dynamique
Philosophie orientee objet (1ere approximation)
Au lieu de:
c l a s s P i l e {L i s t c ;P i l e ( L i s t x ) { t h i s . c = x ;} }
c l a s s Prog {s t a t i c void push ( i n t a , P i l e l ) {
l . c = new L i s t ( a , l . c ) ; }s t a t i c void pop ( P i l e l ) {
l . c = l . c . t l ; }s t a t i c i n t top ( P i l e l ) {
return l . c . hd ; } }
Mettre toutes les methodes concernant les piles dans class
Pile!
5
Vers l’oriente objet...
On obtiendrait ainsi:
c l a s s P i l e {L i s t c ;P i l e ( L i s t x ) { t h i s . c = x ; }s t a t i c void push ( i n t a , P i l e l ) {
l . c = new L i s t ( a , l . c ) ; }s t a t i c void pop ( P i l e l ) {
l . c = l . c . t l ; }s t a t i c i n t top ( P i l e l ) {
return l . c . hd ; } }c l a s s Prog {
. . . P i l e . push ( 1 , p ) ; . . . }
Les fonctions s’appliquant a la collection ou classe des pilessont comme des champs (ou enregistrements - cf. typesproduits, cours 2 - cf. von Neuman!): methodes
On les appelle en faisant Pile.methode...
6
Critique
Enregistrement?
Quand on a une Pile p, on fait p.c pour obtenir son champde type List
Pourquoi Pile.push(1,p) pour les methodes?
Champs/methodes statiques...ou pas
c est un champ non statique (pas de qualificatif static)
push est une methode statique (qualificatif static)
Commencons par expliquer les champs statiques/non-statiquesavant les methodes...
7
Statique or not...? (experimentation)
Champs statiques
c l a s s S t a t {s t a t i c i n t x = 2 ; }
c l a s s Prog {pub l i c s t a t i c void main ( S t r i n g [ ] a r g s ) {
S t a t s , t ; s = new S t a t ( ) ; t = new S t a t ( ) ;System . out . p r i n t l n ( s . x ) ;t . x = 3 ;System . out . p r i n t l n ( s . x ) ;
Donne:
> j a v a Prog23
Blup?
8
Statique or not...? (experimentation)
Champs non statiques
On change juste:
c l a s s S t a t 2 {i n t x = 2 ; }
Donne:
> j a v a Prog22
Ouf.... ;-)
9
Explication
Champs statiques/non statiques
class (classe) definit un ensemble d’objets
Stat (version 1, statique) ne contient qu’un singleton
Stat2 (version 2, dynamique) peut contenir n’importe quelnombre d’objet, dont le trait commun est qu’ils contiennentun champ entier x initialise a 2
Plus generalement, les champs static sont communs a tousles objets de cette classe
Et les methodes dans tout cela?
Moche ce que l’on a fait: Pile.push(1,p)
On voudrait ecrire comme pour les champs quelque chosecomme p.push(1): possible avec une methode push nonstatique!
10
On obtient:
c l a s s P i l e {L i s t c ;P i l e ( L i s t x ) { t h i s . c = x ; }
. . .void push ( i n t a ) {
t h i s . c = new L i s t ( a , t h i s . c ) ; }
void pop ( ) {t h i s . c = t h i s . c . t l ; }
i n t top ( ) {return t h i s . c . hd ; }
}
“Module” coherent parlant de piles, avec toutes les operationslegales associees
11
Explication?
Methodes dynamiques
De meme: methode static, une seule par classe, exemplemain
p.push est une fonction differente de q.push (pour deux pilesp et q distinctes)
push (dynamique) definit une fonction partielle, instanciee parle passage de p (appele this - objet courant sur lequels’applique la methode) lors de son appel par p.push(...)(regles de passage d’argument inchangees)
Quand on fait p.push(...), la machine regarde le type de p,voit Pile, trouve l”’enregistrement” (fonctionnel) push, passela reference sur le contenu de p a push puis execute soncode...
12
Remarques importantes!
this...
est le plus souvent implicite: on aurait pu ecrire:
void push ( i n t a ) {c = new L i s t ( a , c ) ; }
void pop ( ) {c = c . t l ; }
Le cas de null...
Attention ne jamais faire p.push(...) quand p vaut null!
13
Autres remarques
Types somme
Rend possible une autre implementation des types somme
Classes entierement static
Il en existe... exemple, fonctions de librairie Math.sin, Math.cosetc.
14
Premier resume
Quelques elements de vocabulaire
communs aux langages orientes objet:
objet: structure de donnee compose de:
attributs: ou champs (cf. types produit, ou enregistrement!),ce sont les donnees elementaires composant l’objetmethodes: fonctions pouvant s’appliquer a ce type d’objet
classe: ensemble d’objets du meme type
instance: on dit qu’un objet est une instance de sa classe
15
Notion de classe en Java
Methodes: fonctions associees a une classe d’objets
Objet instance d’une classe
c l a s s Toto {i n t champ1 ; i n t champ2 ;i n t methode1 ( i n t par ame t re ) { . . . } }
Toto x = new Toto ( ) ; . . .
contient des champs de donnees et des methodes qui sont desfonctions s’appliquant sur tout objet de la classe:x.methode1(parametre) (en C, non oriente objet, onecrirait methode1(x,parametre))
16
Methodes
Qualificatifs
methodes static (pas dynamiques), ou methodes de classe,on ne peut faire que methode1(parametre) ouToto.methode1(parametre), pas de connaissance d’un objetx particulier, mais juste de la classe Toto
methodes public sont connues de tout le monde
methodes particulieres dites constructeurs (deja vues au cours3 etc.)
17
Petit historique de l”’oriente objet”
Simula 67 (base sur Algol 60)
Smalltalk 71/80
Objective C, C++ 83...
Beaucoup depuis...(Java, OCaml en particulier)
Exemple typique de programmation oriente objet: interfacesgraphiques (ex. QT4), ateliers graphiques de programmation(Google App Inventor, cf. http://appinventor.mit.edu/) etc.
Utilite principale
C’est essentiellement un style de programmation:
Permet de bien “cloisonner” le code, en unites coherentes, cf.diagrammes de classes et UML (Unified Modelling Language)
Permet de reutiliser du code, plus aisement (“composants”),par heritage en particulier (apres...)
18
Interlude...
Coupure pub?
Dans ce qui suit, demo d’un environnement graphique deprogrammation d’applications Android (smartphones)
Dans la grande tradition des langages graphiques,pedagogiques (Logo, Alice, Kodu etc.), ou non (Hypercard,Scade/Lustre, QT etc.)
Cet environnement permet de manipuler des classes d’objets:
graphiques (pour l’interface) comme des boutons, des zones detexte, des images etc.non-apparents: son, donnees GPS, connexions wifi/3G etc.
La creation d’objets se fait graphiquement, leursenregistrements peuvent etre modifies a l’interface
Pour chaque objet, on a une representation graphique desmethodes associees que l’on combine pour programmer...
(Rappel: Android base sur Linux, applications ecritesmajoritairement en Java - plus la dessus en INF 422)
19
Heritage (simple): interet important del’oriente objet!
Reutilisation de code
On a defini une classe Point et ses methodes:
c l a s s P o i n t {i n t x , y ; // c o o r d o n n e e st r a n s l a t i o n ( i n t u , i n t v ) {
x = x+u ; y = y+v ; } . . . }
On veut maintenant des points colores, au lieu de redefinir (agauche), on peut ecrire (a droite):
c l a s s C o l o r P o i n t {i n t x , y ; // c o o r d o n n e e si n t c o l ; // c o u l e u rt r a n s l a t i o n ( i n t u , i n t v ) {
x = x+u ; y = y+v ; } . . . }
c l a s s C o l o r P o i n textends P o i n t {
i n t c o l ; // c o u l e u r. . . }
21
Heritage
Declaration d’heritage
Par mot cle extends: class A extends B ... , A herite de B
Champs
Un ColorPoint cp aura des champs col (accessible parcp.col), mais aussi x et y (accessibles par cp.x et cp.y)
Methodes
translation s’applique implicitement sur un objet de laclasse ColorPoint en s’appliquant a sa “sous-partie”Point
Cela s’appelle l’heritage, et permet une economie et unestructuration du code meilleure (en Java et Caml, pas en C)Remarque: tous les objets Java heritent d’une classe unique:Object
22
Structuration par heritage simple
Diagramme de classe pour Point, ColorPoint
class Point
class ColorPoint
Autre exemple
class Shape
class Rectangle class Circle class Ellipse
23
Au dela de l’heritage simple?
Heritage multiple
pouvoir heriter du code de plusieurs classes
complique semantiquement!
existe en C++ pas en Java
forme degradee en Java, semantiquement raisonnable:heritage simple de code, multiple de signatures (interface) -fin du cours
24
Hierarchie de classes - retour sur Android...
Android (cf.http://developer.android.com/reference/packages.html)
java.lang.Object↪→ android.graphics.Paint
The Paint class holds the style and color information about how todraw geometries, text and bitmaps.Public Constructors
Pa in t ( )
Create a new paint with default settings.
Pa in t ( i n t f l a g s )
Create a new paint with the specified flags.
Pa in t ( Pa in t p a i n t )
Create a new paint, initialized with the attributes in the specifiedpaint parameter.
25
Hierarchie de classes - Android
Paint
Public Methods ...
i n t ge tCo l o r ( )
Return the paint’s color.
f l o a t ge tFon tMe t r i c s ( Pa in t . Fon tMet r i c s me t r i c s )
Return the font’s recommended interline spacing, given the Paint’ssettings for typeface, textSize, etc.
f l o a t ge tTex tS i z e ( )
Return the paint’s text size.
vo id s e tC o l o r ( i n t c o l o r )
Set the paint’s color....
26
Hierarchie de classe typique
Android...
java.lang.Object↪→ android.graphics.Paint
↪→ android.text.TextPaintClass OverviewTextPaint is an extension of Paint that leaves room for some extradata used during text measuring and drawing.SummaryInherited Constants
From c l a s s and ro i d . g r a p h i c s . Pa in t. . .
Fields
pub l i c i n t b a s e l i n e S h i f tpub l i c i n t bgCo lo rpub l i c f l o a t d e n s i t ypub l i c i n t [ ] d r awab l eS t a t epub l i c i n t l i n k C o l o r
27
TextPaint
Public Constructors
TextPa in t ( )TextPa in t ( i n t f l a g s )TextPa in t ( Pa in t p )
Public Methods
vo id s e t ( TextPa in t tp )
Copy the fields from tp into this TextPaint, including the fieldsinherited from Paint.Inherited Methods
From c l a s s and ro i d . g r a p h i c s . Pa in tFrom c l a s s j a v a . l ang . Object
28
Programmation orientee objet - deuxiemeresume
Vocabulaire
heritage: une classe peut etre une sous-classe d’une autre: lasous-classe l’etend en rajoutant des methodes et des attributs,elle accede aux attributs et aux methodes de sa sur-classe
polymorphisme (par sous-typage): un objet d’une sous-classeA de B en accedant aux methodes de B est considere du type B
(et A)
29
Mais aussi polymorphisme pour les methodes!
Polymorphisme des operateurs
Exemple: calcul garanti, par arithmetique rationnelle:
c l a s s Rat {i n t p , q ;Rat ( i n t x , i n t y ) { p=x ; q=y ; }Rat p l u s ( Rat y ) {
return new Rat ( t h i s . p∗y . q+t h i s . q∗y . p ,t h i s . q∗y . q ) ; }
void show ( ) {System . out . p r i n t l n ( p+”/ ”+q ) ; }
}
30
Exemple de redefinition d’arithmetique
Polymorphisme des operateurs
Exemple: calcul garanti, par arithmetique d’intervalles:
c l a s s D o u b l e i n t {double i n f , sup ;D o u b l e i n t ( double x , double y ) { i n f=x ; sup=y ; } ;D o u b l e i n t p l u s ( D o u b l e i n t y ) {
return new D o u b l e i n t ( t h i s . i n f+y . i n f ,t h i s . sup+y . sup ) ; }
void show ( ) {System . out . p r i n t l n ( ”[ ”+i n f+” , ”+sup+”] ” ) ; }
}
plus et show sont polymorphes: peuvent prendre des Rat ou desDoubleint! (pratique, on peut ne changer que la donnee et pas leprogramme...)
31
Exemple d’execution
Polymorphisme des operateurs
c l a s s Prog {pub l i c s t a t i c void main ( S t r i n g [ ] a r g s ) {
Rat r = new Rat ( 1 , 2 ) ;Rat s = new Rat ( 1 , 3 ) ;Rat t = r . p l u s ( s ) ; // = s . p l u s ( r ) ;D o u b l e i n t r i = new D o u b l e i n t ( 0 . 5 0 , 0 . 5 0 ) ;D o u b l e i n t s i = new D o u b l e i n t ( 0 . 3 3 , 0 . 3 4 ) ;D o u b l e i n t t i = r i . p l u s ( s i ) ; // = s i . p l u s ( r i ) ;t . show ( ) ;t i . show ( ) ;
}}
Donne:
5/6[0 .8300000000000001 ,0 .8400000000000001 ]
32
Traitement des erreurs...
Reprenons le code de pop():
void pop ( ) {t h i s . c = t h i s . c . t l ; }
Comment traiter le cas this.c == null?
void pop ( ) {i f ( t h i s . c != nu l l )t h i s . c = t h i s . c . t l ; }
Probleme: laisser this.c a null est trompeur... mais que faired’autre? renvoyer un code d’erreur? (int pop()): moche...
33
Exceptions
Le probleme des erreurs en informatique...
D’ailleurs que se passe t-il si l’on fait?:
P i l e p = empty ( ) ;p . pop ( ) ;
Excep t i on i n th r ead ”main ” j a v a . l ang . Nu l l P o i n t e r E x c e p t i o nat Prog . pop ( P i l e . j a v a : 1 6 )at Prog . main ( P i l e . j a v a : 2 3 )
Trait moderne des langages de programmation: les exceptions
34
Qu’est-ce qu’une exception?
Un essai de definition
C’est le resultat d’un comportement errone
Pas vraiment comme une erreur au sens classique du terme:c’est un objet traitable par le programme
Tout calcul peut lancer (“throw”) une exception, c.-a-d.retourner en plus d’une valeur, un type d’erreur, a sonappelant
Qui pourra la recuperer (“catch”) pour la traiter, ou la relancera son appelant etc.
A distinguer d’une erreur
Qui ne peut etre traitee
Qui arrete le programme dans un etat potentiellementincoherent
35
Une remarque en passant...
Concept absent du C
Il faut traiter les cas d’erreur de facon ad hoc...
Concept present dans les langages modernes
Caml, Java, Ada... Sauf qu’il faut traiter les exceptions, sinon...
36
Une remarque en passant...
Concept absent du C
Il faut traiter les cas d’erreur de facon ad hoc...
Concept present dans les langages modernes
Caml, Java, Ada... Sauf qu’il faut traiter les exceptions, sinon...
37
Exceptions en Java
Classes
Exception
avec pour sous-classes, IOException, RuntimeExceptionetc.
D’ou creation d’une nouvelle exception...
...par heritage:
c l a s s Monexcept ion extends E x c e p t i o n {. . .
}
Et instanciation par:
new Monexcept ion ( ) ;
38
Operations sur les exceptions
Declarer qu’une methode peut lancer une exception
void pop ( ) throws Monexcept ion {. . . }
dit que pop() ne renvoie rien comme donnee, mais peut lancer uneexception, rattrapable par l’environnement...
Lancer une exception
On ne doit pas faire return new Monexception();, mais plutotthrow new Monexception(); par exemple:
void pop ( ) throws Monexcept ion {i f ( t h i s . c == nu l l ) throw new Monexcept ion ( ) ;t h i s . c = t h i s . c . t l ; }
throw a une semantique un peu comme return, interrompt lecode...
39
Rattraper une exception
Code
t ry { p . pop ( ) ; }catch ( Monexcept ion e ) {
System . out . p r i n t l n ( ”P i l e v i d e ! ” ) ;. . . } . . .
Executions possibles:
Si p.c n’est pas null, alors p.pop() termine normalement,sans lever d’exception; le code se poursuit normalement au“...”
Si p.c est null, alors p.pop() lance une exception, qui estrattrapee par catch (Monexception e), e vaut alors l’objetde type Monexception cree par p.pop()
On peut lancer de nouveau cette exception a l’appelant del’appelant et ainsi de suite...
40
Les objets en (O)Caml
Principales differences avec Java
Enregistrements et objets sont les memes choses en Java
Enregistrements et objets sont differents en Caml (la partieoriente objet est une sur-couche, venue longtemps apres...)
Seules les methodes peuvent acceder aux champs en Caml(pas visible autrement) - correspond a private de Java (horsprogramme...)
Exemple Caml
c l a s s p i l e = ob j e c tv a l mutable c = ( [ ] : i n t l i s t )method g e t c ( ) = cmethod te s t empty ( ) = c=[]method push x = c<−x : : cmethod pop ( ) = c<−L i s t . t l cmethod top ( ) = L i s t . hd c
end
41
Interfaces
Qu’est-ce que c’est?
Ensemble de declaration de methodes sans implementation
Definies par le mot cle interface
Permettent de declarer des variables avec le type de l’interface,mais pas instanciable! (pas de constructeur en particulier)
Une classe peut implementer une ou plusieurs interfaces, parle mot cle implements
Permet de faire de l’heritage multiple en quelque sorte, maisseulement simple, de code
42
Exemple - quasi fonctionnel ;-)
Interface pour les fonctions de N dans Ni n t e r f a ce F u n c t i o n {
pub l i c i n t a p p l y ( i n t n ) ;}
Une seule methode a implementer pour etre une fonction de Ndans N: l’application!
43
Exemple - quasi fonctionnel ;-)
Des fonctions implementant cette interface
pub l i c c l a s s C a r r e implements F u n c t i o n {pub l i c i n t a p p l y ( i n t n ) {
return n∗n ; } }
pub l i c c l a s s Fact implements F u n c t i o n {pub l i c i n t a p p l y ( i n t n ) {
. . . return f a c t ; } }
pub l i c c l a s s Exemple {pub l i c s t a t i c void main ( S t r i n g [ ] a r g s ) {
C a r r e x = new C a r r e ( ) ; Fact y = new Fact ( ) ;System . out . p r i n t l n ( ”C a r r e (3)= ”+x . a p p l y ( ) ) ;System . out . p r i n t l n ( ”Fact (4)= ”+y . a p p l y ( ) ) ; }
44
A quoi servent les interfaces?
Une interface est la donnee d’une signature de methodes sansleur implementation. Exemple:
i n t e r f a ce F u n c t i o n {pub l i c i n t a p p l y ( i n t n ) ;
}
C’est un contrat (minimal, cf. cours 6 et 8) entre leprogrammeur et des utilisateurs eventuels
pub l i c c l a s s Toto implements F u n c t i o n {pub l i c i n t a p p l y ( i n t n ) {
// IMPLEMENTATION PROMISE}// AUTRES METHODES EVT . . . }
Il y aura une erreur a la compilation si les methodes promisesne sont pas implementees, avec le bon type!
45
Interet
Stylistique
Permet de separer les definitions “utiles a tous” ou“exportables” des implementations (comme les .h/.c en C)
46
Interet
Expressivite
On peut ecrire un code ne manipulant que des objets d’untype interface donne
N’utilisant une implementation donnee que choisiedynamiquement, par transtypage:
pub l i c c l a s s pow2n implements Funct i on {pub l i c i n t app l y ( i n t n ) {
i n t r e s =1;f o r ( i n t i =0; i<n ; i++) r e s=2∗ r e s ;r e t u r n r e s ; } }
pub l i c c l a s s bet te rpow2n implements Funct i on {pub l i c i n t app l y ( i n t n ) { // suppose n>2
i n t k=1; i n t r e s =2;wh i l e ( k < n−1) {
r e s = r e s∗ r e s ;k = 2∗k
} . . . r e t u r n r e s ; } }
pub l i c c l a s s Exemple {pub l i c s t a t i c vo id main ( S t r i n g [ ] a r g s ) {
Funct i on x = ( Funct i on ) new pow2n ( ) ; // cho i x pow2n/ bet te rpow2n. . . x . app l y ( y ) . . . ;. . .
47
Interet
Pour aller plus loin
Permet de “simuler” l’heritage multiple, tout en ayant unheritage simple de code
Tres utile par exemple pour les threads JAVA, RMI etc. (coursINF431/INF 560)
Exemple: interface Runnable etc.
pub l i c c l a s s Example extends MaClasseimplements Runnable {
pub l i c void run ( ) {// FAIRE QQCHOSE
}
pub l i c s t a t i c void main ( S t r i n g [ ] a r g s ) {Example ex = new Example ( ) ;Thread t = new Thread ( ex ) ;t . s t a r t ( ) ; } }
48
Heritage et typage
Relation de sous-typage
On note T ← S si S est un sous-type de T , defini par:
T ← T
si la classe S est une sous-classe de T , on a T ← S
si l’interface S est une sous-interface de I , on a I ← S ;
si la classe C implemente l’interface I , on a I ← C
si T ← S , alors T []← S []
si S ← SS et T ← S , alors T ← SS
Propriete fondamentale
Si T ← S , alors toute valeur du type S peut etre utilisee en lieu etplace d’une valeur de type T (transtypage implicite)
49
Transtypage?
Implicite
Si S sous-type de T , on peut faire le transtypage (cast) implicite:
S x = new S ( . . . ) ;T y = x ;
50
Transtypage
Dans l’autre sens?
Interdit! (meme quand finalement assez similaires...)
c l a s s X { f l o a t n ; }c l a s s Y extends X {
pub l i c s t a t i c void main ( S t r i n g [ ] a r g s ) {X x = new X ( ) ;Y y = x ; } }
A la compilation on obtient une erreur:
j a v a c Y . j a v aY . j a v a : 5 : i n c ompa t i b l e t yp e sfound : Xr e q u i r e d : Y
Y y = x ; }ˆ
1 e r r o r
51
Transtypage explicite
Il faut faire un transtypage (cast) explicite:
c l a s s X { f l o a t n ; }c l a s s Y1 extends X {
pub l i c s t a t i c void main ( S t r i n g [ ] a r g s ) {X x = new X ( ) ;Y1 y = (Y1) x ; } }
A la compilation tout se passe bien...mais le bon comportementdans ce cadre depend entierement de l’utilisateur (6= typage fort ala CAML, cf. cours 9)
En C
Le cast est d’emploi tres courant, par exemple a l’allocation (cf.cours 2, listes...):
L i s t r e s = ( L i s t ) ma l l o c ( s i z e o f ( s t r u c t s t L i s t ) ) ;
car malloc renvoie le type fourre-tout void *...
52
Classes abstraites
Qu’est-ce que c’est?
Sorte d’intermediaire entre interfaces et classes (ditesconcretes)
Permettent de definir des variables avec le type correspondantet permettent l’heritage (comme les classes concretes)
Permettent de specifier des methodes abstraites avec l’attributabstract, qui sont des specifications de methodes, mais pasleur implementation; pas de new possible (comme lesinterfaces);
On peut melanger des definitions de methodes concretes(implementees) et des methodes abstraites (different desinterfaces)
Une sous-classe d’une classe abstraite n’implementant pastoutes les methodes abstraites d’une classe abstraite doiventetre declarees abstract
53
Retour sur les types somme
Expressions arithmetiques:
expr = Var | Cste | expr + expr | expr ∗ expr | −expr
c l a s s Expr {i n t s e l e c t ;i n t Cste ;S t r i n g Var ;Typop Op ;Expr gauche ;Expr d r o i t e ; . . . }
enum Typop {p l u s , minus , t i m e s }
on inclut tout dans le type produit... (R + R ⊆ R× R, egalitedans les espaces vectoriels...)
54
Mais “propre” avec les constructeurs
Du coup
On utilise select: si 0, l’expression est une constante (champCste), si 1, l’expression est une variable (champ Var), si 2,l’expression est un operateur binaire (Op est plus ou times)et les sous-expressions sont gauche et droite, ou l’expressionest unaire (Op est minus) et gauche est la sous-expression
il est alors commode de definir plusieurs constructeurs selonles cas (qui “imitent” les injections dans le type somme):
Expr ( i n t c o n s t a n t e ) {s e l e c t = 0 ; Cste = c o n s t a n t e ; }
Expr ( S t r i n g v a r i a b l e ) {s e l e c t = 1 ; Var = v a r i a b l e ; }
Expr ( Typop o p e r a t e u r , Expr a r g l , Expr a r g r ) {s e l e c t =2; Op=o p e r a t e u r ; gauche=a r g l ; d r o i t e=a r g r ;}Expr ( Expr a rg ) {
s e l e c t = 2 ; Op = minus ; gauche = arg ; }
55
Exemple
Une expression: 2 ∗ x + 1 est representee comme:
Expr e1 = new Expr ( 1 ) ;Expr e2 = new Expr ( 2 ) ;Expr e3 = new Expr ( ”x ” ) ;Expr e4 = new Expr ( t imes , e2 , e3 ) ;Expr e5 = new Expr ( p l u s , e4 , e1 ) ;
+
×
2 x
1
56
Exemple (Denis Monasse)
Retour sur les types somme...
abstract c l a s s C a r t e {pub l i c s t a t i c f i n a l i n t PIQUE = 0 ,
COEUR = 1 , CARREAU = 3 , TREFLE = 4 ;i n t c o u l e u r ;
abstract i n t v a l e u r ( i n t c o u l e u r a t o u t ) ; }
c l a s s As extends C a r t e {i n t v a l e u r ( i n t c o u l e u r a t o u t ) { return 1 1 ; }
c l a s s V a l e t extends C a r t e {i n t v a l e u r ( i n t c o u l e u r a t o u t ) {
i f ( c o u l e u r==c o u l e u r a t o u t ) return 2 0 ;e l s e return 1 ; }
. . .
De meme, vous pourriez reprendre les expressions arithmetiques...57
Paquetages et collections
Permet d’organiser un ensemble de classes et d’interfaces enun tout coherent (sorte de module a la CAML)
Limite en particulier la portee des identificateurs
Un paquetage peut avoir un nom, et des sous-paquetages (unearborescence, comme des repertoires UNIX...)
Exemple
L’API standard de JAVA est organisee en paquetage etsous-paquetages!
Paquetage java qui contient comme sous-paquetagesjava.lang, java.io, java.util etc.
58
Paquetages
CLASSPATH
Java cherche les .class (bytecode Java correspondant a lacompilation de .java) dans les repertoires listes dans lavariable d’environnement CLASSPATH
Chez moi:
> echo $CLASSPATH. : / U s e r s / E r i c / Cours /X/ INF321
. est le repertoire courant et INF321 est le repertoire ou jeprogramme
Autre solution, indiquer le CLASSPATH a lacompilation/execution:
> j a v a c −cp CHEMIN t o t o . j a v a> j a v a −cp CHEMIN t o t o
59
Paquetages
Le nom d’un paquetage et de sous paquetagespaquet.souspaquet.soussouspaquet... doit refleter uneorganisation en repertoires, sous-repertoires etc.
A partir du CLASSPATH, on doit trouver ces repertoires:
> l s / U s e r s / E r i c / Cours /X/ INF321. . .paquet /. . .> l s / U s e r s / E r i c / Cours /X/ INF321 / paquets o u s p a q u e t /. . .
60
Paquetages
Definir un paquetage
Dans le repertoire/Users/Eric/Cours/X/INF321/essaipackage:
package e s s a i p a c k a g e ;
pub l i c c l a s s A {pub l i c i n t methodeA ( ) {
return 0 ;}
}
package e s s a i p a c k a g e ;
pub l i c c l a s s B {pub l i c i n t methodeB ( ) {
return 1 ;}
}61
Paquetages
Compilation
Remarquez bien: une seule classe public dans un fichier JAVA, dumeme nom que le fichier le contenant
> cd / U s e r s / E r i c / Cours /X/ INF321> j a v a c e s s a i p a c k a g e /∗ . j a v a
62
Utilisation de classes d’un paquetage
Sous /Users/Eric/Cours/X/INF321:
pub l i c c l a s s e s s a i {pub l i c s t a t i c void main ( S t r i n g [ ] a r g s ) {
System . out . p r i n t l n (new e s s a i p a c k a g e . A ( ) . methodeA ( ) ) ;System . out . p r i n t l n (new e s s a i p a c k a g e . B ( ) . methodeB ( ) ) ;
}}
Compilation et execution
> j a v a c e s s a i . j a v a> j a v a e s s a i01
63
Paquetages
Importer un paquetage
import e s s a i p a c k a g e .A ;import e s s a i p a c k a g e .B ;
pub l i c c l a s s e s s a i 2 {pub l i c s t a t i c vo id main ( S t r i n g [ ] a r g s ) {
System . out . p r i n t l n (new A( ) . methodeA ( ) ) ;System . out . p r i n t l n (new B( ) . methodeB ( ) ) ;
}}
On peut importer toutes les fonctions d’un paquetage (maispas recursivement dans les sous-paquetages):
import j a v a . i o . ∗ ;
Remarques: java.lang est toujours importeautomatiquement - toutes les classes definies jusqu’a presentetaient dans le paquetage anonyme!
Possibilite de compresser (archiver) un paquetage: .jar (unpeu similaire a des .zip)
64
Collections
Collections
Pour aller plus loin, les collections, qui permettent de representerdivers types d’elements d’objets JAVA...
65
C’est tout pour aujourd’hui..
La prochaine fois
Les fonctions recursives (programmation)
Les fonctions recursives primitives et partielles (theorie de lacalculabilite)
Bon TD!
66
C’est tout pour aujourd’hui..
La prochaine fois
Les fonctions recursives (programmation)
Les fonctions recursives primitives et partielles (theorie de lacalculabilite)
Bon TD!
67