Notes de cours INFO803, M1-IDESSE et M1-MATH-IM

January 31, 2018 | Author: Anonymous | Category: Ingénierie, Informatique, Python Programming
Share Embed Donate


Short Description

Download Notes de cours INFO803, M1-IDESSE et M1-MATH-IM...

Description

Notes de cours INFO803, M1-IDESSE et M1-MATH-IM Conception et Programmation orient´ee objet en Python Jacques-Olivier Lachaud LAMA, Universit´e de Savoie version du 9 f´evrier 2010

Table des mati` eres 1 Introduction ` a l’approche objet

1

1.1

Vision fonctionnelle et vision objet . . . . . . . . . . . . . . . . .

1

1.2

La pertinence de l’approche objet pour l’abstraction . . . . . . .

2

1.3

De l’analyse `a l’int´egration

. . . . . . . . . . . . . . . . . . . . .

5

1.4

Langage adapt´ee `a l’analyse/conception : UML . . . . . . . . . .

6

1.5

Langage de programmation objet : Python

6

. . . . . . . . . . . .

2 G´ en´ eralit´ es sur le paradigme objet

7

2.1

Objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

7

2.2

Vues : conceptuelle, sp´ecification, impl´ementation . . . . . . . . .

8

2.3

Messages

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

8

2.4

Classes ; instance . . . . . . . . . . . . . . . . . . . . . . . . . . .

8

2.5

Attributs d’une classe . . . . . . . . . . . . . . . . . . . . . . . .

9

2.6

M´ethodes ; Op´erations . . . . . . . . . . . . . . . . . . . . . . . .

9

2.7

Relations entre objets et entre classes . . . . . . . . . . . . . . .

10

2.8

Liens entre objets . . . . . . . . . . . . . . . . . . . . . . . . . . .

10

2.9

Associations entre classes . . . . . . . . . . . . . . . . . . . . . .

11

2.10 Multiplicit´es d’une association . . . . . . . . . . . . . . . . . . . .

12

2.11 G´en´eralisation, polymorphisme . . . . . . . . . . . . . . . . . . .

13

1

3 Concepts avanc´ es sur les associations

17

3.1

Agr´egation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

17

3.2

Composition

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

19

3.3

Association qualifi´ee . . . . . . . . . . . . . . . . . . . . . . . . .

20

3.4

Classe association . . . . . . . . . . . . . . . . . . . . . . . . . . .

20

3.5

Contraintes sur les associations . . . . . . . . . . . . . . . . . . .

21

4 Introduction au langage Python

22

4.1

Collections en Python . . . . . . . . . . . . . . . . . . . . . . . .

22

4.2

TODO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

29

5 Introduction au langage JAVA

29

5.1

Compilation et ex´ecution d’un programme JAVA . . . . . . . . .

30

5.2

D´ecoupage d’un programme JAVA . . . . . . . . . . . . . . . . .

30

5.3

Types primitifs . . . . . . . . . . . . . . . . . . . . . . . . . . . .

31

5.4

Autres types . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

31

5.5

Tableau d’´el´ements du mˆeme type primitif . . . . . . . . . . . . .

32

5.6

Regroupements `a l’aide d’une Classe . . . . . . . . . . . . . . . .

32

5.7

Objets et variables objet . . . . . . . . . . . . . . . . . . . . . . .

34

5.8

Constructeurs d’une classe . . . . . . . . . . . . . . . . . . . . . .

35

5.9

Associations en JAVA . . . . . . . . . . . . . . . . . . . . . . . .

35

5.10 Interfaces, classes abstraites . . . . . . . . . . . . . . . . . . . . .

37

5.11 G´en´eralisation, sp´ecialisation, h´eritage . . . . . . . . . . . . . . .

38

5.12 Polymorphisme . . . . . . . . . . . . . . . . . . . . . . . . . . . .

38

6 Aper¸ cu de la biblioth` eque JAVA

2

38

Introduction Ce document trace les grandes lignes d’un cours de niveau interm´ediaire portant sur la conception par objets et la programmation orient´ee objet. Le langage objet choisi est le Python. Le langage de mod´elisation objet est UML. Ce cours s’adresse `a des ´etudiants ayant des comp´etences en programmation imp´erative, mais d´ebutant en programmation objet. L’objectif est de connaˆıtre les principes g´en´eraux de l’approche objet (classes, h´eritage, associations, polymorphisme) et de savoir les mettre en œuvre. Pour la notation UML, on se r´ef´erera au site uml.free.fr. Il existe un nombre impressionnant de livres sur la programmation objet en Python. On pourra ainsi regarder le site de (www.python.org) qui contient des tutoriels Python int´eressants. La lecture de ce document n’est pas forc´ement lin´eaire. Notamment, il peut ˆetre utile de lire en parall`ele l’introduction au langage Python.

1

Introduction ` a l’approche objet

1.1

Vision fonctionnelle et vision objet

Dans la vision fonctionnelle, on s´epare les donn´ees des op´erations que l’on effectue dessus. Le processus de conception naturel est donc d’identifier les donn´ees manipul´ees, pr´evoir des structures de donn´ees adapt´ees, puis ´ecrire des fonctions qui vont prendre une partie de ces donn´ees en entr´ees et fabriquer des nouvelles donn´ees en sortie. On parle d’approche syst´emique. Cette vision est bien adapt´ee `a certaines situations. Les bases de donn´ees classiques et la m´ethode MERISE fonctionnent ainsi sur ce principe. Cela peut ˆetre aussi adapt´e `a certains probl`emes de calcul scientifiques, o` u les donn´ees en entr´ee et en sortie sont clairement identifi´es. En revanche, cette approche devient d´elicate lorsqu’il s’agit de mod´eliser et/ou de simuler des processus plus complexes, avec des donn´ees d’origine vari´ee, qui ne se pr´esentent pas toujours sous la forme. L’approche syst´emique est alors handicap´ee, car elle cherche `a anticiper pr´ecis´ement les donn´ees qu’elle manipule. On voit aussi que cette vision implique souvent une analyse ascendante de la probl´ematique, o` u le concepteur/programmmeur se pose d’abord la question de comment il va stocker ses donn´ees. Dans la vision objet, on regroupe les donn´ees et les op´erations qui sont propres `a ces donn´ees. Pour r´esoudre un probl`eme donn´e, on fait collaborer entre eux des objets qui vont communiquer entre eux pour r´esoudre le probl`eme. On parle de message passing. De fait, on s’int´eresse plus aux services/messages que rendent/comprennent chaque objet qu’`a comment les donn´ees sont repr´esent´ees au sein de l’objet. On dispose de plus de moyens pour regrouper des objets entre eux, de fa¸con durable ou non. Normalement chaque objet est responsable de ses donn´ees, et un objet ex1

terne n’a pas `a les toucher directement. On parle d’encapsulation. Cela fournit une s´ecurit´e suppl´ementaire et permet de d´ecomposer un probl`eme complexe en sous-probl`emes ind´ependants. Une fois qu’un objet est bien valid´e, son fonctionnement est donc garanti dans l’ensemble du syst`eme, aucun autre endroit du programme ne pouvant modifier son comportement. L’approche objet a ´et´e propos´ee pour pouvoir d´evelopper des programmes `a plus grandes ´echelles, programmes que l’on pouvait ensuite d´ecomposer plus facilement en sous-probl`emes. L’approche objet, qui ne consid`ere que les op´erations que peut faire un objet, permet aussi de voir de la mˆeme mani`ere des objets avec des sp´ecificit´es distinctes, mais quelques services communs. Une autre caract´eristique de l’approche objet est de pouvoir d´efinir et manipuler des abstractions, ce qui facilite notamment la conception des programmes. Le polymorphisme permet ensuite d’utiliser des r´ealisations concr`etes et sp´ecifiques des abstractions. En informatique, le polymorphisme est l’id´ee d’autoriser le mˆeme code `a ˆetre utilis´e avec diff´erents types, ce qui permet des impl´ementations plus abstraites et g´en´erales. Exemples : L’approche objet est particuli`erement efficace pour faire des IHM. On voit bien qu’une IHM doit faire coexister des composants bien diff´erents (fenˆetres, dessins, boutons, champs de texte ou de saisie, zones de dessins, tableaux) tout en assurant une mise en page coh´erente. Mieux, les derni`eres IHM permettent d’int´egrer ` a la vol´ee des composants nouveaux (a priori inconnus) mais qui savent r´epondre ` a quelques messages. Par exemple, Acrobat Reader peut s’ouvrir dans une fenˆetre firefox. Les sc`enes 3D sont des arbres d’objets. On peut mod´eliser une fonction ` a l’aide d’un objet. On peut par exemple mod´eliser un polynˆ ome sur n’importe quel corps tr`es facilement en programmation objet.

1.2

La pertinence de l’approche objet pour l’abstraction

Quelques exemples pour montrer le processus de r´esolution d’un probl`eme dans une approche objet par rapport `a une approche imp´erative.

2

Quelques questions : 1. Comment mod´eliser une forme dans une approche imp´erative ? La question est difficile, car trop floue. On ne voit pas quelle structure de donn´ees va convenir ` a toutes les formes possibles. 2. Comment mod´eliser une forme dans une approche objet ? C’est plus facile, car on se pose simplement la question : que sait faire une forme ? quelles demandes on va lui faire ? En d’autres termes, ` a quels messages l’objet sait-il r´epondre ? Par exemple, une forme doit pouvoir donner son aire, son p´erim`etre, son centre de gravit´e, ses moments, est-ce qu’un point est ` a l’int´erieur de la forme ou sur le bord ou ` a l’ext´erieur, etc. 3. Dans l’approche objet, ce n’est qu’apr`es qu’on se pose la question de comment ´ecrire ces fonctionnalit´es. D’ailleurs, l’approche objet permet de facilement d´ecouper le travail en sp´ecialisant les formes. On aura donc un type Forme, et plein de sous-types qui r´ealisent des formes particuli`eres : le carr´e, le disque, le rectangle, l’ellipse, le polygone, la courbe radiale, etc. 4. On aura donc des types abstraits (e.g. Forme) et des types concrets (e.g. Carre), et des relations de sous-typage. Tout type Python indique les messages auxquels il sait r´epondre : ce sont les fonctions ou m´ethodes associ´ees au type. 5. On peut se poser la mˆeme question pour mod´eliser un animal, une fonction math´ematique, une mol´ecule chimique, une variable statistique, etc.

3

Quelques questions : 1. On dispose dans un carr´e de cˆ ot´e 1, un ensemble de N carr´es de cˆ ot´es h < 1 deux ` a deux disjoints. Probl`eme : quelle est la probabilit´e pour qu’un clic ` a des coordonn´ees al´eatoires soit dans une des formes ? 2. Si maintenant les carr´es n’ont pas tous le mˆeme cˆ ot´e. Solution algorithmique ? 3. Si maintenant on a des carr´es ou des rectangles ? 4. Si maintenant on peut avoir aussi des cercles ou des ellipses ? On se donne une fonction aire sp´ecialis´ee pour chaque cas et l’approche objet est alors naturelle. class Forme: def Aire(): pass class Carre( Forme ): def __init( self, cote ): self._cote = cote def Aire(): return self._cote * self._cote class Cercle( Forme ): def __init( self, rayon ): self._rayon = rayon def Aire(): return math.pi * self._rayon * self._rayon

Quelques questions : 1. Comment mod´eliser un vaisseau spatial dans une approche imp´erative ? Difficile. Sera en plus sp´ecifique ` a chaque vaisseau. 2. Comment mod´eliser un vaisseau spatial dans une approche objet ? On peut commencer par pr´eciser les objets qui vont interagir : capitaine, navigateur, chef des transmissions, pilote, m´ecanicien, etc. Puis on peut pr´eciser les messages auxquels ils savent r´epondre et les objets avec lesquels ils peuvent interagir. Le capitaine connait tout l’´equipage et sait communiquer avec eux. Le navigateur sait calculer une trajectoire pour un objectif donn´e avec l’ordinateur de bord. Le pilote sait diriger le vaisseau vers un objectif. Le m´ecanicien sait surveiller et r´eparer le moteur... Repr´esenter tous ces objets ainsi qu’une s´equence de communication suivi par une d´ecision du capitaine d’aller vers une plan`ete.

4

Quelques questions : 1. Comment mod´eliser un point dans le plan dans une approche imp´erative ? Mˆeme question pour un nombre complexe ? Que constatez-vous ? Ce sont les mˆemes donn´ees. On pourrait choisir le mˆeme type. 2. Comment mod´eliser un point dans le plan dans une approche objet ? Mˆeme question pour un vecteur ` a deux composantes ? Si on raisonne en termes d’op´erations (ie de messages), ce ne sont pas les mˆemes objets, donc on cr´eera deux classes diff´erentes.

1.3

De l’analyse ` a l’int´ egration

Dans tout processus d’informatisation, il est important de distinguer plusieurs ´etapes (qui ne sont pas forc´ement r´ealis´ees les unes apr`es les autres). Nous en mettons en valeur quelques unes : Analyse (Fait par l’analyste). Il doit comprendre le besoin du client et le traduire sous forme de sp´ecifications. Parfois il est aussi responsable du cahier des charges, qui est un document pr´ecisant l’attente du client, et qui est le document contractuel. Il doit comprendre le “Pourquoi” ou le “quoi” du projet. On parle souvent d’analyse fonctionnelle, car il identifie les fonctionnalit´es attendues. Souvent, il est charg´e du chiffrage, en collaboration avec le concepteur. Conception (Fait par le concepteur, ou architecte/concepteur dans des gros projets). Son rˆ ole est de pr´eciser comment r´ealiser une solution informatique au probl`eme pos´e, `a partir des sp´ecifications de l’analyste. Il doit par exemple proposer un ensemble de syst`emes, programmes, soussyst`emes, sous-programmes et leur organisation, de mani`ere `a montrer un enchaˆınement global qui r´epondra au probl`eme pos´e. Il doit aussi penser `a la maintenance future de son programme, et l’anticiper dans sa conception. Charg´e du “Comment”. D´ eveloppement/programmation (Fait par le d´eveloppeur/programmeur) Il traduit les directives de conception dans un langage/syst`eme donn´e, avec ses sp´ecificit´es propres. Il doit veiller `a respecter `a la fois la structure mais aussi les comportements et s´emantiques des sp´ecifications. Il sait aussi r´eutiliser des codes existants. Charg´e de la “Fabrication”. Test (Fait par le testeur) Il est charg´e de valider le programme d´evelopp´e, notamment en v´erifiant que les sp´ecifications initiales du cahier des charges sont respect´ees. D´ eploiement/int´ egration (Fait par l’int´egrateur) Il installe l’application d´evelopp´ee dans son contexte client et v´erifie son int´egration. Eventuellement, il param`etre le logiciel en fonction de l’environnement. Remarque : la plupart des ´etudes sur le cycle de vie d’un logiciel montre que plus de 70% des coˆ uts proviennent des deux derni`eres phases. Il est donc important de bien les anticiper dans les phases pr´eparatoires. 5

1.4

Langage adapt´ ee ` a l’analyse/conception : UML

[Wikip´edia] UML (en anglais Unified Modeling Language, « langage de mod´elisation unifi´e ») est un langage graphique de mod´elisation des donn´ees et des traitements. C’est une formalisation tr`es aboutie et non-propri´etaire de la mod´elisation objet utilis´ee en g´enie logiciel. L’OMG travaille actuellement sur la version UML 2.1. Il est l’accomplissement de la fusion des pr´ec´edents langages de mod´elisation objet Booch, OMT, OOSE. Principalement issu des travaux de Grady Booch, James Rumbaugh et Ivar Jacobson. UML est un standard d´efini par l’OMG (Object Management Group). Il ne s’agit que d’une notation, mais UML fournit un langage commun assez clair pour mod´eliser efficacement l’analyse et la conception objet.

1.5

Langage de programmation objet : Python

[Wikip´edia] Python est un langage de programmation interpr´et´e multi-paradigme. Il favorise la programmation imp´erative structur´ee, et orient´ee objet. Il est dot´e d’un typage dynamique fort, d’une gestion automatique de la m´emoire par ramasse-miettes et d’un syst`eme de gestion d’exceptions ; il est ainsi similaire `a Perl, Ruby, Scheme, Smalltalk et Tcl. Python est un langage d’assez haut niveau, contrairement `a C ou C++. Il fournit en interne des structures de donn´ees tr`es puissantes et tr`es faciles `a composer. Comme il n’impose que tr`es peu de d´eclarations, il autorise du d´eveloppement tr`es rapide. Son cˆot´e interpr´et´e le rend tr`es pratique comme langage script cross-plateforme. Il est donc tr`es utilis´e pour les applications webs. N´eanmoins, on constate g´en´eralement une perte de performance (de l’ordre de 10 `a 20 contre 1 par rapport au C selon des benchmarks). Voil`a ci-dessous un premier exemple de code Python (fichier first.py). # Premier code Python print( ’Hello world !’ )

On peut soit choisir d’utiliser un environnement de d´eveloppement int´egr´e (par exemple idle), soit choisir son ´editeur de textes et utiliser les commandes en-ligne : Ex´ ecution. On utilise la commande python. # Sous un shell, ex´ ecute le fichier first.py python first.py ’Hello world !

6

2

G´ en´ eralit´ es sur le paradigme objet

2.1

Objets

UML est une notation et d´efinit des ´el´ements de mod´elisation (notamment graphiques), leurs relations et leurs utilisations pour repr´esenter symboliquement une abstraction d’un probl`eme donn´e et de la solution de mod´elisation retenue. Objet : entit´e/unit´e ayant une identit´e et une fronti`ere bien d´elimit´ee, poss´edant des donn´ees (les attributs) et offrant des services (les m´ethodes ou op´erations). La notion d’identit´e est fondamentale : 2 objets sont toujours distincts. Dans l’approche objet, un objet peut repr´esenter une entit´e r´eelle (e.g. un livre dans une BD d’un SI biblioth`eque, un appartement dans un SI de gestion immobili`ere, un salari´e dans une entreprise, une facture), une entit´e conceptuelle (e.g. une date, une transaction bancaire, un calcul ou une ´equation), une entit´e informatique (une structure de donn´ees, un ´el´ement d’interface graphique). Exemple : Henri Martin, client de la banque SG a une carte bancaire 1234.5678. Il va retirer de l’argent au GAB SG du cours Gambetta. Celui-ci v´erifie avec le SI de la SG que la carte correspond ` a un compte de la SG. Dessinez les objets participant ` a ce cas d’utilisation. Henri Martin : ClientCB carte 1234.5678

: GAB SG cours Gambetta

: SI SG Comptes

Quelques remarques : – l’´etat d’un objet est la valeur de ses attributs. – Deux objets dans le mˆeme ´etat sont appel´es des clones. En aucun cas, il ne d´esigne le mˆeme objet. Il y a juste co¨ıncidence de valeurs. – Un objet est toujours une entit´e concr`ete (et ne peut ˆetre la r´ealisation d’une classe abstraite, cf. plus loin). – Un objet a une dur´ee de vie. Il nait au moment de sa cr´eation ou instanciation et disparait `a sa destruction. Une classe est un regroupement d’objets ayant des propri´et´es communes (mˆemes m´ethodes, mˆemes types et d´enominations des attributs, mais pas forc´ement les mˆemes valeurs). Exemples : – Les biblioth`eques en France fournissent ` a peu pr`es toutes les mˆemes services : fond documentaire, abonnement, consultation, prˆet, emprunt, achats. Chaque biblioth`eque sp´ecifique (exemple : celle de Chamb´ery) est un objet. On peut voir le d´enominateur commun aux biblioth`eques comme une classe, qui offre ces services, mais dont le fond documentaire, les employ´es et les usagers varient. – Identifiez les types de documents dans une biblioth`eque. Cherchez ` a voir ce qui est commun de ce qui est diff´erent. En d´eduire des classes.

7

2.2

Vues : conceptuelle, sp´ ecification, impl´ ementation

Lorsque l’on fait de la mod´elisation objet, il faut choisir un niveau de repr´esentation qui d´eterminera souvent ce que sont les objets. Il y a ainsi 3 points de vue sur un syst`eme : – le point de vue conceptuel : mod´elisation du r´eel, du domaine, du m´etier. Utile au moment de l’analyse. – le point de vue sp´ecification : niveau logiciel mais seulement interfaces et relations, sans penser au codage r´eel. Utile au moment de la conception. – le point de vue impl´ementation : niveau logiciel, repr´esente ce qui est effectivement cod´e (e.g. les classes utilis´ees pour impl´ementer les collections sont donn´ees). Utile au niveau codage. Il ne faut pas m´elanger les vues, et les faire dans l’ordre (sauf pour du reverseengineering). L’int´erˆet de l’approche objet est de montrer que ces niveaux de repr´esentation diff´erents fonctionnent de la mˆeme fa¸con. Il est par exemple extrˆemement fr´equent de plus de retrouver les objets identifi´es au niveau m´etier comme des objets persistents du niveau implantation. En g´en´eral, on a de plus en plus d’objets en descendant dans les niveaux.

2.3

Messages

Les objets communiquent entre eux en s’´echangeant des messages. C’est le principe du message passing. Un message se caract´erise par un nom ainsi que par ses pi`eces jointes ou param`etres : on parle de signature du message. La liste des messages auxquels peut r´epondre un objet d´efinit son type. A chaque message que peut comprendre un objet est associ´e en g´en´eral une action. Un message se symbolise par une fl`eche surmont´ee du nom du message. Le message peut ˆetre synchrone ou un simple appel de fonction (il est bloquant), ou asynchrone (non bloquant). Quelques questions : Quel est le type d’une chaˆıne de caract`eres ? I.e. que souhaitez-vous pouvoir faire avec une chaˆıne de caract`eres.

2.4

Classes ; instance

Classe : abstraction d’objets ayant des propri´et´es similaires mais des attributs pouvant varier. En d’autres termes, une classe permet de repr´esenter dans son ensemble un regroupement d’objets de mˆeme type ou de types similaires. En Python, une classe est d´efinie par le mot-cl´e class. Il n’est nul besoin de pr´evoir les attributs `a stocker. C’est juste en faisant des affectations dans l’objet (self.attr = ...) que l’on cr´ee `a la vol´ee des attributs. En revanche, on peut sp´ecifier des m´ethodes `a l’aide de la commande def. Chaque objet pourra ensuite avoir des valeurs distinctes pour ses attributs, mais leurs noms, nombres et types sont fix´es. Python suit donc donc une d´efinition tr`es g´en´erale 8

d’“objet”, o` u c’est `a la demande (`a l’ex´ecution) que l’on v´erifiera si l’objet a tel attribut ou telle m´ethode. Ainsi, on peut par exemple ajouter des m´ethodes `a un objet au cours de sa dur´ee de vie. Une instance de classe est une r´ealisation concr`ete d’une classe ; Un objet est donc une instance de sa classe qui le repr´esente. Exemple : Code d’une classe Point. Puis p1 = Point( 5, 0 ) ; p2 = Point( 10, 4 ) ;. p1 et p2 sont des variables qui pointent vers des instances de classe Point. Ils ont les mˆemes propri´et´es (i.e. ont les mˆemes m´ethodes), des attributs de mˆeme type mais de valeurs diff´erentes.

En Python, pour d´efinir des objets, il faut n´ecessairement d´efinir une classe qui correspond.

2.5

Attributs d’une classe

Les attributs sont caract´eristiques de toutes les instances de la classe, mˆeme s’ils peuvent prendre des valeurs diff´erentes. Attribut et association sont deux notions proches. – Nommage et typage des attributs – Modifications de visibilit´e : public (+), prot´eg´e (#), priv´e (-) (d´efaut : priv´e) – ´etat d’un objet non Utilisation de notes pour contraindre les attributs non Notion d’attribut d´eriv´e (d´ej`a vu en Merise), not´e “/” Exemple : Sp´ecification de Point. Sp´ecification de Complexe. Identiques ? Oui au niveau des attributs. Exemple : Exemple d’attribut d´eriv´e : Personne

{ age = date actuelle − date de naissance }

2.6

Nom Date de naissance / Age

M´ ethodes ; Op´ erations

Les m´ethodes ou op´erations sont les messages auxquels savent r´epondre tous les objets de cette classe, en d’autres termes les processus que tout objet de la classe sait mener `a bien. Pour raccourcir, on dira souvent les m´ethodes ou messages que la classe sait mener `a bien. – Repr´esentation des op´erations : nom, param`etres, typage du retour – Modifications de visibilit´e : public, prot´eg´e, priv´e (d´efaut : public)

9

Exemple : Un Point peut ˆetre construit ` a partir de deux coordonn´ees. Il sait calculer sa distance ` a un autre point. Point - x : r´ eel - y : r´ eel +Point( x0 : r´ eel, y0 : r´ eel) +distance(p : Point) : r´ eel

Sp´ecification des m´ethodes de Complexe. Identique `a Point ? Non au niveau des op´erations. On mod´elise donc les points et les complexes dans des classes diff´erentes. On verra une autre solution avec les liens/associations plus tard. Quelques questions : Mod´elisez un polygone.

Remarque : ce n’est pas parce qu’un attribut ou une op´eration ne sont pas repr´esent´es qu’ils n’existent pas ! Le diagramme n’est qu’une vue, ´eventuellement partielle, de la classe. Voil`a un exemple Python montrant comment instancier des objets dont les classes sont d´ej`a d´efinis dans les biblioth`eques d’IHM. from Tkinter import * # Cree une fen^ etre fen1 = Tk() # lui ajoute un texte rouge tex1 = Label( fen1, text=’Bonjour tout le monde !’, fg=’red’) tex1.pack() # et un bouton qui, lorsqu’on clique dessus, d´ etruit la fen^ etre. b = Button( fen1, text=’Export PS’, command = fen1.destroy ) b.pack() # lance la boucle d’attente des e ´v´ enements. fen1.mainloop()

2.7

Relations entre objets et entre classes

Les relations indiquent des d´ependances statiques entre diff´erentes classes. Ce sont souvent : – association mat´erialisant un lien entre objets. – relation de g´en´eralisation/sp´ecification ou sous-type Dans un premier temps, nous pr´esentons les associations, dont les liens en sont les instances. La relation de g´en´eralisation sera abord´ee ensuite.

2.8

Liens entre objets

Certains objets ont souvent des relations particuli`eres avec d’autres objets, relations dont l’existence est sup´erieure `a l’ex´ecution d’une simple op´eration et persiste dans une certaine dur´ee. On parle de lien entre objets. La notion de lien est tr`es proche de la notion de relation en math´ematiques. 10

Un tel lien permet `a un des objets reli´es d’envoyer des messages `a son partenaire et ainsi de lui demander des services. Par ce biais, plusieurs objets vont collaborer `a la r´ealisation d’une tˆ ache. Un lien se dessine comme un trait entre deux objets. Exemple : L’entreprise 1 a un seul fournisseur le fournisseur 1, sans avoir de voiture d’entreprise. L’entreprise 2 a deux fournisseurs (le 1 et le 2) et deux voitures d’entreprise (1 et 2).

Fournisseur 1 Entreprise 1

Fournisseur 2 Entreprise 2

Véhicule 1

Véhicule 2

Un tel diagramme est dit diagramme d’objets. On peut nommer les liens ou d´efinir des rˆ oles pour chaque intervenant du lien. Quelques questions : Italine et Pascal sont les parents de Zo¨e et Cl´ement. Pascal a pour parents Jean et Constance. Les parents d’Italine sont Robert et Martha. Ils ont eu deux autres enfants Max et Gwen. Jean a eu une autre fille Elo¨ıse avec Sibylline. Elo¨ıse a eu deux enfants Lucien et Raymond avec Honor´e. Gwen a un enfant d´enomm´e Bob. Mat´erialisez les liens parents/enfants. Mat´erialisez ensuite les liens de cousinage.

Est-ce int´eressant d’indiquer si p`ere ou m`ere dans la parent´ee ? La notion de marriage est-elle int´eressante `a rajouter ? Pourquoi le cousinage/anc`etres n’est pas en g´en´eral stock´e en m´emoire ?

2.9

Associations entre classes

En g´en´eral : une association est une connexion bidirectionnelle entre deux classes indiquant un rapport ou une interaction entre elles. Il s’agit d’une vision statique permettant de caract´eriser les liens possibles entre instances de ces classes. Les associations r´esument les liens possibles des instances. Le diagramme repr´esentant les classes avec leurs associations/relations s’appelle diagramme de classes.

11

Exemple : Voil` a une premi`ere solution pour le diagramme de classe des entreprises/fournisseurs.

Entreprise

Fournisseur

Véhicule

Expliquer que le rapport classe/objet est le mˆeme que le rapport association/lien (voir sch´emas suivants). Une relation anonyme est rarement significative ; deux m´ethodes existent pour la pr´eciser : – Il est possible de la nommer en pla¸cant une forme verbale active ou passive en son milieu. On peut aussi y placer un triangle plein pour indiquer le sens de lecture si n´ecessaire. – On peut indiquer le rˆ ole de chaque extr´emit´e de l’association du point de vue de la classe situ´ee `a l’autre extr´emit´e (`a pr´eferrer). Ces deux d´ecorations d’association sont exclusives. Contrairement aux liens, les associations peuvent ˆetre r´eflexives. Quelques questions : Corrigez l’exemple pr´ec´edent d’entreprise/fournisseur en montrant qu’un fournisseur est une entreprise et en donnant des rˆ oles ` a l’association. Quelques questions : Proposez un diagramme de classes pour la g´en´ealogie de l’Exercice 2.8. 2 solutions ` a ce moment : une classe Personne (avec un attribut sexe et une contrainte) ou 2 classes Homme et Femme.

2.10

Multiplicit´ es d’une association

Il est int´eressant de placer en regard de chaque extr´emit´e d’une association sa multiplicit´e, qui pr´ecise combien d’instances de cette classe peuvent participer `a cette relation. Le diagramme d’objets peut servir de base pour d´efinir les multiplicit´es dans le diagramme de classes. La cardinalit´e d’une multiplicit´e est de la forme : n n..m * n..*

Exactement ”n” (entier naturel ¿ 0) De ”n” `a ”m” Plusieurs (´equivalent `a ”0..n” et ”0..*”) ”n” ou plus

Insistez sur le fait qu’en UML, multiplicit´es et rˆ oles sont invers´es sur l’association par rapport `a MERISE. 12

1..* Entreprise

1..* Fournisseur

1 0..* Véhicule

Quelques questions : Mettre les multiplicit´es sur le diagramme de classes g´en´ealogique. Attention au 1 exactement qui impliquerait une BD infinie ! Quelques questions : Mod´elisez une liste simplement chaˆın´ee compos´ee d’´el´ements. Mˆeme chose en doublement chaˆın´ee. Expliquez pourquoi il faut un type pour la liste et un autre pour l’´el´ement encapsulant la donn´ee. Quelques questions : Mod´elisez une carte routi`ere (e.g. classes : route, intersection) dont voil` a une solution parmi d’autres.

2.11 2.11.1

G´ en´ eralisation, polymorphisme Typage et classification

On rappelle que le type d’un objet est l’ensemble des messages auxquels il sait r´epondre. Ce type d´ecrit syntaxiquement et s´emantiquement les messages auxquels l’objet peut r´epondre. Pour un langage de programmation classique, c’est l’ensemble de ses m´ethodes caract´eris´ees par leur signature. En Python, chaque objet est du type d´efini `a son instanciation en l’occurence sa classe. N´eanmoins, Python autorise le programme `a ´etoffer son objet de nouveaux attributs en cours de vie de l’objet. En ce sens, Python ressemble aux langages objets Eiffel ou Smalltalk. Le paradigme objet permet de composer les types/classes entre eux/elles pour cr´eer de nouveaux types/classes. Une relation tr`es importante est l’h´eritage. En Python, on d´efinit un type (abstrait ou concret) sous forme d’une classe avec la syntaxe : class (object) : On note que, contrairement `a d’autres langages, Python ne distingue pas vraiment classes abstraites (ou interfaces) et classes concr`etes. En effet, Python utilise le principe du duck typing : si c¸a cancanne comme un canard et dandine comme un canard, c’est un canard. En d’autres termes, si l’objet poss`ede la m´ethode au moment de son appel, l’interpr´eteur ex´ecute la m´ethode, sinon il y a erreur. Mais on voit bien que le code n’est pas forc´ement structur´e au pr´ealable. C’est juste `a l’ex´ecution que tout est v´erifi´e. 13

# Exemple de sous-typage. # Type repr´ esentant tout f´ elid´ e. Seuls les services sont sp´ ecifi´ es. class F´ elid´ e( object ): def crier(): raise NotImplementedError # Lion est un sous-type de F´ elid´ e, car tous les f´ elid´ es ne sont pas des lions. # En tant que classe, on met en oeuvre le cri par un rugissement. class Lion (F´ elid´ e): def crier(): rugir() ...

# Chat est un sous-type de F´ elid´ e, car tous les f´ elid´ es ne sont pas des chats. # En tant que classe, on met en oeuvre le cri par un miaulement. class Chat ( F´ elid´ e ): def crier(): miauler()

Fig. 1 – Exemple de sous-typage en Python. On voit qu’il faut rajouter une erreur pour rendre la classe F´elid´e non instanciable (donc abstraite). 2.11.2

H´ eritage, classes et classification

Rappeler la d´efinition ensembliste des types. Une classe est un moyen de r´ealiser la classification d’entit´es/objets du mod`ele. A priori, les objets d’une mˆeme classe ont des attributs et propri´et´es similaires. Exemple : Le zoo a un ensemble d’animaux. Mettre dans une mˆeme patate tigres, lions, crocodiles, etc. Ensuite mettre dans une super-patate tigres et lions et la nommer f´elid´es. La g´en´eralisation est donc une simple inclusion. On peut faire de la sp´ecialisation en diff´erenciant mˆ ale et femelle pour chaque animal. On peut ensuite faire des patates mˆ ales et femelles. On voit ainsi la notion d’h´eritage multiple.

L’h´eritage est la facult´e d’une sous-classe ou d’un sous-type d’h´eriter des propri´et´es de son parent et de les affiner. Dans cette d´emarche, il existe au moins deux m´ecanismes d’h´eritage : – le sous-typage ou l’h´eritage d’interface (Figure 1), et – la sous-classification ou l’h´eritage de mise en oeuvre (Figure 2). Le sous-typage est donc le processus par lequel on restreint l’espace des valeurs du type parent, et la sous-classification est le processus par lequel on r´ecup`ere et on sp´ecialise la mise en oeuvre (red´efinition). Python ne distingue pas vraiment ces deux notions, car il n’a pas vraiment la notion d’interface. Une classe peut h´eriter de plusieurs classes. On le s´epare par des virgules entre les parenth`eses.

14

# Exemple de sous-classification. # Classe repr´ esentant un rectangle du plan. class Rectangle( object ) def __init__( self, x, y, l, h ): self._x = x self._y = y self._w = w self._h = h def aire(): return self._l * self._h # Classe repr´ esentant un carr´ e du plan, obtenu par sous-classification de # Rectangle. class Carre( Rectangle ): def __init__( self, x, y, c ): Rectangle.__init__( self, x, y, c, c ) # red´ efinition de aire pour sp´ ecialiser sa mise en oeuvre. def aire(): return self._l * self._l

Fig. 2 – Exemple de sous-classification, ou h´eritage de classe/mise en oeuvre en Python. 2.11.3

Polymorphisme, red´ efinition

Le polymorphisme est l’id´ee d’autoriser le mˆeme code `a ˆetre utilis´e avec diff´erents types, ce qui permet des impl´ementations plus abstraites et g´en´erales. Pour le mettre en œuvre, une classe d´efinie comme sous-classification d’un classe C ou sous-type d’un type T , peut (re)d´efinir la mise en œuvre des m´ethodes sp´ecifi´ees dans C ou dans T . Le principe est de r´e´ecrire la signature de la m´ethode et son corps : c’est la red´efinition. Plus pr´ecis´ement, une portion de code attendra de manipuler un objet A d’un type donn´e T pour lui envoyer le message m(. . .). A l’ex´ecution, n’importe quel objet B dont le type est un sous-type de T pourra se substituer dans cette portion de code. De plus, B conservera la sp´ecificit´e de sa mise en œuvre de la m´ethode m(. . .). En fait, `a l’ex´ecution, le programme d´etermine la classe effective de l’objet A pour appeler sa red´efinition de m´ethode. En Python, c’est tr`es simple. Toute m´ethode est forc´ement polymorphe. Un objet d’un type donn´e poss`ede une liste de m´ethodes connues. Si on appelle une de ses m´ethodes elle est appel´ee. L’exemple ci-dessous utilise les classes d´efinies dans la Figure 2.

15

... r = Rectangle( 0, 0, 10, 5 ) c = Carre( 0, 0, 10 ) print( r.aire() ) # appelle Rectangle.aire() print( c.aire() ) # appelle Carre.aire() t = [ r, c ] # Aucun probl` eme : Python manipule des collections # arbitraires. aireTotale = 0.0; for f in t aireTotale = aireTotale + f.aire(); # appelle Rectangle::aire() sur t[ O ] # appelle Carre::aire() sur t[ 1 ] : Polymorphisme

Le concept de polymorphisme joint `a celui d’h´eritage fait toute la puissance de l’approche objet. Les objets sont manipulables de fa¸con g´en´erique, mais peuvent ˆetre sp´ecialis´es partout o` u c’est utile. C’est pourquoi on parle souvent de composants en programmation objet. En Python, le duck typing simplifie tout cela, car il ne demande a priori aucune structuration entre classes pour faire du polymorphisme. A l’ex´ecution, on v´erifie juste que la m´ethode existe dans l’objet concern´e. 2.11.4

H´ eritage en UML

En UML, on symbolise la relation d’h´eritage par une fl`eche termin´ee par un triangle vide. On parle aussi de relation de g´en´eralisation (dans un sens) ou de sp´ecialisation (dans l’autre sens). Etre vivant

Végétal

Animal

Vertébré

Arthropode

G´ en´ eralisation simple. Elle exprime que les ´el´ements d’une classe sont aussi d´ecrits par une autre classe : c’est la relation “est une sorte de”. C’est une mani`ere de classifier les classes en une hi´erarchie o` u chaque classe a au plus une superclasse. G´ en´ eralisation multiple Les classes peuvent avoir plusieurs superclasses. La g´en´eralisation multiple consiste `a fusionner plusieurs classes en une seule. Cela permet d’exprimer qu’une classe est plusieurs choses en mˆeme temps, et rassemble donc plusieurs ensembles de propri´et´es. On note que l’h´eritage d’interface se note aussi avec la relation △, avec un trac´e de la relation par des tirets.

16

Quelques questions : Les v´ehicules peuvent ˆetre a´eriens ou terrestres. Un tapis volant est un tapis qui est aussi ` a l’aise pour transporter des gens dans l’air que sur terre. Dessinez le diagramme de classes.

3

Concepts avanc´ es sur les associations

Cette partie pr´esente diff´erents concepts li´es aux associations : sp´ecialisation d’association, restrictions, contraintes.

3.1

Agr´ egation

3.1.1

D´ efinition et notation

Une agr´egation repr´esente une association non sym´etrique dans laquelle une des extr´emit´es joue un rˆ ole pr´edominant par rapport `a l’autre. Quelle que soit l’arit´e, elle ne concerne qu’un seul rˆ ole d’une association. L’agr´egation permet par exemple de d´efinir qu’un objet est compos´e d’un ou plusieurs sous-objets. Elle permet une lecture plus rapide des diagrammes de classe, mˆeme si en th´eorie il suffirait d’avoir des associations. Notons que l’agr´egation n’impose a priori pas de r´ealisation particuli`ere.

3.1.2

Utilisation

Pour d´efinir une relation d’agr´egation entre des objets, il faut respecter les r`egles suivantes : – Informellement, l’agr´egation respecte les r`egles suivantes antisym´ etrie : si un objet A fait partie d’un objet B, alors un objet B ne fait pas partie d’un objet A, mˆeme indirectement. Si tel n’est pas le cas, cela veut dire qu’on est en pr´esence d’une simple association.

17

transitivit´ e : si un objet A fait partie d’un objet B, et que B fait partie d’un objet C, alors A doit faire partie d’un objet C dans tous les cas. Sinon, c’est que les champs s´emantiques des objets sont mal d´efinis. – Plus formellement, ´ecrire une agr´egation entre deux classes (distinctes ou non) impose que toute instanciation de ces classes et associations sous forme de graphe des liens orient´es de l’agr´egat vers l’agr´eg´e ne contient pas de cycle. L’agr´egation peut ˆetre utilis´ee dans les cas suivants : 1. pour les objets qui sont les parties d’un assemblage. Le tout a un comportement global coh´erent. Chaque constituant conserve un fonctionnement propre. Exemple : un clavier fait partie d’un ordinateur. 2. pour les objets qui forment les mat´eriaux d´efinissant ensembles un objet. Chaque constituant n’existe plus vraiment en tant que tel mais fait partie d’un tout. Exemple : le pain est fait de farine, d’eau et de levure. 3. pour les objets qui sont des portions d’un objet plus cons´equent. Exemple : une coupe dans une image m´edicale 3D. 4. pour les objets qui sont en relation spatiale ou g´eographique d’inclusion avec un autre objet. Exemple : Yosemite fait partie de la Californie. 5. pour les objets qui collect´es et ordonn´es d´efinissent un tout coh´erent. Exemple : un voyage est compos´e de plusieurs trajets. 6. pour les objets contenus dans un conteneur quelconque, sans ˆetre forc´ement du mˆeme champ s´emantique. Exemple : les employ´es comme les ressources mat´erielles font partie d’une entreprise. 3.1.3

Multiplicit´ e

Les agr´egations peuvent ˆetre multiples, mˆeme du cˆot´e de l’agr´egat.

Des personnes peuvent ˆetre copropri´etaires de plusieurs immeubles.

18

Quelques questions : – Reprenez le diagramme de g´en´ealogie vu pr´ec´edemment. Y a-t-il lieu de remplacer une simple association par une agr´egation ? Dans les deux cas, expliquez pourquoi ? – Dans une structure d’arbre ou de liste, doit-on employer des agr´egations ou des associations ? – Une boˆıte englobante englobe un certain nombre non-nul de points. Une boˆıte englobante d´efinit aussi 2 points particuliers pour repr´esenter son coin sup´erieur gauche et son coin inf´erieur droit. Un point peut appartenir ` a plusieurs boˆıtes englobantes.

– Question suppl´ementaire : on met en relation les boˆıtes englobantes qui sont incluses l’une dans l’autre et les boˆıtes ainsi que les boˆıtes avec une intersection vide. Mettez ` a jour le diagramme de classe.

3.2

Composition

La composition est un cas particulier de l’agr´egation, qui implique une inclusion plus forte de l’objet agr´eg´e dans l’objet agr´egeant. Alors qu’un mˆeme objet peut ˆetre agr´eg´e par plusieurs objets diff´erents, un mˆeme objet ne peut pas ˆetre “compos´e” (ou partag´e) par plusieurs objets. En UML, on utilise la mˆeme notation pour la composition que pour l’agr´egation, sauf que la pointe ♦ est noircie en ¨. La composition implique une co¨ıncidence des dur´ees de vie des composants et du composite : la destruction du composite implique la destruction de tous ses composants. La cr´eation, la modification et la destruction des divers composants sont de la responsabilit´e du composite. Du cˆot´e de l’agr´egat, la multiplicit´e est 0 ou 1 (0 : attribut non renseign´e). La composition et les attributs sont s´emantiquement ´equivalents. La notation par composition s’emploie dans les diagrammes de classes lorsqu’un attribut participe `a d’autres relations dans le mod`ele.

19

Exemples : Un B^ atiment se compose d’un certain nombre de Salles. Batiment Salle 1..∗ mon numero : entier ¨



Batiment mes salles [1..* ] : Salle

La diff´erence entre une composition et un attribut est que la mod´elisation d’un attribut n´ecessite la sp´ecification implicite de son type, et non un sous-type, alors que la composition accepte le polymorphisme. Les attributs sont donc un cas particulier de relations de composition : composition par valeur. A noter que la composition permet aussi de repr´esenter facilement les attributs non renseign´es (ou non valu´es). Quelques questions : – Faites le diagrammes de classes des voitures, roues, moteurs. Rajoutez un m´ecanicien qui peut changer la roue d’une voiture.

– Reprenez l’exemple des fonctions. Y a-t-il des agr´egations/compositions ?

3.3

Association qualifi´ ee

Une association qualifi´ee est une association qui permet de restreindre les objets r´ef´erenc´es dans une association grˆ ace `a une clef. Pour naviguer de la classe A vers la classe B via l’association qualifi´ee du cˆot´e de A, l’utilisateur en sp´ecifiant cette clef restreint le nombre d’objets B reli´es. Tr`es souvent, seul un objet B est reli´e `a cet objet A avec cette clef. Exemples : – Un train se compose de wagons, identifi´e par un num´ero. Chaque wagon se compose d’un certains nombre de si`eges, identifi´e aussi par leur num´ero. – Un plateau de jeu d’´echec se compose de 64 cases, identifiable par leurs coordonn´ees (A-H, 1-8).

3.4

Classe association

C’est une classe faisant partie d’une association, et qui permet de stocker des donn´ees comme d’associer un comportement `a un lien entre deux objets.

20

Exemples : – Cr´eer un diagramme de classe permettant de mod´eliser la relation de mariage entre deux personnes. O` u doit-on stocker la date et le lieu du mariage ? – Dans D & D, un passage entre deux salles peut-il ˆetre mod´elis´e comme une classe-association ?

On note qu’on peut ´eclater toute classe-association en deux associations et une classe.

3.5

Contraintes sur les associations

La multiplicit´e est d´ej`a une contrainte. Les autres contraintes se repr´esentent dans des diagrammes par des expressions entre accolades. – La contrainte {ordonn´ e} peut ˆetre plac´ee sur le rˆ ole pour sp´ecifier qu’une relation d’ordre d´ecrit les objets de la collection. Le mod`ele ne sp´ecifie comment les ´el´ements sont ordonn´es, mais seulement que l’ordre doit ˆetre maintenu durant ajout et suppression des objets par exemple. Exemples : Dans une File d’attente, les Personnes sont ordonn´ees.

– La contrainte {sous-ensemble} indique qu’une collection est incluse dans une autre collection. La contrainte est plac´ee `a proximit´e d’une relation de d´ependance entre deux associations, la fl`eche indique le sens de la contrainte). Exemples : Les d´el´egu´es sont tous des parents d’´el`eves. Parent Ecole

{ Sous−ensemble }

Personne

Délégué

– La contrainte {ou-exclusif} indique que, pour un objet donn´e, une seule association parmi un groupe d’association est valide. Cela ´evite l’introduction de sous-classes artificielles pour mat´erialiser l’exclusivit´e. Exemples : La sortie d’un amplificateur peut ˆetre connect´ee ` a un casque ou ` a une enceinte.

Les extr´emit´es d’association peuvent aussi ˆetre contraintes : {variable} (d´efaut), {gel´ e} (ie constant), {ajoutUniquement} (pour une multiplicit´e sup´erieure `a 1). Exemples : Un œil a une couleur ({gel´ e}). Une sculpture est faˆıte d’un mat´ eriau ({gel´ e}). Un historique est compos´e de faits ({ajoutUniquement}).

21

Quelques questions : Un polygone est compos´e de points. Faˆıtes le diagramme de classes correspondant.

class Point { ... } class Polygone { Point[] m_sommets; // Cree un polygone a nb sommets. Les coordonnees // sont invalides. Polygone( int nb ) { m_sommets = new Point[ nb ]; } // Donne les coordonnees de p au sommet numero i. void setSommet( int i, Point p ) { m_sommets[ i ] = new Point( p.x, p.y ); }

4

Introduction au langage Python

Le Python est un langage interpr´et´e, ou langage de script. Un programme (d´enomm´e python) lit le code source (un fichier texte) ligne `a ligne et ex´ecute les commandes sp´ecifi´ees. L’avantage est donc qu’un programme ´ecrit en Python est ex´ecutable sur n’importe quelle machine, du moment que vous avez install´e python dessus). L’inconv´enient est qu’un programme Python est en g´en´eral plus lent que le mˆeme programme ´ecrit dans un langage compil´e (comme C, C++, Pascal, Ada). Le Python permet la programmation imp´erative, objet, et fonctionnelle. Il est donc tr`es versatile. Il est con¸cu pour rendre plus rapide le d´eveloppement d’un programme, en minimisant le travail de sp´ecification du programmeur. Par exemple, en C, C++ ou JAVA, il faut pr´evoir tous les types de donn´ees et d´eclarer leurs attributs et leurs m´ethodes avant de pouvoir les utiliser. Le Python n’impose rien de tout cela. L’utilisateur peut rajouter quand il le veut un nouvel attribut `a un objet. Ce typage est d´eroutant au d´ebut pour qui est habitu´e `a du C++ (tr`es rigide) et JAVA (assez rigide). Il permet n´eanmoins un apprentissage rapide de la programmation objet et de sa principale qualit´e : le polymorphisme.

4.1

Collections en Python

Python propose plusieurs structures de donn´ees pour repr´esenter les collections d’´el´ements. Chacune est bien adapt´ee `a certaines situations. Conver22

tir l’une en l’autre est facile. Les tuples et les listes sont deux cat´egories de s´equences. 4.1.1

Les uplets ou tuples

Il s’agit d’une s´equence non modifiable d’´el´ements. On les cr´ee et manipule ainsi : # tuple ` a 0 ´ el´ ement t0 = () # tuple ` a 1 ´ el´ ement t1 = ’hello’, # tuple ` a plusieurs ´ el´ ements t3 = 1, 2, 4 t4 = ( 6, ’toto’, 4, ’yup’ ) # tuple de tuples tt = ( (3,2), (5,6), (4,6,7) ) print( len( tt ) ) # donne 3 x, y, z = tt # donne x = (3,2), y = (5,6 ), z = (4,6,7) # On aurait pu ´ ecrire x = tt[ 0 ] y = tt[ 1 ] z = tt[ 2 ] Les tuples sont repr´esent´es efficacement en Python. On a donc int´erˆet `a les utiliser de pr´ef´erence `a des listes lorsqu’on connait priori le nombre d’´el´ements de la s´equence et que l’on sait qu’il n’y aura pas de modifications ult´erieures. On peut comparer l’´egalit´e des tuples, ils ont un ordre lexicographique naturel. On peut it´erer sur les tuples comme sur toute collection (commande for). On peut les d´ecouper en utilisant la notation []. On peut tester la pr´esence d’un ´el´ement x avec la syntaxe if x in tuple : ... 4.1.2

Les listes

On les forme avec la notation [ ]. Comme on voit, on peut s’en servir comme les tuples.

23

# liste ` a 0 ´ el´ ement t0 = [] # liste ` a 1 ´ el´ ement t1 = [’hello’] # liste ` a plusieurs ´ el´ ements t3 = [ 1, 2, 4 ] t4 = [ 6, ’toto’, 4, ’yup’ ] # liste de listes tt = [ [3,2], [5,6], [4,6,7] ] print( len( tt ) ) # donne 3 x, y, z = tt # donne x = [3,2], y = [5,6 ], z = [4,6,7] # On aurait pu ´ ecrire x = tt[ 0 ] y = tt[ 1 ] z = tt[ 2 ] On peut comparer l’´egalit´e des listes, ils ont un ordre lexicographique naturel. On peut it´erer sur les listes comme sur toute collection (commande for). On peut les d´ecouper en utilisant la notation []. Au contraire des tuples, on peut modifier les ´el´ements d’une liste, supprimer des ´el´ements, rajouter ou ins´erer des ´el´ements. C’est une structure plus versatile que le tuple.

24

l = [ 6, 4, 12 ] l.append( 17 ) l.append( 4 ) # l = [ 6, 4, 12, 17, 4 ] # compte le nombre de fois o` u 4 est dans l et l’affiche: 2 print( l.count( 4 ) ) # ajoute ces 3 ´ el´ ements ` a l l.extend( ( 13, 12, 6 ) ) # Recherche et renvoie l’indice d’un ´ el´ ement (1 ici). print( l.index( 4 ) ) # Retourne la liste l.reverse() # # x y

enl` eve le dernier ´ el´ ement (ou celui d’indice pr´ ecis´ e) de la liste et le retourne = l.pop() = l.pop( 2 )

# Trie les ´ el´ ements l.sort() # Ins` ere un ´ el´ ement avant l’indice donn´ ee. l.insert( 0, 13 ) # Cr´ ee un nouvelle liste ` a partir de l, en prenant tout ou une partie ll = l[:] ll = l[2:4] ll = l[2:] ll = l[:4] On peut aussi utiliser la commande del pour ´eliminer des ´el´ements d’une liste.

25

>>> >>> >>> [1, >>> >>> [1, >>> >>> []

4.1.3

a = [-1, 1, 66.25, 333, 333, 1234.5] del a[0] a 66.25, 333, 333, 1234.5] del a[2:4] a 66.25, 1234.5] del a[:] a

Ensembles

Python propose la classe set pour repr´esenter des ensembles, c’est-`a-dire des collections o` u un ´el´ement n’est pr´esent qu’une seule et mˆeme fois. Cette classe dispose naturellement des m´ethodes union, intersection, difference, . . . . s1 = set( (3,4,5) ) s2 = set( (5,6,7) ) s3 = s1.union( s2 ) # s3 = set( 3,4,5,6,7 ) s3.discard( 4 ) # s3 = set( 3,5,6,7 ) s3.add( 8 ) # s3 = set( 3,5,6,7,8 ) if s1.issubset( s3 ): print( ’oui’ ) s3.update( (4, 2, 8, 12 ) ) # s3 = set( 2,3,4,5,6,7,8,12 ) 4 in s3 # True N’oubliez pas qu’une chaˆıne de caract`eres est aussi une structure it´erable. On peut donc passer en param`etre une chaˆıne et chaque caract`ere sera donc un ´el´ement de l’ensemble. s1 = set( ’youpi’ ) s2 = set( ’yokaidi’ ) print( s1.union( s2 ) ) # set([’a’, ’d’, ’i’, ’k’, ’o’, ’p’, ’u’, ’y’])

26

4.1.4

Dictionnaires

Les dictionnaires ou tableaux associatifs associent `a un ensemble d’´el´ements (les cl´es) des valeurs quelconques. En Python, les cl´es comme les valeurs associ´ees peuvent ˆetre de type arbitraire. On d´efinit tr`es simplement un nouveau dictionnaire vide avec les accolades {}. On voit qu’on se sert d’un dictionnaire “comme” d’une liste avec la notation crochet, sauf que l’on peut met une cl´e en param`etre et non un indice entier. >>> tel = {’jack’: 4098, ’sape’: 4139} >>> tel[’guido’] = 4127 >>> tel {’sape’: 4139, ’guido’: 4127, ’jack’: 4098} >>> tel[’jack’] 4098 >>> del tel[’sape’] >>> tel[’irv’] = 4127 >>> tel {’guido’: 4127, ’irv’: 4127, ’jack’: 4098} >>> tel.keys() [’guido’, ’irv’, ’jack’] >>> ’guido’ in tel True >>> for e in tel.items(): print(e) (’jack’, 4098) (’irv’, 4127) (’guido’, 4127) On peut aussi construire un dictionnaire `a partir de listes de couples (cl´e, valeur) ainsi >>> dict([(’sape’, 4139), (’guido’, 4127), (’jack’, 4098)]) {’sape’: 4139, ’jack’: 4098, ’guido’: 4127} On peut faire beaucoup plus ´evolu´e en utilisant le m´ecanisme des “list comprehensions”. On construit ainsi la fonction carr´e sur les entiers 2,4,6. >>> dict([(x, x**2) for x in (2, 4, 6)]) {2: 4, 4: 16, 6: 36}

4.1.5

# use a list comprehension

Techniques pour parcourir les ´ el´ ements de collections

(repris de www.python.org). Pour visiter tous les ´el´ements d’un dictionnaire, la cl´e et la valeur correspon27

dante peut ˆetre r´ecup´er´ee au mˆeme moment avec la m´ethode iteritems. >>> knights = {’gallahad’: ’the pure’, ’robin’: ’the brave’} >>> for k, v in knights.iteritems(): ... print k, v ... gallahad the pure robin the brave Lorsqu’on boucle sur une s´equence, la position et la valeur peut ˆetre obtenue en mˆeme temps avec la fonction enumerate. >>> for i, v in enumerate([’tic’, ’tac’, ’toe’]): ... print i, v ... 0 tic 1 tac 2 toe Pour boucler sur deux ou plus s´equences en mˆeme temps, on peut les rassembler avec la fonction zip. >>> questions = [’name’, ’quest’, ’favorite color’] >>> answers = [’lancelot’, ’the holy grail’, ’blue’] >>> for q, a in zip(questions, answers): ... print ’What is your {0}? It is {1}.’.format(q, a) ... What is your name? It is lancelot. What is your quest? It is the holy grail. What is your favorite color? It is blue. Pour boucler sur une s´equence en sens inverse, sp´ecifier d’abord la s´equence dans le sens avant et appeler dessus la fonction reversed. >>> for i in reversed(xrange(1,10,2)): ... print i ... 9 7 5 3 1 Pour boucler sur une s´equence dans l’ordre naturel, on peut utiliser la fonction sorted qui retournera une nouvelle liste dans le bon ordre sans modifier la liste initiale.

28

>>> basket = [’apple’, ’orange’, ’apple’, ’pear’, ’orange’, ’banana’] >>> for f in sorted(set(basket)): ... print f ... apple banana orange pear Quelques questions : Etant donn´es 2 s´equences s1 et s2, on veut obtenir la s´equence des ´el´ements de s1 qui ne sont pas dans s2 et inversement. Quelques questions : Etant donn´e une chaˆıne de caract`eres s, ´ecrire une fonction qui affiche pour chaque lettre combien de fois elle est pr´esente dans s.

>>> s = "il fait beau. la mer se prelasse. les enfants barbotent." >>> l = set( s ) >>> print(l) set([’a’, ’ ’, ’b’, ’e’, ’f’, ’i’, ’m’, ’l’, ’o’, ’.’, ’p’, ’s’, ’r’, ’u’, ’t’, ’n’]) >>> d = dict( (a,0) for a in l ) >>> print(d) {’a’: 0, ’ ’: 0, ’b’: 0, ’e’: 0, ’f’: 0, ’i’: 0, ’m’: 0, ’l’: 0, ’o’: 0, ’.’: 0, ’p’: 0, >>> for c in s: ... d[c] = d[c] + 1 ... >>> print(d) {’a’: 6, ’ ’: 9, ’b’: 3, ’e’: 8, ’f’: 2, ’i’: 2, ’m’: 1, ’l’: 4, ’o’: 1, ’.’: 3, ’p’: 1, >>>

4.2

5

TODO

Introduction au langage JAVA

Le JAVA a pour principale motivation d’ˆetre portable (un programme JAVA peut s’ex´ecuter sur n’importe quelle machine/architecture/os du moment que la machine virtuelle JAVA y a ´et´e install´ee). De plus, il s’agit d’un bon langage de programmation objet, qui dispose de presque toutes les possibilit´es du paradigme objet. Il est de plus assez proche du langage C++, tout en le simplifiant sur certains points, et permet donc une adaptation assez rapide des programmeurs C++. Enfin, il est suppos´e donner des programmes plus facilement maintenables, car il limite les erreurs dues `a la gestion de la m´emoire, et offre aussi une bonne gestion des erreurs et exceptions. Son d´efaut majeur est sans doute sa vitesse d’ex´ecution, entre 3 et 15 fois plus lente qu’un programme C++ similaire (selon les benchmarks). Un autre d´efaut est qu’il ne permet

29

pas vraiment la programmation syst`eme ou la programmation bas-niveau, tout simplement car il introduit une couche d’abstraction entre le programme et l’ordinateur/processeur. En quelque sorte, pour un programme JAVA, toutes les machines sont identiques ! Nous allons pr´esenter ici quelques points de ce langage.

5.1

Compilation et ex´ ecution d’un programme JAVA

Vous pouvez un IDE comme Eclipse qui se chargera de ces ´etapes `a l’aide de quelques clics. Sinon, JAVA fournit principalement deux programmes : javac compile un ensemble de programmes JAVA en un code que pourra interpr´eter la machine virtuelle. Si on dispose de deux fichiers JAVA a.java et b.java, on pourra les compiler ainsi > javac a.java b.java Cela g´en`ere des fichiers a.class et b.class, qui contiennent des instructions simples ex´ecutables par la machine virtuelle JAVA. java l’interpr´eteur JAVA ou machine virtuelle JAVA. Elle ex´ecute du bytecode JAVA si on lui donne un point d’entr´ee : le nom d’une classe publique o` u il y a un main, par exemple > java a

5.2

D´ ecoupage d’un programme JAVA

En g´en´eral, un programme JAVA est d´ecoup´e en plusieurs fichiers sources d’extension .java. Dans chaque fichier XXX.java se trouve une classe publique de nom XXX. D’autres classes non publiques peuvent en faire partie. Chaque classe contient des donn´ees membres (ou attributs) ainsi que des fonctions membres (ou m´ethodes). Le corps des m´ethodes se situe juste apr`es leur d´eclaration et est d´elimit´e par un bloc { . . . }. Dans un tel bloc, on peut mettre des instructions. Les fichiers JAVA sont aussi parfois regroup´es en package. Si rien n’est pr´ecis´e (pas de commande package, les classes du fichiers sont dans le package par d´efaut.

30

// Fichier Exemple.java package Youpi; import java.util.*; // importe quelques classes utiles // Classe publique public class Exemple { // attribut ou donn´ ee membre String s; // m´ ethode ou fonction membre static public void main( String[] args ) { System.out.println( "args[0]=" + args[0] ); } }

5.3

Types primitifs

A la base, JAVA ne manipule que les types dits primitifs : int, boolean, char, float, double, etc. Ils permettent de coder des entiers, bool´eens, nombres `a virgule flottante, caract`eres. Pour d´eclarer une variable i de type int, on ´ecrit la ligne suivante `a l’int´erieur d’un bloc { . . . } : { ... int i; // declaration et instanciation i = 5; ... } // fin de la dur´ ee de vie de i. La variable i n’existe que jusqu’`a l’accolade fermante du groupe o` u elle a ´et´e d´eclar´ee. On note qu’on donne `a la fois un nom `a la variable (ici i) et qu’on lui associe aussi un espace m´emoire pour stocker la donn´ee.

5.4

Autres types

On dispose ensuite de plusieurs moyens tr`es puissants pour combiner ces types primitifs en types complexes. – – – –

les tableaux [ ] le regroupement des types dans une mˆeme classe, sous forme d’attributs l’enrichissement (ou sp´ecialisation) des types via l’h´eritage la cr´eation de types g´en´eriques via les patrons ou template

On note que seules les variables de type primitif fonctionne comme les variables habituelles des langages imp´eratifs (C, C++, Pascal, Ada). Les variables 31

d’une autre type sont appel´ees variables objets. On doit bien sˆ ur les d´eclarer. Ensuite, elles ne font que pointer ou d´esigner des objets de ce type. Il faudra donc cr´eer (ou allouer, ou encore instancier) des objets du type voulu `a l’aide de l’op´erateur new.

5.5

Tableau d’´ el´ ements du mˆ eme type primitif

Un tableau permet de stocker un nombre donn´e d’´el´ements du mˆeme type avec un acc`es direct `a chaque ´el´ement par le biais de son num´ero (ou indice). En JAVA, le type tableau (mat´erialis´e par [ ]) est en fait un objet conteneur. Il faut donc d´eclarer la variable tableau mais aussi cr´eer l’espace m´emoire correspondant avec l’op´erateur new. Les indices vont de 0 au nombre d’´el´ements moins 1, comme en C. Le nombre d’´el´ements ou taille du tableau est accessible dans le champ length de la variable objet. char[ ] s; // declaration d’une variable tableau de caracteres s = new char[ 10 ]; // instanciation d’un tableau de 10 caracteres s[ 0 ] = ’b’; // la lettre ’b’ est mise dans la case 0 du tableau int i = s.length; // i recoit 10, la longueur du tableau. Une autre fa¸con de faire est d’initialiser le tableau avec des valeurs // d´ eclare et instancie un tableau de taille 6. int[ ] t = { 1, 2, 3, 4, 5, 6 };

5.6

Regroupements ` a l’aide d’une Classe

On peut s’en servir un peu comme la structure C, mais il s’agit vraiment d’une classe au sens de la programmation objet. On peut donc regrouper des donn´ees, mais aussi associer des fonctions membres ou m´ethodes qui vont op´erer sur les donn´ees de la classe. On utilise le mot-cl´e class pour d´eclarer une classe. Une classe contient essentiellement deux familles d’´el´ements : – des donn´ees, appel´ees attributs, donn´ees membres. Chacune de ces donn´ees est associ´ees `a chaque objet de ce type. Les donn´ees peuvent ˆetre de types primitifs ou des classes elles-mˆemes. – des op´erations, appel´ees m´ethodes, fonctions membres. Chacune de ces op´erations op`erent sur les attributs de l’objet, en utilisant ´eventuellement des param`etres et en retournant ´eventuellement une valeur. Voil`a un exemple de classe repr´esentant un point dans le plan.

32

class Point { float x; float y; // Mets les coordonnees (x0, y0) dans le point void init( float x0, float y0 ) { x = x0; y = y0; } // Translate ce point d’un vecteur (u,v) void translate( float u, float v ) { x = x + u; y = y + v; } // Distance ` a un autre point float distance( Point autre ) { float dx = autre.x - x; float dy = autre.y - y; return Math.sqrt( dx*dx + dy*dy ); } } Et voil`a une fa¸con de l’utiliser : // Fichier Exemple1.java public class Exemple1 { public static void main( String[ ] args ) { Point p1; // d´ eclare un point (sans l’instancier !) Point p2; // d´ eclare un autre point (sans l’instancier !) p1 = new Point(); // cr´ eer un objet Point p2 = new Point(); // cr´ eer un autre objet Point p1.init( 5.0, 4.0 ); p2.init( 10.0, 3.0 ); // Distance de p1 au point p2 => on demande a p1 de la calculer. double d12 = p1.distance( p2 ); // Distance de p2 au point p1 => on demande a p2 de la calculer. double d21 = p2.distance( p1 ); System.out.println( d12 + " = " + d21 ); } } Pour compiler et ex´ecuter ce code, on tapera dans un terminal : > javac Exemple1.java > java Exemple1 5.0990195135927845 = 5.0990195135927845 33

5.7

Objets et variables objet

Chaque fois que l’on appelle l’op´erateur new on cr´ee quelque part en m´emoire un nouvel ´el´ement du type sp´ecifi´e, un objet donc. C’est en fait la seule et unique mani`ere de cr´eer des objets en JAVA. Pour acc´eder `a un objet, on utilise les variables objets, qui vont pointer vers les objets cr´e´es, et qui vont nous permettre d’acc´eder `a leurs champs et de leur encoyer des messages. Plusieurs variables objets peuvent donc r´ef´erencer ou pointer vers le mˆeme objet. ... Point p1 = new Point(); Point p2 = new Point(); Point p3 = p1; // p3 reference le meme objet que p1. p1.init( 5.0, 4.0 ); p2.init( 10.0, 3.0 ); p3.x = 0.0; System.out.println( p1.x ); // affiche 0.0 ! On acc`ede aux champs et m´ethodes d’un objet via le symbole ”.” appliqu´e sur une variable objet qui le r´ef´erencie. Une variable objet de type T peut d´esigner tout objet de type T ou d’un sous-type de T . En JAVA, toute classe est un sous-type de la classe Object. On peut donc toujours ´ecrire : ... Object o = new Point(); ... Cela a un sens, notamment lorsqu’on manipule des collections d’´el´ements de types diff´erents. On peut toujours revenir au type initial (type instanci´e) d’un objet avec le transtypage. ... Object o = new Point(); Point p1 = (Point) o; // valide Polygon poly = (Polygon) o; // invalide, Polygon n’est pas // un sous-type de Point ... Une variable objet non initialis´ee vaut null.

34

5.8

Constructeurs d’une classe

Ce sont des m´ethodes particuli`eres qui ne sont appel´ees qu’`a la cr´eation de l’objet (son instanciation). Cela permet de cr´eer un objet qui a tout de suite des donn´ees valides. Ces m´ethodes portent simplement le nom de la classe, peuvent prendre des param`etres et n’ont pas de valeur de retour. Pour la classe Point, on pourrait proposer class Point { ... public Point() { x = 0.0; y = 0.0; } public Point( double x0, double y0 ) { x = x0; y = y0; } public Point( Point autre ) { x = autre.x; y = autre.y; } ... } ce qui permettrait les initialisations suivantes `a l’instanciation : ... Point p1 = new Point(); // p1.(x,y) = (0.0, 0.0) Point p2 = new Point(3.0, 2.0); // p2.(x,y) = (3.0, 2.0) Point p3 = new Point(p2); // p3.(x,y) = (3.0, 2.0) ...

5.9

Associations en JAVA

Une variable objet permet de pointer vers un objet JAVA. Pour relier un objet JAVA `a un autre objet JAVA, il suffit donc qu’une variable objet (du bon type) soit d´eclar´ee comme donn´ee membre de la classe. Par exemple, si tout objet de type A est reli´e `a un objet de type B, la classe A s’´ecrira :

35

class A { ... B mon_b; ... };

// donnee membre publique, priv´ ee, ou autre

Inversement, si l’objet de type B doit connaˆıtre cet objet de type A associ´e, il faudra aussi d´eclarer une donn´ee membre dans la classe B. class B { ... A mon_a; ... };

// donnee membre publique, priv´ ee, ou autre

Comme exemple, voil`a une fa¸con d’´ecrire une classe Segment, qui repr´esente un segment entre deux points. class Segment { Point p; Point q; ... double longueur() { return p.distance( q ); } } Si une classe A est associ´ee `a possiblement plusieurs instances d’une classe B ayant le mˆeme rˆ ole, on utilisera un tableau de variables objet. Par exemple, on peut d´efinir un Polygone ainsi : class Polygon { Point[] sommets; ... Polygon( int n ) { // Cree un polygone regulier ` a n sommets sommets = new Point[ n ]; for ( int i = 0; i < n; i++ ) { double a = ( 2.0 * Math.PI * i ) / n; sommets[ i ] = new Point( Math.cos( a ), Math.sin( a ) ); } } }

36

Quelques questions : 1. Ecrivez la classe Personne et ses relations de parent´e. 2. Ecrivez les classes Homme et Femme et ses relations de parent´e. 3. Y a-t-il une diff´erence entre les attributs de type String (chaˆıne de caract`ere) utilis´es pour stocker le nom et pr´enom de la personne et les attributs d´esignant les objets en relation de parent´e. 4. Reprenez l’exemple de la classe Fonction et proposez une classe mod´elisant l’addition de deux fonctions.

5.10

Interfaces, classes abstraites

On ne s’int´eresse parfois qu’aux op´erations associ´ees `a un concept, et aucunement aux attributs ou au code n´ecessaire pour le mettre en oeuvre dans un cas pr´ecis. JAVA offre un m´ecanisme pour mod´eliser ces abstractions, les interfaces. Par exemple, voil`a une interface possible pour les formes du plan : interface Forme { double aire(); double perimetre(); boolean pointInterieur( Point p ); Point centreDeGravite(); Rectangle boiteEnglobante(); } Beaucoup d’applications et de fonctions n’ont pas vraiment besoin de savoir comment sont ´ecrites ces m´ethodes, mais ont juste besoin de les appeler. Ainsi, elles peuvent pr´evoir simplement de recevoir une Forme en param`etre, et non une sp´ecialisation concr`ete. On pourra ensuite pr´eciser qu’une classe r´ealise concr`etement ces op´erations avec le mot-cl´e implements. class Carre implements Forme { int m_c; double aire() { return m_c*m_c; } ... } Une classe abstraite est sp´ecifi´ee par le mot-cl´e abstract. Il s’agit d’un interm´ediaire entre une interface et une classe, au sens ou certaines m´ethodes peuvent ne pas ˆetre ´ecrites, mais juste sp´ecifi´ees. Une classe abstraite peut ou non avoir des attributs, contrairement aux interfaces qui n’ont aucun attribut. On note qu’aucun objet ne peut ˆetre du type d’une interface ou d’une classe abstraite, car les objets sont concrets. En revanche les objets peuvent bien sˆ ur 37

ˆetre des mises en oeuvre concr`etes d’une ou plusieurs interfaces ou d’une classe abstraite : le type de l’objet `a l’instanciation est alors un sous-type de ces types abstraits. Ainsi on instanciera des Carres, des Ellipses, mais jamais des Formes.

5.11

G´ en´ eralisation, sp´ ecialisation, h´ eritage

(Voir la Section 2.11.) Le JAVA dispose de deux m´ecanismes de sp´ecialisation : – le sous-typage ou h´eritage d’interface : il permet de d´efinir des sp´ecialisations de types existants. Dans l’approche ensembliste, il s’agit de d´ecouper un ensemble d’´el´ements en sous-ensembles consistants, qui offrent des op´erations suppl´ementaires. Il ne s’agit pas de pr´eciser comment ces op´erations sont effectivement r´ealis´ees et quelles sont les donn´ees associ´ees. Le sous-typage se fait en utilisant le mot-cl´e implements. Une interface ou une classe peut h´eriter d’autant d’interfaces qu’elle le souhaite. – la sous-classification ou h´eritage de mise en œuvre : il permet d’acqu´erir toutes les propri´et´es d’une autre classe (m´ethodes/op´erations, donn´ees, impl´ementations des m´ethodes), de rajouter de nouvelles m´ethodes et/ou donn´ees, voire de red´efinir certaines m´ethodes pour les sp´ecialiser. La sousclassification se fait en utilisant le mot-cl´e extends. En JAVA, seule une classe peut h´eriter d’une seule autre classe. Par d´efaut, une classe h´erite de la classe Object. Cela induit que toute classe d´erive de la classe Object en JAVA. On note donc que toute classe est un sous-type de Object. Le sous-typage (et donc le polymorphisme) peut se faire via le m´ecanisme d’h´eritage d’interface ou d’impl´ementation. On r´ef`ere le lecteur aux deux exemples de la Section 2.11.

5.12

Polymorphisme Quelques questions : 1. Reprenez l’exemple des formes. Ecrire l’interface Forme ainsi que les diff´erentes classes concr`etes pour les formes : polygone, carr´e, cercle, ellipse, fonctions implicites, etc. 2. Montrez un exemple d’utilisation o` u on calcule l’aire totale de beaucoup de formes de type concret diff´erent.

6

Aper¸ cu de la biblioth` eque JAVA

On parle aussi de l’API JAVA (pour Application Programming Interface). C’est une biblioth`eque de classes d´ej`a ´ecrite, utilisable facilement par tout programme(ur) JAVA. Notamment, on dispose de classes pour : 38

– faire des calculs math´ematiques – g´erer les fichiers – manipuler des collections d’´el´ements – faire des IHM (interfaces homme-machine avec fenˆetres, boutons, et autres) – communiquer avec une base de donn´ees – g´erer les images, vid´eos, sons – ´etablir des connexions r´eseaux, communiquer sur Internet – faire de la programmation concurrente (multithreading) – etc Il ne s’agit pas ici de pr´esenter cette biblioth`eque de mani`ere exhaustive. Nous r´ef´erons le lecteur au site de Sun, qui met en-ligne toute l’API ainsi que des tutoriaux pour rapidement savoir l’utiliser. On va juste survoler quelques points.

39

View more...

Comments

Copyright � 2017 NANOPDF Inc.
SUPPORT NANOPDF