You are on page 1of 44

PPOOGL

Mod´lisation objet e UML
Intro historico-s´mantique e Le vocabulaire de l’orient´-objet e Quelques exemples de mod´lisation rat´es et r´ussies e e e Conclusion

Introduction

O` les ´tudiants apprennent avec consternation qu’ils vont devoir u e faire de la mod´lisation avant de se jeter sur leurs clavier. e

PPOOGL

1

Un peu d’histoire (1) : la pr´histoire e

Avant mon arriv´e sur Terre, programmer c’´tait craignos : e e Fortran Basic plein d’assembleur et Lisp pour embˆter les ´tudiants e e

PPOOGL

2

Un peu d’histoire (2) : l’antiquit´ e
Quand j’´tais petit, la mode c’´tait Pascal : e e Programme = structures de donn´es + algorithmes (Wirth) e Typage fort et types structur´s e Code aussi structur´ : Goto considered harmful (Dijkstra) e Et donc s´mantique compositionnelle e Et si on voulait des programmes efficaces malgr´ tous ces progr`s, e e on avait C qui permettait de programmer proprement, ou bien cochonnement. Selon le besoin. C’est l` aussi que les langages fonctionnels sont devenus civilis´s, a e mais pas au point que les gens s’en servent, (` part pour a programmer des ´diteurs de texte ` 10Mo). e a

PPOOGL

3

Un peu d’histoire (3) : les temps modernes
Quand j’avais votre ˆge, tout-`-coup, la mode est pass´ aux a a e langages orient´s-objets : e encapsulation : on ne voit d’un objet ce qu’on a besoin de voir h´ritage : permet l’abstraction et la r´utilisation e e polymorphisme : permet malgr´ tout du code simple/lisible e tout cela compatible avec les progr`s pr´c´dents. e e e Pascal imposait la s´paration donn´es/algorithmes, les langages 00 e e imposent en plus la s´paration fonctionnalit´/impl´mentation. e e e
Et si on veut des programmes efficaces malgr´ tous ces progr`s, on a e e C++ qui permet de programmer proprement, ou bien cochonnement. Selon le besoin. Mˆme Caml est devenu orient´ objet ! ? ! ? ? ! ! ! e e

PPOOGL

4

Fini les langages, bonjour les m´thodologies de e programmation
On dit souvent conception orient´e objet au lieu de e programmation : Depuis toujours, avant de se jeter sur leur clavier, les gens s´rieux r´fl´chissent et font des petits dessins (mod´lisation) e e e e
Assembleur/Basic/Fortran : organigramme pour s’y retrouver dans les gotos. Pascal : en plus, d´finition des structures de donn´es, e e repr´sentations graphiques des pointeurs... e Mod`les de programmation exotiques : graphes de flots de e donn´es, automates, ... e

En principe, cette ´tape de mod´lisation est ind´pendante du e e e langage. La suite de l’histoire fut de concr´tiser ce “en principe”. e
PPOOGL 5

Un peu de d´tente e

Thus, an object-oriented analysis can be regarded as a form of syllogism moving from the Particular (classes) through the Individual (instances) to the Universal (control).

Ceci pour montrer que des bouquins entiers de philosophie ont ´t´ ee e ´crits sur la mod´lisation orient´e objet, ind´pendamment de tout e e e langage.

PPOOGL

6

Un peu d’histoire (4) : les Balkans
Petite histoire de l’orient´ objet : e
Dans les ann´es 80, OO = UI (parfois AI) e Fin des ann´es 80 : Smalltalk (OO int´griste) e e Fin des ann´es 80 : Booch ´crit Object Oriented Design qui parle de e e ADA Explosion (effet de mode) au d´but des ann´es 90. Langage ` la e e a mode : C++, dont la sp´cification est alors pleine de bugs. e Plein d’outils de mod´lisation (OOSE, OMT, OBA, BON, MOSES, e SOMA, ...) souvent accroch´s ` un langage. e a In 1994 there were over 72 methods or fragments of methods. The OO community soon realized that this situation was untenable if the technology was to be used commercially on any significant scale. They also realized that most of the methods overlapped considerably. Therefore, various initiatives were launched aimed at merging and standardizing methods.
Petit jeu : trouvez des significations cr´dibles de ces acronymes. e PPOOGL 7

Un peu d’histoire (5) : le nouvel ordre mondial

Et c’est ainsi que naquit UML, l’Unified Modelling Language.

PPOOGL

8

Les bonnes f´es se penchent sur le berceau d’UML e
Database design Entity− Relational Modelling
Codd et al., 1980
Multiple views of static relationships; design based on users’ concepts

Ada
Large system modular real− time programming

Smalltalk C++ Formal specification
Larch, Z &VDM c.1980

CRC
Beck et al.

Eiffel
Meyer, 1988

Coad,

1990 Fusion

OMT
Rumbaugh et al., 1991

Booch, 1991
Managing object designs and interdependencies

Coleman et al., 1994

Objectory
Jacobson et al., 1992
A process for object− oriented design

SOMA
Graham, 1991
Rulesets, OO RAD, business modelling

Odell , 1991 Activity diagrams Real Time OOM
Selic et al., 1994

Syntropy
Cook & Daniels, 1994

OPEN
Graham et al., 1997
Process, notation

Object Management Group co− ordinator

UML
1997

Catalysis
D’Souza and Wills, 1999

PPOOGL

9

Un peu d’histoire (5) : l’´poque contemporaine e

Apr`s il y a eu d’autres langages objets, par exemple Java. e

Mais ils n’inventent plus rien. Ils font juste tout un peu mieux...

Je ne vais donc pas vous apprendre Java (ni C++, ni SmallTalk, ni e rien). Je vais donc vous expliquer les Grands Principes de l’Orient´ Objet. Ensuite vous vous d´brouillerez pour apprendre les langages e que vous voudrez vous-mˆmes, sur le tas. e

PPOOGL

10

Conclusion de l’intro : c´koi UML ? e
un pr´texte facile pour rester dans les id´es g´n´rales sans me e e e e plonger dans un langage particulier. Un langage graphique tout con pour repr´senter les notions e OO Un standard pour communiquer des concepts 00 :
sp´cification (chef vers MIM) e travail collaboratif (MIM vers MIM) a documentation (MIM vers chef) qui n’y connait rien ` Java++)

Assez bien sp´cifi´ pour qu’on puisse en faire des outils e e
pour dessiner de l’UML (exemple sous Linux : dia) ... qui exportent des squelettes de programmes (exemple : dia2code). grˆce ` quoi vous ´conomisez du boulot, car n’est-ce pas, vous a a e devez toujours produire code + doc. La vraie doc d’UML est (entre autres) sur www.omg.org (site du consortium Object Management Group) o` vous constaterez que je vous u ai bien simplifi´ les choses... e
PPOOGL 11

Le vocabulaire de l’orient´ objet e

vocabulaire en fran¸ais c vocabulaire en anglais vocabulaire en UML

PPOOGL

12

Objet
Un objet est compos´ de e des attributs (parfois appel´es champs, variables, donn´es membres) e e ≈ les champs d’une structure de donn´e des langages e classiques et aussi des m´thodes e (parfois appel´es op´rations, fonctions membres) e e ≈ fonctions/proc´dures qui d´pendent s´mantiquement de e e e l’objet. Si vous n’avez pas compris le mot “s´mantiquement”, e la derni`re phrase veut dire : e dont le bon sens dit qu’elles d´pendent de l’objet. e Si vous n’avez pas de bon sens, je vous en donne dans la suite.
PPOOGL 13

Encapsulation (1)

Pour chaque objet, il y a ceux qui le programment, et ceux qui l’utilisent (dans d’autres programmes).

Ce ne sont pas toujours les mˆmes. e

PPOOGL

14

Encapsulation (2)

Pour chaque objet, il y a des attributs et des m´thodes internes, utilis´s pour le e e programmer des attributs et des m´thodes externes, utilis´s pour e e l’interfacer

Ce ne sont pas toujours les mˆmes. e

PPOOGL

15

Encapsulation (3)

Un objet a une interface par laquelle on le manipule, et que tout le monde connait. Cette interface fait partie de sa sp´cification. Elle est tout ce dont ont besoin les utilisateurs e de l’objet. On a tout int´rˆt ` cacher les sordides d´tails de ee a e l’impl´mentation d’un objet ` ses utilisateurs : e a
ils en ont ainsi une vue plus simple, plus lisible ; leur code ne risque pas d’interf´rer avec le code interne ` e a l’objet ; on peut changer l’impl´mentation d’un objet de mani`re e e indolore/transparente pour ses utilisateurs ;

PPOOGL

16

Encapsulation (4)

Techniquement, l’encapsulation c’est tr`s simple : un attribut ou e une m´thode sont e soit publics, visibles par tout le monde, et moralement destin´s ` ˆtre acc´d´s par tous les utilisateurs de l’objet ; e ae e e soit priv´s, relatif au fonctionnement interne de l’objet, et cela e ne regarde pas les utilisateurs. Il y a en g´n´ral au moins un niveau d’acc`s interm´diaire, appel´ e e e e e prot´g´. Il permet l’acc`s par du code “ami” : typiquement, les e e e autres objets d’une mˆme biblioth`que. e e Remarque : On peut implementer cette philosophie dans n’importe quel langage, mais les langages OO apportent une garantie m´canique qu’elle est respect´e. Enfin sauf Python. e e

PPOOGL

17

Encapsulation (5)
Pour r´cap´peter, qui fait quoi : e e Le Chef donne la sp´cification de chaque objet, en d´crivant e e
sa syntaxe publique (en UML par exemple) sa s´mantique (en langue naturelle jusqu’` nouvel ordre) e a

Le programmeur responsable de l’objet bricole comme il veut ce qui est priv´, tant qu’il respecte la sp´cification. e e L’utilisateur de l’objet (qui est aussi un programmeur) ne voit et n’a besoin que de ce qui est public. Il ne risque pas d’interf´rer avec le boulot du responsable de l’objet puisqu’il e ne le voit pas. Remarque : le Chef n’a pas besoin de savoir programmer. Sinon il ne serait pas Chef.

PPOOGL

18

En r´sum´ e e

Les grandes questions qu’on se pose dans les trois paradigmes de programmation s´quentiels : e Imperatif : Comment ? Declaratif (fonctionnel ou logique) : Quoi ? Orient´ Objet : Qui ? e

PPOOGL

19

Classe

Classe ≈ type d’objet.

Objet = instance d’une classe. On parle des m´thodes de l’objet. e

En UML, les dessins sont presque les mˆmes. e

PPOOGL

20

0 0 data-centrique ?
` A une ´poque, une justification de l’OO ´tait : e e Les donn´es sont ce qui est stable et important, e plus que les programmes. Implantation dans SmallTalk, o` toutes les fonctions/proc´dures u e sont des m´thodes qui n’existent pas ind´pendamment d’un objet. e e Une approche int´griste peut devenir contre-productive. e Par exemple, en SmallTalk, l’addition de deux nombres est une m´thode d’un des nombres qui prend en param`tre l’autre. e e ` A mon avis c’est idiot.

PPOOGL

21

Approche par responsabilit´ e
On se r´veille, c’est le transparent important du cours e Au cours de la mod´lisation, on essaiera de respecter la philosophie e suivante : Attribut d’un objet : ce qu’il est de sa responsabilit´ de savoir. e M´thode d’un objet : e ce qu’il est de sa responsabilit´ de faire. e Si la responsabilit´ est celle de la classe, on dit que la e m´thode ou l’attribut est statique e Cela nous r`gle l’exemple de l’addition SmallTalk : l’addition est de e la responsabilit´ de la classe des nombres, pas d’un objet de cette e classe. C’est donc une m´thode statique, qui a deux arguments. e
PPOOGL 22

H´ritage (1) e

D´finition : e La classe machin h´rite de la classe truc signifie tout simplement : e un machin est un truc.

Une coccinelle est un col´opt`re qui est un insecte qui est un e e animal qui est un ˆtre vivant, ce qui montre qu’on peut construire e un graphe d’h´ritage, aussi appel´ hi´rarchie is-a ou hi´rarchie de e e e e classes.

PPOOGL

23

H´ritage (2) : exemple e

Comme tout le monde, je vais prendre un exemple qui va sur l’eau. Classe des objets Classe des objets munis d’un ordre total < Classe des caract`res e Classe des nombres informatiques Classe des entiers Classe des nombres en virgule flottante

PPOOGL

24

H´ritage(3) : en UML e

Objet
+toString(): String

Objet Ordonné
+plusGrand(x:Objet ordonné,y:Objet ordonné): booléen

Caractère

Nombre
+Plus(x:Nombre,y:Nombre): Nombre

ListeChainée Entier Flottant

T:Objet Ordonné

-PointeurVersPremier +longueur(): Entier +insérer(x:T) +tri()

PPOOGL

25

H´ritage (4) : pourquoi e
L’int´rˆt c’est de d´finir les attributs et m´thodes l` o` ils doivent ee e e a u l’ˆtre (approche par responsabilit´) e e toString() est une m´thode de tout objet, utilis´e pour e e l’afficher sous forme textuelle. Par d´faut elle affiche la valeur e du pointeur vers l’objet. La plupart des classes red´finissent (surchargent) toString() e pour lui faire afficher quelquechose de plus informatif que la valeur du pointeur... ... mais un programme peut appeler toto.toString() quelque soit la classe de toto. Lorsqu’il y a plusieurs d´finitions de toString sur la branche e de l’arbre d’h´ritage qui m`ne ` la classe de toto, la e e a d´finition du langage dit laquelle est appel´e (typiquement la e e derni`re), et comment appeler les autres si n´cessaire. e e
C’est l` qu’on remarque que finalement, utiliser cout en C++ c’est bien utiliser de l’orient´ objet... a e PPOOGL 26

H´ritage (5) : attributs et m´thodes e e

Plus g´n´ralement, lorsque un machin est un truc, e e tous les attributs/m´thodes de truc sont aussi des e attributs/m´thodes de machin : c’est pour cela qu’on dit que e machin h´rite tout de truc. e machin peut aussi avoir des m´thodes/attributs qui lui sont e propres. machin peut red´finir/surcharger/raffiner une m´thode de e e truc, mais sans toucher ` sa syntaxe externe (son prototype). a Finalement, dans un pointeur vers truc on pourra mettre un machin (puisque machin est un truc) et appeler pourtant toutes les m´thodes d’un truc. e

PPOOGL

27

H´ritage : subtilit´s e e
notion de m´thode abstraite : la surclasse d´clare une e e m´thode mais ne la d´finit pas. Elle oblige toutes ses e e sous-classes ` la d´finir. a e Exemple : la m´thode cueillir() de la classe Fruits : on e cueille tous les fruits, mais pas de la mˆme mani`re, et il n’y a e e pas de mani`re g´n´rique. e e e notion de classe abstraite notion de polymorphisme, par exemple la m´thode e toString() de la classe des objets h´ritage multiple avec des conflits possibles : on verra plus e tard. (En UML on met en italique tout ce qui est abstrait.)
PPOOGL 28

Type ou classe ?
Moralement c’est la mˆme chose. Si vous voulez la petite nuance e s´mantique : e Un type se met au singulier (une variable de type entier). Une classe se met au pluriel (la classe des nombres). Informatiquement, Java a les deux : les types sont pr´d´finis et e e fondamentaux (types num´riques, char et bool´en), et n’ont e e d’autre m´thodes que celles fournies par le mat´riel. Du coup leur e e occupation m´moire est minimale. String est une classe. Il y a e aussi une classe Boolean correspondant au type boolean mais on ne s’en sert jamais. (cela se voit que je ne suis pas trop sˆr de moi ?) u

PPOOGL

29

Objets de la “vraie vie” vs objets informatiques ?
(par “vraie vie” on entendra sans complexe un champ de bataille du futur avec des robots t´l´pathes : c’est ce que le programme ee essaye de mod´liser) e La partie de la mod´lisation qui est facile c’est celle qui e consiste ` abstraire la “vraie vie” a La partie qui est difficile c’est d’organiser vos objets informatiques (abstraire des objets abstraits...) (d’autant que c’est parfois arbitraire et vexatoire). Mais Caml vous a tellement habitu´ ` l’arbitraire et au ea vexatoire que vous savez bien faire. Le message, c’est qu’une bonne mod´lisation objet ce n’est pas e (uniquement) d’utiliser une super classe List pleine d’h´ritage et e de polymorphisme pour ´muler le (non moins super) syst`me de e e types de Caml. Je veux un bon mod`le de la vraie vie. e
PPOOGL 30

Exemples de mod´lisation OO e
O` vos coll`gues de l’an dernier illustrent tout ce qu’il ne faut pas u e faire, en attendant que ce soit vous.

PPOOGL

31

Un exemple facile

Un jeu de strat´gie/plateau en r´seau, dans lequel diff´rents corps e e e d’arm´e se bastonnent sur un terrain joliment quadrill´. e e

PPOOGL

32

Et voila ce qu’ils m’ont fait
Plateau
+cases: Case[][] = +tour_de_jeu(): void +afficher(): void

Case
+plaine: boolean = +montagne: boolean = +mer: boolean = +occupant: Unite

Unite
+type: String +volant: boolean = +flottant: boolean = +vitesse: double = +force_de_frappe: int = +consommation_essence: double

´crire la proc´dure afficher() e e ´crire la proc´dure tour de jeu() e e ajouter un v´hicule amphibie qui a deux vitesses et deux e consommations diff´rentes suivant qu’il est sur terre ou sur e mer. Vous avez remarqu´ que Case et Unit´ n’ont pas de m´thode ? e e e
PPOOGL 33

Une vraie mod´lisation objet e

Faire un graphe d’h´ritage pour les cases e Faire un graphe d’h´ritage pour les unit´s e e ´ Ecrire la proc´dure d’affichage. L’affichage est de la e responsabilit´ de qui ? e Qui a la responsabilit´ de connaitre les diff´rentes vitesses ? e e ajouter un v´hicule amphibie qui a deux vitesses et deux e consommations diff´rentes suivant qu’il est sur terre et sur e mer.

PPOOGL

34

En UML, avec des paquetages
Unites

Plateau
+taille +cases: Case[][] +unites: Unite[][]

Unite
+x +y +camp +AfficheToi()

Cases

UniteTerrestre Case
+AfficheToi() +vitesseSurTerre

UniteMaritime
+AfficheToi()()

CaseMer
-profondeur +AfficheToi()

CaseTerre
+elevation +proprietaire +AfficheToi()

Troufion
+AfficheToi()

Tank
+NombresObus +AfficheToi()

PPOOGL

35

Les probl`mes durs qui restent e

Deux unit´s se retrouvent sur la mˆme case et se bastonnent. e e C’est de la responsabilit´ de qui ? e Dans ce cas l`, on n’y coupe pas ` avoir plein de if dans le a a code. Toutefois on saura faire du code qui, en cas d’oubli d’un cas, a un comportement par d´faut acceptable. e Et ainsi le jour de la soutenance, F2D n’y verra que du feu.

PPOOGL

36

Pour en finir avec l’UML

On a vu trois des boutons du mode UML de dia... Il en reste juste 26 autres. Ceux qui sont ´ventuellement utiles : e Paquetages. Association, aggr´gation et composition : variation sur has a. e Tapez “UML” et l’un de ces trois mots dans Google et il vous en dira plus. Pas bien support´s par dia2code en tout cas. e

PPOOGL

37

Un exemple difficile

Un ´diteur de partitions musicales proche de l’intuition des e compositeurs. Qu’est-ce qu’un air ? Qu’est-ce qu’une m´lodie ? e Qu’est-ce qu’un accompagnement ? Qu’est-ce qu’un accord ? Difficile car les objets sont tous abstraits, mais pas informatiques pour autant (pas des listes et des foncteurs).

PPOOGL

38

Un exemple int´ressant e

Un moteur 3D anim´ par des mod`les physiques e e Une partie ` mod´liser en copiant la vraie vie a e Une partie du mod`le qui ne contient que des objets e informatiques Partage des responsabilit´s pas toujours ´vident e e

Celui-l` je veux bien que vous le refassiez cette ann´e. a e

PPOOGL

39

Conclusion

PPOOGL

40

Les avantages de l’approche OO

moins d’erreurs grˆce ` l’encapsulation a a moins de boulot grˆce ` la r´utilisation a a e

PPOOGL

41

Pas convaincus, vous voulez toujours utiliser OCaml
Vous allez commencer par venir pleurer “Si j’avais un vrai langage avec des fonctions d’ordre sup´rieur et des foncteurs, e je pourrais mod´liser tout vachement mieux qu’avec ces objets e ripoux”. Ce ne sera pas vrai. Vous allez ensuite cr´er une super classe Liste, une super e classe Fonction d’ordre sup´rieur, et une super classe e Foncteur, et ensuite vous ferez du Caml en Java. Ce ne sera pas bien. Le but c’est qu’apr`s ce cours, si vous avez un probl`me qui e e est naturellement OO, vous le voyiez et vous le traitiez en u OO. Fˆt-ce en Ocaml. Tous les probl`mes ne sont pas naturellement OO ! Mais je e veillerai ` ce que les vˆtres le soient. a o

PPOOGL

42

Mais laissons plutˆt la parole ` Xavier Leroy o a

PPOOGL

43