INF 321 Classes, Objets, Exceptions · Plus g en eralement, les champs static sont communs a tous...

Post on 18-May-2020

1 views 0 download

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

Demo Google App Inventor (merci a youtube)

Ma video

20

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