Introduction à la Programmation par Objets avec Smalltalk

118
Introduction à la Introduction à la Programmation par Objets Programmation par Objets avec Smalltalk avec Smalltalk Noury Bouraqadi Noury Bouraqadi http://csl.ensm-douai.fr/noury http://csl.ensm-douai.fr/noury Option ISIC – 1ère année Option ISIC – 1ère année Ecole des Mines de Douai Ecole des Mines de Douai

description

Introduction à la Programmation par Objets avec Smalltalk. Noury Bouraqadi http://csl.ensm-douai.fr/noury Option ISIC – 1ère année Ecole des Mines de Douai. Concepts fondamentaux. Objet Encapsulation Messages Polymorphisme Identité / égalité Classes Instances - PowerPoint PPT Presentation

Transcript of Introduction à la Programmation par Objets avec Smalltalk

Page 1: Introduction à la Programmation par Objets avec Smalltalk

1

Introduction à laIntroduction à laProgrammation par ObjetsProgrammation par Objets

avec Smalltalkavec SmalltalkNoury BouraqadiNoury Bouraqadi

http://csl.ensm-douai.fr/nouryhttp://csl.ensm-douai.fr/noury

Option ISIC – 1ère annéeOption ISIC – 1ère annéeEcole des Mines de DouaiEcole des Mines de Douai

Page 2: Introduction à la Programmation par Objets avec Smalltalk

2

Concepts fondamentauxConcepts fondamentaux

ObjetObjet EncapsulationEncapsulation MessagesMessages PolymorphismePolymorphisme Identité / égalitéIdentité / égalité

ClassesClasses InstancesInstances Création et initialisation d'objetsCréation et initialisation d'objets ChampsChamps MéthodesMéthodes

HéritageHéritage Sous-classe / Super-classeSous-classe / Super-classe RedéfinitionRedéfinition Liaison dynamiqueLiaison dynamique

ExceptionsExceptions

Page 3: Introduction à la Programmation par Objets avec Smalltalk

3

Concepts fondamentauxConcepts fondamentauxavec le langageavec le langage

SmalltalkSmalltalk

Page 4: Introduction à la Programmation par Objets avec Smalltalk

4

ObjetObjet

Objet = représentation informatique d'une entité du mondeObjet = représentation informatique d'une entité du monde Pas de fossé entre réalité et programmePas de fossé entre réalité et programme Programme à base d'objet = simulation de la réalitéProgramme à base d'objet = simulation de la réalité

Exemples :Exemples : Une lampeUne lampe Un feu tricoloreUn feu tricolore Une voitureUne voiture Un nombreUn nombre Un caractèreUn caractère Un tableau d'entiersUn tableau d'entiers Une couleurUne couleur

Page 5: Introduction à la Programmation par Objets avec Smalltalk

5

Utiliser un objet = lui envoyer un messageUtiliser un objet = lui envoyer un message

1) Message

2) Traitement

3) Résultat

L'ensemble des message acceptés par un objet est fini

Page 6: Introduction à la Programmation par Objets avec Smalltalk

6

Exemple de messagesExemple de messages

allumer

éteindre

l'heure?

Page 7: Introduction à la Programmation par Objets avec Smalltalk

7

Messages avec 0, 1 ou plusieurs argumentsMessages avec 0, 1 ou plusieurs arguments

allumer

remplacer couleurpar : vert

Page 8: Introduction à la Programmation par Objets avec Smalltalk

8

Variables stockent des référencent d'objetsVariables stockent des référencent d'objets Les références sont analogues aux pointeurs du langage CLes références sont analogues aux pointeurs du langage C

Affectation = obtention d'une référence sur le Affectation = obtention d'une référence sur le mêmemême objet objet

Exemple :Exemple :| x y || x y |"affection à x de la référence d'un objet lampe""affection à x de la référence d'un objet lampe"x allumer. "la lampe s'allume"x allumer. "la lampe s'allume"y := x. y := x. y eteindre. "la lampe s'éteint"y eteindre. "la lampe s'éteint"

Variables et références d'objetsVariables et références d'objets

envois demessages affectation

déclaration de variables temporaires

commentaires

Page 9: Introduction à la Programmation par Objets avec Smalltalk

9

|x y||x y|

xx

yy nil

• Toute variable nouvellement déclarée est initialisée avec la référence de l'objet nil.

• nil ne sais répondre à quasiment aucunmessage = erreur si utilisation

Page 10: Introduction à la Programmation par Objets avec Smalltalk

10

"affectation à x de la référence "affectation à x de la référence d'un objet lampe"d'un objet lampe"

xx

yy nil

Page 11: Introduction à la Programmation par Objets avec Smalltalk

11

x allumerx allumer

xx

yy nil

allumer

Page 12: Introduction à la Programmation par Objets avec Smalltalk

12

y := xy := x

xx

yy

Page 13: Introduction à la Programmation par Objets avec Smalltalk

13

y éteindrey éteindre

xx

yy éteindre

Page 14: Introduction à la Programmation par Objets avec Smalltalk

14

y éteindrey éteindre

xx

yy éteindre

Page 15: Introduction à la Programmation par Objets avec Smalltalk

15

Un objet possède une mémoire Un objet possède une mémoire

Qu'est-ce que la mémoire d'un objet ?Qu'est-ce que la mémoire d'un objet ? Une suite de variables appelées Une suite de variables appelées champschamps

Qu'est ce qui est mémorisé ?Qu'est ce qui est mémorisé ? des données = références vers d'autres objetsdes données = références vers d'autres objets

Qui a accès à la mémoire d'un objet ?Qui a accès à la mémoire d'un objet ? L'objet lui-même uniquementL'objet lui-même uniquement Les données sont privées (Encapsulation)Les données sont privées (Encapsulation)

Quand a lieu l'accès à la mémoire ?Quand a lieu l'accès à la mémoire ? Lors des traitements des messagesLors des traitements des messages

Page 16: Introduction à la Programmation par Objets avec Smalltalk

16

Accès à la mémoire d'un objetAccès à la mémoire d'un objet

remplacer couleurpar : vert

MémoireMémoireCouleurCouleur jaunejaune

Page 17: Introduction à la Programmation par Objets avec Smalltalk

17

Accès à la mémoire d'un objetAccès à la mémoire d'un objet

remplacer couleurpar : vert

MémoireMémoireCouleurCouleur vertvert

Page 18: Introduction à la Programmation par Objets avec Smalltalk

18

Accès à la mémoire d'un objetAccès à la mémoire d'un objet

remplacer couleurpar : vert

OK

MémoireMémoireCouleurCouleur vertvert

Page 19: Introduction à la Programmation par Objets avec Smalltalk

19

Accès à la mémoire d'un objetAccès à la mémoire d'un objet

couleur ?

vert

MémoireMémoireCouleurCouleur vertvert

Page 20: Introduction à la Programmation par Objets avec Smalltalk

20

Traitements effectués par un objetTraitements effectués par un objet

Traitements en réponse à un message uniquementTraitements en réponse à un message uniquement Méthodes : Analogie avec les fonctionsMéthodes : Analogie avec les fonctions

Types de traitements possibles :Types de traitements possibles : Modifier le contenu de la mémoireModifier le contenu de la mémoire Lire le contenu de la mémoireLire le contenu de la mémoire Créer de nouveaux objetsCréer de nouveaux objets Envoyer des messages à d'autres objetsEnvoyer des messages à d'autres objets

Messages envoyés lors des traitementsMessages envoyés lors des traitements arguments des messagesarguments des messages

valeurs temporairesvaleurs temporaires extraits de la mémoire de l'objet (champs)extraits de la mémoire de l'objet (champs)

Page 21: Introduction à la Programmation par Objets avec Smalltalk

21

Exemple de traitementsExemple de traitements

MémoireMémoirelampeCourantelampeCourante

lampeRougelampeRouge

lampeOrangelampeOrange

LampeVerteLampeVerte

allumer lampesuivante

Page 22: Introduction à la Programmation par Objets avec Smalltalk

22

Exemple de traitementsExemple de traitements

MémoireMémoirelampeCourantelampeCourante

lampeRougelampeRouge

lampeOrangelampeOrange

LampeVerteLampeVerte

allumer lampesuivante

1. éteindre lampe courante2. déterminer lampe suivante3. mémoriser nouvelle lampe courante4. allumer nouvelle lampe courante

Page 23: Introduction à la Programmation par Objets avec Smalltalk

23

Traitements en réponse au messageTraitements en réponse au messageallumerLampeSuivanteallumerLampeSuivante

"1. éteindre la lampe courante""1. éteindre la lampe courante"lampeCourante eteindre.lampeCourante eteindre.

"2. déterminer la lampe suivante (message envoyé à self)""2. déterminer la lampe suivante (message envoyé à self)""3. mémoriser la nouvelle lampe courante (affectation)""3. mémoriser la nouvelle lampe courante (affectation)"lampeCourante := lampeCourante := selfself trouverLampeSuivante. trouverLampeSuivante.

"allumer la nouvelle lampe courante""allumer la nouvelle lampe courante"lampeCourante allumer.lampeCourante allumer.

Pseudo-Variable.Référence l'objet quiexécute le traitement

Page 24: Introduction à la Programmation par Objets avec Smalltalk

24

lampeCourante eteindrelampeCourante eteindre

MémoireMémoirelampeCourantelampeCourante

lampeRougelampeRouge

lampeOrangelampeOrange

LampeVerteLampeVerte

allumer lampesuivante

étei

ndre

Page 25: Introduction à la Programmation par Objets avec Smalltalk

25

lampeCourante eteindrelampeCourante eteindre

MémoireMémoirelampeCourantelampeCourante

lampeRougelampeRouge

lampeOrangelampeOrange

LampeVerteLampeVerte

allumer lampesuivante

étei

ndre

Page 26: Introduction à la Programmation par Objets avec Smalltalk

26

self trouverLampeSuivanteself trouverLampeSuivante

MémoireMémoirelampeCourantelampeCourante

lampeRougelampeRouge

lampeOrangelampeOrange

LampeVerteLampeVerte

allumer lampesuivante

trouver lampe suivante

Page 27: Introduction à la Programmation par Objets avec Smalltalk

27

lampeCourante := lampeCourante := self trouverLampeSuivanteself trouverLampeSuivante

MémoireMémoirelampeCourantelampeCourante

lampeRougelampeRouge

lampeOrangelampeOrange

LampeVerteLampeVerte

allumer lampesuivante

Page 28: Introduction à la Programmation par Objets avec Smalltalk

28

lampeCourante allumerlampeCourante allumer

MémoireMémoirelampeCourantelampeCourante

lampeRougelampeRouge

lampeOrangelampeOrange

LampeVerteLampeVerte

allumer lampesuivante

allumer

Page 29: Introduction à la Programmation par Objets avec Smalltalk

29

lampeCourante allumerlampeCourante allumer

MémoireMémoirelampeCourantelampeCourante

lampeRougelampeRouge

lampeOrangelampeOrange

LampeVerteLampeVerte

allumer lampesuivante

allumer

Page 30: Introduction à la Programmation par Objets avec Smalltalk

30

Récapitulatif sur la notion objetRécapitulatif sur la notion objet

Un objet possède une référenceUn objet possède une référence Stockée dans les variables et les champsStockée dans les variables et les champs

Un objet possède des champsUn objet possède des champs Mémoire privée (encapsulation)Mémoire privée (encapsulation)

Seul l'objet peut accéder à sa propre mémoireSeul l'objet peut accéder à sa propre mémoire Les champs contiennent des références d'autres objetsLes champs contiennent des références d'autres objets

Un objet sait répondre à un ensemble de messagesUn objet sait répondre à un ensemble de messages Réponse à message = exécution d'une méthodeRéponse à message = exécution d'une méthode

Retour du résultat de l'exécution de la méthodeRetour du résultat de l'exécution de la méthode

Page 31: Introduction à la Programmation par Objets avec Smalltalk

31

Objets de la même familleObjets de la même famille

Même famille = des points communMême famille = des points commun Savent répondre au même ensemble de messagesSavent répondre au même ensemble de messages Mêmes traitements en réponse aux mêmes messageMêmes traitements en réponse aux mêmes message Même structure de leur mémoires respectivesMême structure de leur mémoires respectives

Risque de duplication des descriptionsRisque de duplication des descriptions Nécessité de factoriser pour éviter la duplication de codeNécessité de factoriser pour éviter la duplication de code Factorisation à l'aide du concept de Factorisation à l'aide du concept de ClasseClasse

couleurcouleur rougerougeestAllumeeestAllumee truetrue

couleurcouleur vertvertestAllumeeestAllumee falsefalse

Page 32: Introduction à la Programmation par Objets avec Smalltalk

32

ClasseClasse

Fabrique d'objetsFabrique d'objets Responsable de la création des objetsResponsable de la création des objets Les objets créés par une classe = instance de cette classeLes objets créés par une classe = instance de cette classe

Moule d'objetsMoule d'objets Description de la structure mémoire de ses instancesDescription de la structure mémoire de ses instances

Liste des champs (généralement nommés)Liste des champs (généralement nommés) Analogie avec les structures du langage CAnalogie avec les structures du langage C

Description des traitements réalisés par ses instancesDescription des traitements réalisés par ses instances Méthodes : Analogie avec fonctions du langage CMéthodes : Analogie avec fonctions du langage C

Description des messages valides pour ses instancesDescription des messages valides pour ses instances Signatures des méthodes (nom, types…)Signatures des méthodes (nom, types…)

Page 33: Introduction à la Programmation par Objets avec Smalltalk

33

• couleur• estAllumee

couleur: uneCouleureteindre

allumerestAllumee := true

Exemple de classeExemple de classe Définitionsdes méthodes

Déclarationsdes champs

couleurcouleur rougerougeestAllumeeestAllumee truetrue

couleurcouleur vertvertestAllumeeestAllumee truetrue

instance de

| r v |r := Lampe new.r couleur: (Color red).r allumer.v := Lampe new.v couleur: (Color green).v allumer.

Page 34: Introduction à la Programmation par Objets avec Smalltalk

34

PolymorphismePolymorphisme

Une lampe et une radioUne lampe et une radio savent répondre aux 2 messages :savent répondre aux 2 messages :

allumerallumer éteindreéteindre

Mais traitements (et structures) différentsMais traitements (et structures) différents lampe et radio sont instances de 2 classes différenteslampe et radio sont instances de 2 classes différentes

• couleur• estAllumee

couleur: uneCouleureteindre

allumerestAllumee := true

• canal• frequence• volume

canal: unCanaleteindre

allumer "démarrer ampli" volume := …

Page 35: Introduction à la Programmation par Objets avec Smalltalk

35

Premiers pas en SmalltalkPremiers pas en SmalltalkIllustration avec Squeak (Un Smalltalk libre)Illustration avec Squeak (Un Smalltalk libre)

"Smalltalk is dangerous. It is a drug."Smalltalk is dangerous. It is a drug.My advice to you would be don't try it.My advice to you would be don't try it.It could ruin your life."It could ruin your life." Andy Bower Andy Bower

Page 36: Introduction à la Programmation par Objets avec Smalltalk

36

HistoriqueHistorique

Naissance au prestigieux Xerox PARCNaissance au prestigieux Xerox PARC

Un langage rôdéUn langage rôdé première version en 1972première version en 1972 bases définitives en 1980bases définitives en 1980

Premier langage à objets modernePremier langage à objets moderne Utilisation industrielleUtilisation industrielle Outils de développement en équipeOutils de développement en équipe

(depuis les années 80)(depuis les années 80)

Première version open-source en 1997Première version open-source en 1997

Page 37: Introduction à la Programmation par Objets avec Smalltalk

37

Un langage simple à apprendre - 1Un langage simple à apprendre - 1

Syntaxe simple Syntaxe simple proche du langage naturelproche du langage naturel mots et caractères spéciaux = 1 transparentmots et caractères spéciaux = 1 transparent permet de focaliser sur les concepts et la conceptionpermet de focaliser sur les concepts et la conception

Typage dynamiqueTypage dynamique pas de type à saisirpas de type à saisir contrôle de type à l'exécutioncontrôle de type à l'exécution

Tous les sources sont disponiblesTous les sources sont disponibles y compris les bibliothèques de basey compris les bibliothèques de base

Page 38: Introduction à la Programmation par Objets avec Smalltalk

38

Un langage simple à apprendre - 2Un langage simple à apprendre - 2

Très peu de conceptsTrès peu de concepts Objet, Classe, Message, VariableObjet, Classe, Message, Variable Toute méthode retourne une valeurToute méthode retourne une valeur

Règles de visibilité fixesRègles de visibilité fixes Classes et Méthodes accessibles par tout le mondeClasses et Méthodes accessibles par tout le monde Champs accessibles uniquement par leur propriétaireChamps accessibles uniquement par leur propriétaire

Uniformité (sans exception)Uniformité (sans exception) Tout est objetTout est objet

nombres, outils de dév., le compilateur, …nombres, outils de dév., le compilateur, … 1 action = 1 message1 action = 1 message

y compris la création d'objety compris la création d'objet

Page 39: Introduction à la Programmation par Objets avec Smalltalk

39

Un langage très puissant - 1Un langage très puissant - 1

Bibliothèque riche copiée Bibliothèque riche copiée collections, streams, …collections, streams, …

Langage ouvert (capacités réflexives)Langage ouvert (capacités réflexives) Nombreux éléments/concepts du langage accessiblesNombreux éléments/concepts du langage accessibles

Langage : Classe, méthode, … Langage : Classe, méthode, … Exécution : Pile d'exécution, Contrôle de type, …Exécution : Pile d'exécution, Contrôle de type, … Outils : Compilateur, Débugger, …Outils : Compilateur, Débugger, …

ExtensibleExtensible Code éléments du langage disponibleCode éléments du langage disponible Possibilité de le modifier/étendrePossibilité de le modifier/étendre

Page 40: Introduction à la Programmation par Objets avec Smalltalk

40

Un langage très puissant – 2Un langage très puissant – 2Quelques outils usuels de SmalltalkQuelques outils usuels de Smalltalk

Navigation/CodageNavigation/Codage Browsers: System, Hierarchy, Class, Category, Refactoring, …Browsers: System, Hierarchy, Class, Category, Refactoring, … method Implementors, Method Findermethod Implementors, Method Finder message Sendersmessage Senders

Débogue Débogue DebuggerDebugger InspectorInspector Test Runner (SUnit)Test Runner (SUnit) WorkspaceWorkspace

Gestion de codeGestion de code ProjectProject Change Set, Change SorterChange Set, Change Sorter Gestion de version automatiqueGestion de version automatique fileIn/fileOut, FileListfileIn/fileOut, FileList

……

Page 41: Introduction à la Programmation par Objets avec Smalltalk

41

Syntaxe SmalltalkSyntaxe Smalltalk

Mots réservésMots réservés nilnil  objet indéfini (valeur par défaut des champs et variables)  objet indéfini (valeur par défaut des champs et variables) truetrue, , falsefalse objets booléens objets booléens self  self   (l'objet lui-même)  (l'objet lui-même) supersuper (l'objet dans le contexte de la superclasse) (l'objet dans le contexte de la superclasse) thisContextthisContext partie de la pile d'exécution représentant la méthode courante partie de la pile d'exécution représentant la méthode courante

Caractères réservésCaractères réservés := :=  (ou (ou ) affectation) affectation ^  ^   (ou  (ou ) = return) = return || varTemp1 varTemp2 varTemp3 varTemp1 varTemp2 varTemp3 || $$    caractère caractère #  #  littéral littéral .. termine toute expression termine toute expression ; cascade de messages; cascade de messages ( )( ) précédence précédence [ ][ ] bloc de code  bloc de code " " commentairecommentaire" "  ' ' chaîne de caractèrechaîne de caractère ' '

Page 42: Introduction à la Programmation par Objets avec Smalltalk

42

Modèle d'exécution SmalltalkModèle d'exécution Smalltalk

4 fichiers fondamentaux4 fichiers fondamentaux Machine virtuelle (.exe) Machine virtuelle (.exe) Image mémoire (.image)Image mémoire (.image) changements effectués (.change)changements effectués (.change) code source des bibliothèques de base (.source)code source des bibliothèques de base (.source)

Gestion automatique de la mémoireGestion automatique de la mémoire Garbage collectorGarbage collector

Tout se passe à l'exécutionTout se passe à l'exécution Développement incrémentalDéveloppement incrémental Sauvegarde automatique des changements (.change)Sauvegarde automatique des changements (.change)

Perte de code quasi-impossiblePerte de code quasi-impossible

Page 43: Introduction à la Programmation par Objets avec Smalltalk

43

4 fichiers fondamentaux4 fichiers fondamentaux

Machine virtuelle (.exe)Machine virtuelle (.exe) Change suivante les plateformes (Mac, Linux, Windows, Palm)Change suivante les plateformes (Mac, Linux, Windows, Palm) Les autres fichiers sont portablesLes autres fichiers sont portables

Fichier image mémoire (.image)Fichier image mémoire (.image) Lecture automatique + enregistrement à la demandeLecture automatique + enregistrement à la demande "Photographie" de la mémoire à l'instant de la sauvegarde"Photographie" de la mémoire à l'instant de la sauvegarde Possibilité d'avoir plusieurs fichiers imagesPossibilité d'avoir plusieurs fichiers images

Fichier avec le code source des changements effectués (.change)Fichier avec le code source des changements effectués (.change) 1 fichier .change par fichier image (même nom)1 fichier .change par fichier image (même nom) Enregistrement automatiqueEnregistrement automatique

Sauvegarde de toutes les opérations réalisées !!Sauvegarde de toutes les opérations réalisées !! Lecture à la demandeLecture à la demande

Récupération Récupération manuellemanuelle en cas d'arrêt intempestif en cas d'arrêt intempestif

Fichier sources standardsFichier sources standards Lecture seuleLecture seule

Page 44: Introduction à la Programmation par Objets avec Smalltalk

44

Squeak 3.6 au premier démarrageSqueak 3.6 au premier démarrage

Page 45: Introduction à la Programmation par Objets avec Smalltalk

45

Accès aux outilsAccès aux outils

Page 46: Introduction à la Programmation par Objets avec Smalltalk

46

Menu "World"Menu "World"

Page 47: Introduction à la Programmation par Objets avec Smalltalk

47

Browser - 1Browser - 1

Page 48: Introduction à la Programmation par Objets avec Smalltalk

48

Browser - 2Browser - 2

Découpage logiqueDécoupage logique Catégories de classes Catégories de classes Catégories de méthodesCatégories de méthodes

CompilationCompilation Transparente à la voléeTransparente à la volée IncrémentaleIncrémentale versions des méthodesversions des méthodes

Utilisation du menu "accept"Utilisation du menu "accept"

Page 49: Introduction à la Programmation par Objets avec Smalltalk

49

Exemple de création d'une classe - 1Exemple de création d'une classe - 1

1

2

3

Page 50: Introduction à la Programmation par Objets avec Smalltalk

50

Exemple de création d'une classe - 2Exemple de création d'une classe - 2

Object subclass: #BankAccountObject subclass: #BankAccountinstanceVariableNames: 'number balance'instanceVariableNames: 'number balance'classVariableNames: 'CreatedAccounts'classVariableNames: 'CreatedAccounts'poolDictionaries: ''poolDictionaries: ''category: 'Examples'category: 'Examples'

Page 51: Introduction à la Programmation par Objets avec Smalltalk

51

Exemple de définition d'une méthode - 1Exemple de définition d'une méthode - 1

1

2

5

34

Page 52: Introduction à la Programmation par Objets avec Smalltalk

52

Exemple de définition d'une méthode - 2Exemple de définition d'une méthode - 2

deposit: amountdeposit: amount"Noury Bouraqadi""Noury Bouraqadi"

amount > 0 ifFalse: [amount > 0 ifFalse: [^self notify: 'Amount should be positive'].^self notify: 'Amount should be positive'].

balance := balance + amountbalance := balance + amount

Page 53: Introduction à la Programmation par Objets avec Smalltalk

53

Exemple de messages Exemple de messages SmalltalkSmalltalk

||myAccount yourAccountmyAccount yourAccount||""creates a new accountcreates a new account""yourAccount yourAccount :=:= BankAccount BankAccount new.new. yourAccount yourAccount deposit:deposit: 2000 2000..myAccount myAccount :=:= BankAccount BankAccount new.new.yourAccount yourAccount transfer:transfer: 1500 1500 to:to: myAccount myAccount..

Page 54: Introduction à la Programmation par Objets avec Smalltalk

54

Transcript = "Console"Transcript = "Console"

Page 55: Introduction à la Programmation par Objets avec Smalltalk

55

Workspace : exécuter, afficher, inspecter…Workspace : exécuter, afficher, inspecter…

Page 56: Introduction à la Programmation par Objets avec Smalltalk

56

Inspecteur & explorateurInspecteur & explorateur

Donne accès à la structure d'un objetDonne accès à la structure d'un objet Ouverture par Ouverture par

messagemessage menumenu

Zones de travail

Page 57: Introduction à la Programmation par Objets avec Smalltalk

57

File List : Gestionnaire de fichierFile List : Gestionnaire de fichier

Page 58: Introduction à la Programmation par Objets avec Smalltalk

58

Débogueur – Placer un point d'arrêtDébogueur – Placer un point d'arrêt

Point d'arrêt = self haltPoint d'arrêt = self halt

Page 59: Introduction à la Programmation par Objets avec Smalltalk

59

Débogueur– OuvertureDébogueur– Ouverture

Page 60: Introduction à la Programmation par Objets avec Smalltalk

60

Le Débogueur !Le Débogueur !

Page 61: Introduction à la Programmation par Objets avec Smalltalk

61

Eléments de base deEléments de base deSmalltalkSmalltalk

Page 62: Introduction à la Programmation par Objets avec Smalltalk

62

Conditionnelle (le "if")Conditionnelle (le "if")

Booléens = objets true et falseBooléens = objets true et false

Conditionnels = messages destinés aux booléensConditionnels = messages destinés aux booléens

3 formes = 3 méthodes3 formes = 3 méthodes (expressionBooléenne) ifTrue: ["bloc de code"](expressionBooléenne) ifTrue: ["bloc de code"] (expressionBooléenne) ifFalse: ["bloc de code"](expressionBooléenne) ifFalse: ["bloc de code"] (expressionBooléenne) (expressionBooléenne)

ifTrue: ["bloc de code"]ifTrue: ["bloc de code"]ifFalse: ["bloc alternatif"]ifFalse: ["bloc alternatif"]

Page 63: Introduction à la Programmation par Objets avec Smalltalk

63

BouclesBoucles

Boucles = MessagesBoucles = Messages

"for""for" 1 to: 10 do: [ :i |1 to: 10 do: [ :i | "traitement boucle"] "traitement boucle"] 15 timesRepeatDo: ["bloc de code répété"]15 timesRepeatDo: ["bloc de code répété"]

"while""while" ["expression booléenne"] while["expression booléenne"] whileTrueTrue: ["bloc de code"]: ["bloc de code"] ["expression booléenne"] while["expression booléenne"] whileFalseFalse: ["bloc de code"]: ["bloc de code"]

Page 64: Introduction à la Programmation par Objets avec Smalltalk

64

CollectionsCollections

CollectionCollection Notion plus générale que "tableau"Notion plus générale que "tableau" Objet qui référence un nombre arbitraire d'objetsObjet qui référence un nombre arbitraire d'objets

Ces objets sont appelés éléments de de la collectionCes objets sont appelés éléments de de la collection

Différents classes de collectionsDifférents classes de collections Collections ordonnées ou pasCollections ordonnées ou pas Nombre d'éléments extensible ou fixeNombre d'éléments extensible ou fixe Différentes façons d'accéder aux élémentsDifférentes façons d'accéder aux éléments

Par indicePar indice Avec une clé (dictionnaires)Avec une clé (dictionnaires) Par parcours seulement (ensembles)Par parcours seulement (ensembles)

Page 65: Introduction à la Programmation par Objets avec Smalltalk

65

Quelques classes de collectionsQuelques classes de collections Collections ordonnéesCollections ordonnées

Taille fixeTaille fixe ArrayArray

Taille variableTaille variable OrderedCollection OrderedCollection SortedCollectionSortedCollection (éléments automatiquement triés)(éléments automatiquement triés)

Collections non-ordonnées (taille variable)Collections non-ordonnées (taille variable) EnsemblesEnsembles

Set (Deux éléments ne peuvent pas être égaux)Set (Deux éléments ne peuvent pas être égaux) IdentitySet (Un élément ne peut pas apparaître deux fois) IdentitySet (Un élément ne peut pas apparaître deux fois)

Dictionnaires (table de correspondance clé-valeur)Dictionnaires (table de correspondance clé-valeur) Dictionary (Deux clés ne peuvent pas être égales)Dictionary (Deux clés ne peuvent pas être égales) IdentityDictionary (Une même clé ne peut être utilisée deux fois)IdentityDictionary (Une même clé ne peut être utilisée deux fois)

Page 66: Introduction à la Programmation par Objets avec Smalltalk

66

Accès aux collections à taille variableAccès aux collections à taille variable(ordonnées ou non)(ordonnées ou non)

add: unObjetadd: unObjet Ajoute unObjet à la collectionAjoute unObjet à la collection

addAll: collectionaddAll: collection Ajoute tous les éléments de la collectionAjoute tous les éléments de la collection

remove: unObjet ifAbsent: ["traitements"]remove: unObjet ifAbsent: ["traitements"] Retire unObjet de la collectionRetire unObjet de la collection Exécute le bloc de traitements si unObjet n'appartient pas à Exécute le bloc de traitements si unObjet n'appartient pas à

la collectionla collection remove: unObjetremove: unObjet

Erreur si unObjet n'appartient pas à la collectionErreur si unObjet n'appartient pas à la collection removeAll: collectionremoveAll: collection

Retire tous les éléments de la collectionRetire tous les éléments de la collection

Page 67: Introduction à la Programmation par Objets avec Smalltalk

67

Accès aux collections ordonnéesAccès aux collections ordonnées(de taille fixe ou variable)(de taille fixe ou variable)

firstfirst Retourne le premier élémentRetourne le premier élément

lastlast Retourne le dernier élémentRetourne le dernier élément

at: indiceat: indice Retourne l'élément dont la position correspond à indiceRetourne l'élément dont la position correspond à indice Erreur si indice est hors des limites de la collectionErreur si indice est hors des limites de la collection

premier indice = 1premier indice = 1 dernier indice = taille de la collectiondernier indice = taille de la collection

at: indice put: unObjetat: indice put: unObjet Stocke unObjet à la cellule dont le numéro est indice Stocke unObjet à la cellule dont le numéro est indice

Page 68: Introduction à la Programmation par Objets avec Smalltalk

68

Parcours des collections (boucles) - 1Parcours des collections (boucles) - 1

do: [:element| "traitements"]do: [:element| "traitements"] element = variable qui référence successivement les element = variable qui référence successivement les

différents éléments de la collectiondifférents éléments de la collection Les traitements définis dans le bloc sont exécutés Les traitements définis dans le bloc sont exécutés

successivement pour chaque élément de la collection.successivement pour chaque élément de la collection. select: [:element| "expression booléenne"]select: [:element| "expression booléenne"]

Retourne les éléments pour lesquels l'expression booléenne Retourne les éléments pour lesquels l'expression booléenne est vraie (true) est vraie (true)

reject: [:element | "expression booléenne " ]reject: [:element | "expression booléenne " ] inverse de selectinverse de select

collect: [:element| "traitements"]collect: [:element| "traitements"] Retourne une collection du même type que celle parcourueRetourne une collection du même type que celle parcourue avec les résultats des traitements pour chaque élément avec les résultats des traitements pour chaque élément

Page 69: Introduction à la Programmation par Objets avec Smalltalk

69

Parcours des collections (boucles) - 2Parcours des collections (boucles) - 2

detect: [:element | "expression booléenne"] detect: [:element | "expression booléenne"] ifNone: ["traitements alternatifs"]ifNone: ["traitements alternatifs"]

Retourne le 1er élément pour lequel l'expression booléenne Retourne le 1er élément pour lequel l'expression booléenne est vraieest vraie

Exécute le bloc de traitements alternatifs si l'expression Exécute le bloc de traitements alternatifs si l'expression booléenne est fausse pour tous les élémentsbooléenne est fausse pour tous les éléments

detect: [:element | "expression booléenne"]detect: [:element | "expression booléenne"] Provoque une erreur si aucun élément n'est trouvéProvoque une erreur si aucun élément n'est trouvé(expression booléen est toujours fausse)(expression booléen est toujours fausse)

Page 70: Introduction à la Programmation par Objets avec Smalltalk

70

Exemple de parcours d'une collectionExemple de parcours d'une collection

|notes total moyenne notesCorrectes noteEliminatoire ||notes total moyenne notesCorrectes noteEliminatoire |notes := Set new.notes := Set new.notes add: 12.notes add: 12.notes add: 6.5.notes add: 6.5.notes add: 15.notes add: 15.total = 0total = 0notes do: [:uneNote| total := total + uneNote].notes do: [:uneNote| total := total + uneNote].moyenne := total / (notes size).moyenne := total / (notes size).notesCorrectes := notes select: [:uneNote| uneNote >= 12].notesCorrectes := notes select: [:uneNote| uneNote >= 12].noteEliminatoire := notes detect: [:uneNote| uneNote < 8]noteEliminatoire := notes detect: [:uneNote| uneNote < 8]

ifNone: [nil].ifNone: [nil].

Page 71: Introduction à la Programmation par Objets avec Smalltalk

71

Manipulation des dictionnairesManipulation des dictionnaires

at: cléat: clé retourne la valeur (l'élément) associé à la cléretourne la valeur (l'élément) associé à la clé clé référence n'importe quel objetclé référence n'importe quel objet

at: clé ifAbsent: ["traitements"]at: clé ifAbsent: ["traitements"] Exécute les traitements du bloc si la clé n'est pas utilisée Exécute les traitements du bloc si la clé n'est pas utilisée

dans le dictionnaire dans le dictionnaire

at: clé put: valeurat: clé put: valeur valeur référence un objet quelconquevaleur référence un objet quelconque associe valeur à cléassocie valeur à clé Si la clé est déjà utilisée, l'ancienne valeur est remplacéeSi la clé est déjà utilisée, l'ancienne valeur est remplacée

removeKey: cléremoveKey: clé retire la clé et la valeur correspondanteretire la clé et la valeur correspondante

Page 72: Introduction à la Programmation par Objets avec Smalltalk

72

Parcours des dictionnaires (boucles)Parcours des dictionnaires (boucles)

keysAndValuesDo: [:clé :valeur| "traitements"]keysAndValuesDo: [:clé :valeur| "traitements"] parcourt le dictionnaireparcourt le dictionnaire exécute les traitements pour chaque couple clé-valeurexécute les traitements pour chaque couple clé-valeur

keysDo: [:clé | "traitements"]keysDo: [:clé | "traitements"] Exécute les traitements pour chaque cléExécute les traitements pour chaque clé

do: [:valeur| "traitements"]do: [:valeur| "traitements"] Exécute les traitements pour chaque valeurExécute les traitements pour chaque valeur

collect: [:valeur| "traitements"]collect: [:valeur| "traitements"] Retourne un ensemble (Set) avec les résultats des Retourne un ensemble (Set) avec les résultats des

traitements pour chaque valeurtraitements pour chaque valeur

Page 73: Introduction à la Programmation par Objets avec Smalltalk

73

Dictionnaires - ExempleDictionnaires - Exemple

|notesPromo||notesPromo|notesPromo := Dictionnaire new.notesPromo := Dictionnaire new.notesPromo at: 'Marie' put: 14.notesPromo at: 'Marie' put: 14.notesPromo at: 'Rémi' put: 12.notesPromo at: 'Rémi' put: 12.notePromo at: 'Didier' put: 16.notePromo at: 'Didier' put: 16.notesPromo keysAndValuesDo: [:nom :note|notesPromo keysAndValuesDo: [:nom :note|

Transcript cr.Transcript cr.Transcript show: nom.Transcript show: nom.Transcript tab.Transcript tab.trascript show: (note printString)]trascript show: (note printString)]

Page 74: Introduction à la Programmation par Objets avec Smalltalk

74

Collections - Autres messages validesCollections - Autres messages valides

Taille Taille sizesize isEmptyisEmpty

ConversionConversion asArrayasArray asOrderedCollectionasOrderedCollection asSetasSet

CopieCopie copyWith: unObjetcopyWith: unObjet

Retourne une collection du même type avec tous les éléments + Retourne une collection du même type avec tous les éléments + unObjetunObjet

copyWithout: unObjetcopyWithout: unObjet Retourne une collection du même type avec tous les éléments sauf Retourne une collection du même type avec tous les éléments sauf

unObjetunObjet

Page 75: Introduction à la Programmation par Objets avec Smalltalk

75

Envoi de messageEnvoi de message

Receveur = destinataire d'un messageReceveur = destinataire d'un message

Toute méthode retourne un résultatToute méthode retourne un résultat Par défaut c'est l'objet lui-même (self)Par défaut c'est l'objet lui-même (self)

Si la méthode ne se termine pas par un retourSi la méthode ne se termine pas par un retour le compilateur insère le compilateur insère ^self^self automatiquement automatiquement

Cascade de messageCascade de message Plusieurs messages destinés au même receveur Plusieurs messages destinés au même receveur Receveur écrit une seule foisReceveur écrit une seule fois Messages séparés par des point-virgulesMessages séparés par des point-virgules

compte deposit: 200compte deposit: 200; ; deposit: 50deposit: 50;; withdraw: 100 withdraw: 100

Page 76: Introduction à la Programmation par Objets avec Smalltalk

76

Méthodes et messages - 1Méthodes et messages - 1

Différents typesDifférents types UnaireUnaire

message sans argumentmessage sans argument uneCollection uneCollection sizesize

BinaireBinaire le sélecteur inclus un symbole non-alpha-numériquele sélecteur inclus un symbole non-alpha-numérique 1 1 ++ 2 2

Avec (1 ou plusieurs) mot-clésAvec (1 ou plusieurs) mot-clés Set Set new:new: 100 100 votreCompte votreCompte transferer:transferer: 50 50 vers:vers: monCompte monCompte

Page 77: Introduction à la Programmation par Objets avec Smalltalk

77

Méthodes et messages - 2Méthodes et messages - 2

Précédence :Précédence : de gauche à droitede gauche à droite messages unaires, puis binaires et enfin à mot-clémessages unaires, puis binaires et enfin à mot-clé

SélecteurSélecteur identifiant uniqueidentifiant unique instance de la classe Symbolinstance de la classe Symbol Exemple de sélecteursExemple de sélecteurs

sizesize ++ newnew:: transferertransferer::versvers::

Page 78: Introduction à la Programmation par Objets avec Smalltalk

78

Un peu plus loin avec SmalltalkUn peu plus loin avec Smalltalk

Page 79: Introduction à la Programmation par Objets avec Smalltalk

79

Définition d'un profDéfinition d'un prof

Champs :Champs : nomPrenomnomPrenom : String : String dateNaissancedateNaissance : Date : Date matieresEnseigneesmatieresEnseignees : Set of String : Set of String

Messages valides :Messages valides : nomPrenomnomPrenom (lecture nomPrenom) (lecture nomPrenom) nomPrenom: chaineDeCaracteresnomPrenom: chaineDeCaracteres (modif. nomPrenom) (modif. nomPrenom) dateNaissance: uneDatedateNaissance: uneDate (modif. dateNaissance) (modif. dateNaissance) ageage (calcul et retourne l'age) (calcul et retourne l'age) ajouteMatiere: nomMatiereajouteMatiere: nomMatiere (ajoute une matière) (ajoute une matière) enseigneMatiere: nomMatiereenseigneMatiere: nomMatiere (teste (teste si le prof enseigne si le prof enseigne

une matière)une matière)

Page 80: Introduction à la Programmation par Objets avec Smalltalk

80

Définition d'un élèveDéfinition d'un élève

Champs :Champs : nomPrenomnomPrenom : String : String dateNaissancedateNaissance : Date : Date notesnotes : Dictionary (nomMatiere : String -> note : Float) : Dictionary (nomMatiere : String -> note : Float)

Messages valides :Messages valides : nomPrenomnomPrenom (lecture nomPrenom) (lecture nomPrenom) nomPrenom: chaineDeCaracteresnomPrenom: chaineDeCaracteres (modif. nomPrenom) (modif. nomPrenom) dateNaissance: uneDatedateNaissance: uneDate (modif. dateNaissance) (modif. dateNaissance) ageage (calcul et retourne l'age) (calcul et retourne l'age) note: unReel matiere: nomMatierenote: unReel matiere: nomMatiere (ajout d'une note) (ajout d'une note) noteMatiere: nomMatierenoteMatiere: nomMatiere (lecture d'une note) (lecture d'une note) moyennemoyenne (calcule et retourne la moyenne) (calcule et retourne la moyenne)

Page 81: Introduction à la Programmation par Objets avec Smalltalk

81

Besoin de factoriser le codeBesoin de factoriser le code

Deux classes différentesDeux classes différentes Prof et EleveProf et Eleve

Mais, …Mais, … des champs identiques :des champs identiques :

nomPrenom : StringnomPrenom : String dateNaissance : DatedateNaissance : Date

et des méthodes identiques :et des méthodes identiques : nomPrenomnomPrenom nomPrenom: chaineDeCaracteresnomPrenom: chaineDeCaracteres dateNaissance: uneDatedateNaissance: uneDate ageage

Solution pour éviter la duplication de code : Solution pour éviter la duplication de code : l'héritagel'héritage

Page 82: Introduction à la Programmation par Objets avec Smalltalk

82

HéritageHéritage

Héritage = partage de codeHéritage = partage de code

Le code partagé est défini dans une classeLe code partagé est défini dans une classe La La super-classesuper-classe

Partage le code entre plusieurs classesPartage le code entre plusieurs classes Les Les sous-classessous-classes On dit : les sous-classes On dit : les sous-classes héritent dehéritent de la super-classe la super-classe

Page 83: Introduction à la Programmation par Objets avec Smalltalk

83

Prof et Eleve héritent de la classe PersonneProf et Eleve héritent de la classe Personne

PersonnenomPrenomdateNaissancenomPrenomnomPrenom: uneChainedateNaissance: uneDateage

ProfmatieresEnseigneesajouteMatiere: nomMatiereenseigneMatiere: nomMatiere

Elevenotesnote: unReel matiere: nomMatierenote: nomMatieremoyenne

Page 84: Introduction à la Programmation par Objets avec Smalltalk

84

Définition de la super-classe Personne Définition de la super-classe Personne

ObjectObject subclass: # subclass: #PersonnePersonneinstanceVariableNames: 'instanceVariableNames: 'nomPrenomnomPrenom dateNaissancedateNaissance''classVariableNames: ''classVariableNames: ''poolDictionaries: ''poolDictionaries: ''category: 'Exemple'category: 'Exemple'

Page 85: Introduction à la Programmation par Objets avec Smalltalk

85

Définition des sous-classes Prof et Eleve Définition des sous-classes Prof et Eleve

PersonnePersonne subclass: # subclass: #ProfProfinstanceVariableNames: 'instanceVariableNames: 'matieresEnseigneesmatieresEnseignees''classVariableNames: ''classVariableNames: ''poolDictionaries: ''poolDictionaries: ''category: 'Exemple'category: 'Exemple'

PersonnePersonne subclass: # subclass: #EleveEleveinstanceVariableNames: 'instanceVariableNames: 'notesnotes''classVariableNames: ''classVariableNames: ''poolDictionaries: ''poolDictionaries: ''category: 'Exemple'category: 'Exemple'

Page 86: Introduction à la Programmation par Objets avec Smalltalk

86

Conséquences de l'héritage - 1Conséquences de l'héritage - 1

Les instances des sous-classes disposent des champs Les instances des sous-classes disposent des champs déclarés dans les superclassesdéclarés dans les superclasses Champs d'une instance de Prof :Champs d'une instance de Prof :

nomPrenom, dateNaissancenomPrenom, dateNaissance, , matieresEnseigneesmatieresEnseignees

Champs d'une instance de Eleve :Champs d'une instance de Eleve : nomPrenom, dateNaissancenomPrenom, dateNaissance, , notesnotes

Page 87: Introduction à la Programmation par Objets avec Smalltalk

87

Conséquences de l'héritage - 2Conséquences de l'héritage - 2

Les instances des sous-classes savent répondre aux Les instances des sous-classes savent répondre aux messages correspondant aux méthodes des superclassesmessages correspondant aux méthodes des superclasses Message valides pour les instances de Prof : Message valides pour les instances de Prof :

nomPrenom, nomPrenom: uneChaine, dateNaissance: uneDate, age,

ajouteMatiere: nomMatiere, enseigneMatiere: ajouteMatiere: nomMatiere, enseigneMatiere: nomMatierenomMatiere

Messages valides pour les instances de Eleve : Messages valides pour les instances de Eleve : nomPrenom, nomPrenom: uneChaine, dateNaissance:

uneDate, age, note: unReel matiere: nomMatiere, note: nomMatiere, note: unReel matiere: nomMatiere, note: nomMatiere,

moyennemoyenne

Page 88: Introduction à la Programmation par Objets avec Smalltalk

88

L'héritage est transitifL'héritage est transitif

Si :Si : Eleve hérite de Personne Eleve hérite de Personne Eleve est une sous-classe Eleve est une sous-classe directedirecte de Personne de Personne

Et :Et : EleveSalarié hérite de Eleve EleveSalarié hérite de Eleve EleveSalarié est une sous-classe EleveSalarié est une sous-classe directedirecte de Eleve de Eleve

Alors :Alors : EleveSalarié hérite de Personne EleveSalarié hérite de Personne EleveSalarié est une sous-class EleveSalarié est une sous-class indirecteindirecte de Personne de Personne Les instances de EleveSalariéLes instances de EleveSalarié

Possèdent les champs déclarés par EleveSalarié et Possèdent les champs déclarés par EleveSalarié et toutes ses superclasses (Eleve, Personne, Object)toutes ses superclasses (Eleve, Personne, Object)

Savent répondre aux messages correspondants aux Savent répondre aux messages correspondants aux méthodes de EleveSalarié et toutes ses superclassesméthodes de EleveSalarié et toutes ses superclasses

Page 89: Introduction à la Programmation par Objets avec Smalltalk

89

Multiplicité d'héritageMultiplicité d'héritage

Une classe peut ne pas avoir de super-classesUne classe peut ne pas avoir de super-classes C'est une classe racine (de l'arbre d'héritage)C'est une classe racine (de l'arbre d'héritage)

Héritage simpleHéritage simple maxi 1 super-classe directe maxi 1 super-classe directe c'est le cas de Smalltalkc'est le cas de Smalltalk

Héritage multipleHéritage multiple possibilité d'avoir plusieurs super-classes directespossibilité d'avoir plusieurs super-classes directes

Page 90: Introduction à la Programmation par Objets avec Smalltalk

90

Quelle super-classe utiliser ?Quelle super-classe utiliser ?

Soit x une instance de la classe ASoit x une instance de la classe A On dit que On dit que x est un Ax est un A exemple : jean exemple : jean estest un Eleve un Eleve

Soit B une autre classeSoit B une autre classe B est une super-classe valide pour A si on peut dire que x B est une super-classe valide pour A si on peut dire que x

est un Best un B exemple 1 : jean exemple 1 : jean estest une Personne une Personne

Personne est une super-classe valide de ElevePersonne est une super-classe valide de Eleve exemple 2 : jean exemple 2 : jean n'est pasn'est pas une Voiture une Voiture

La classe Voiture n'est pas une super-classe valide de EleveLa classe Voiture n'est pas une super-classe valide de Eleve

Par défaut, utiliser Par défaut, utiliser ObjectObject Object définit diverses méthodes nécessaires à l'utilisation Object définit diverses méthodes nécessaires à l'utilisation

des objetsdes objets

Page 91: Introduction à la Programmation par Objets avec Smalltalk

91

Recherche de la méthode à exécuter - 1Recherche de la méthode à exécuter - 1

Method lookup =Method lookup = "La recherche de méthode" en anglais"La recherche de méthode" en anglais

La liaison message-méthode =La liaison message-méthode = Retrouver la méthode à exécuter en réponse à un messageRetrouver la méthode à exécuter en réponse à un message

La liaison La liaison peut-être dynamique peut-être dynamique

si la recherche est effectuée à l'exécutionsi la recherche est effectuée à l'exécution C'est le cas dans SmalltalkC'est le cas dans Smalltalk

ou statiqueou statique si la recherche est effectuée à la compilationsi la recherche est effectuée à la compilation

Page 92: Introduction à la Programmation par Objets avec Smalltalk

92

Recherche de la méthode à exécuter - 2Recherche de la méthode à exécuter - 2

Quand un objet reçoit un message,Quand un objet reçoit un message,

il cherche dans sa classe s'il y a une méthode avec le il cherche dans sa classe s'il y a une méthode avec le même sélecteurmême sélecteur

s'il ne la trouve pas, il poursuite la recherche dans la s'il ne la trouve pas, il poursuite la recherche dans la super-classe directesuper-classe directe

la recherche se poursuit de super-class en super-classe la recherche se poursuit de super-class en super-classe jusqu'à :jusqu'à : trouver une méthodetrouver une méthode

exécuter la méthode trouvéeexécuter la méthode trouvée l'échec de la recherche dans la super-classe racinel'échec de la recherche dans la super-classe racine

erreurerreur

Page 93: Introduction à la Programmation par Objets avec Smalltalk

93

PersonnenomPrenomdateNaissancenomPrenomnomPrenom: uneChainedateNaissance: uneDateage

Elevenotesnote: unReel matiere: nomMatierenote: nomMatieremoyenne

ageméthodeage ?

Non

méthode

age ?age

Recherche de la méthode à exécuterRecherche de la méthode à exécuter

sous-classe de

1 2

345

age

25instance de

Page 94: Introduction à la Programmation par Objets avec Smalltalk

94

Masquage & RedéfinitionMasquage & Redéfinition

Une sous-classe n'a pas le droit de déclarer un champ qui Une sous-classe n'a pas le droit de déclarer un champ qui a le même nom qu'un champ héritéa le même nom qu'un champ hérité EleveSalarié ne doit pas déclarer un champ nomPrenomEleveSalarié ne doit pas déclarer un champ nomPrenom

En revanche, une classe peut définir une méthode de En revanche, une classe peut définir une méthode de même sélecteur qu'une méthode héritéemême sélecteur qu'une méthode héritée On dit que la sous-classe On dit que la sous-classe redéfinitredéfinit la méthode en question la méthode en question EleveSalarié peut redéfinir la méthode moyenneEleveSalarié peut redéfinir la méthode moyenne

Page 95: Introduction à la Programmation par Objets avec Smalltalk

95

Réutilisation des méthodes masquéesRéutilisation des méthodes masquées

Redéfinition de la méthode moyenne dans EleveSalarieRedéfinition de la méthode moyenne dans EleveSalarie1.1. Effectue le calcul de la moyenne des notesEffectue le calcul de la moyenne des notes

Traitement identique pour les instances de EleveTraitement identique pour les instances de Eleve2.2. Ajoute un bonus : 1 pointAjoute un bonus : 1 point3.3. Retourne la moyenne amélioréeRetourne la moyenne améliorée

Comment éviter la duplication du code de l'étape 1 ?Comment éviter la duplication du code de l'étape 1 ? Réutiliser la méthode moyenne définie dans EleveRéutiliser la méthode moyenne définie dans Eleve Impossible avec l'envoi du message Impossible avec l'envoi du message moyennemoyenne à à selfself

Boucle infinieBoucle infinie

Solution : envoi de message à Solution : envoi de message à supersuper

Page 96: Introduction à la Programmation par Objets avec Smalltalk

96

La pseudo-variable superLa pseudo-variable super

super référence l'objet courant…super référence l'objet courant… Comme selfComme self

… … mais, dans le contexte de la super-classe…mais, dans le contexte de la super-classe… Début de la recherche de méthode dans la superclasse de Début de la recherche de méthode dans la superclasse de

la la classe qui contient l'envoi de messageclasse qui contient l'envoi de message Contrairement à self : début de la recherche toujours dans Contrairement à self : début de la recherche toujours dans

la classe de l'objetla classe de l'objet

… … et ne peut être utilisée que pour l'envoi de messageet ne peut être utilisée que pour l'envoi de message Contrairement à self qui peut être utilisée comme argument Contrairement à self qui peut être utilisée comme argument

ou comme valeur de retourou comme valeur de retour

Page 97: Introduction à la Programmation par Objets avec Smalltalk

97

Quelques méthodes fondamentalesQuelques méthodes fondamentales

Représentation textuelleReprésentation textuelle printOn: aStream (A redéfinitir)printOn: aStream (A redéfinitir) printString (Ne pas redéfinir)printString (Ne pas redéfinir)

Comparaison Comparaison ====

Teste l'identité. Ne pas redéfinir.Teste l'identité. Ne pas redéfinir. ==

Teste l'égalité. A redéfinir.Teste l'égalité. A redéfinir. besoin de redéfinir aussi la méthode hashbesoin de redéfinir aussi la méthode hash

CopieCopie shallowCopy (A redéfinir)shallowCopy (A redéfinir) deepCopy (A redéfinir)deepCopy (A redéfinir)

Page 98: Introduction à la Programmation par Objets avec Smalltalk

98

Représentation textuelle des profsReprésentation textuelle des profs

printString|str|str := Stream…self printOn: str.…

printOn: aStreamaStream nextPutAll:

self nomPrenom.

printOn: aStreamsuper printOn: aStream.aStream nextPutAll: ', Prof'

Object

printOn: aStreamprintString

PersonnenomPrenomdateNaissanceprintOn: aStreamnomPrenom…

ProfmatieresEnseigneesprintOn: aStreamajouteMatiere: nomMatiereenseigneMatiere: nomMatiere

Page 99: Introduction à la Programmation par Objets avec Smalltalk

99

Envoi du message printString à une Envoi du message printString à une instance de Prof - 1instance de Prof - 1

|unProf||unProf|unProf nomPrenom: 'Michel Vaillant'.unProf nomPrenom: 'Michel Vaillant'.unProf printStringunProf printString Début de la recherche dans ProfDébut de la recherche dans Prof

pas de méthode printStringpas de méthode printString

Poursuite de la recherche dans PersonnePoursuite de la recherche dans Personne pas de méthode printStringpas de méthode printString

Poursuite de la recherche dans ObjectPoursuite de la recherche dans Object méthode printString trouvéeméthode printString trouvée

Exécution de la méthode trouvéeExécution de la méthode trouvéeprintString

|str|str := Stream…self printOn: str.…

Object

printOn: aStreamprintString

PersonnenomPrenomdateNaissanceprintOn: aStreamnomPrenom…

ProfmatieresEnseigneesprintOn: aStreamajouteMatiere: nomMatiereenseigneMatiere: nomMatiere

Page 100: Introduction à la Programmation par Objets avec Smalltalk

100

Envoi du message printString à une Envoi du message printString à une instance de Prof - 2instance de Prof - 2

self printOn: strself printOn: str Dans une méthode de Dans une méthode de ObjectObject

Début de la recherche dans Début de la recherche dans ProfProf méthode printOn: trouvéeméthode printOn: trouvée

Exécution de la méthode trouvéeExécution de la méthode trouvéeprintOn: aStream

super printOn: aStream.aStream nextPutAll: ', Prof'

Object

printOn: aStreamprintString

PersonnenomPrenomdateNaissanceprintOn: aStreamnomPrenom…

ProfmatieresEnseigneesprintOn: aStreamajouteMatiere: nomMatiereenseigneMatiere: nomMatiere

Page 101: Introduction à la Programmation par Objets avec Smalltalk

101

Envoi du message printString à une Envoi du message printString à une instance de Prof - 3instance de Prof - 3

super printOn: aStreamsuper printOn: aStream Dans une méthode de Dans une méthode de ProfProf

Début de la recherche dans Début de la recherche dans PersonnePersonne méthode printOn: trouvéeméthode printOn: trouvée

Exécution de la méthode trouvéeExécution de la méthode trouvéeprintOn: aStream

aStream nextPutAll: self nomPrenom

Object

printOn: aStreamprintString

PersonnenomPrenomdateNaissanceprintOn: aStreamnomPrenom…

ProfmatieresEnseigneesprintOn: aStreamajouteMatiere: nomMatiereenseigneMatiere: nomMatiere

Page 102: Introduction à la Programmation par Objets avec Smalltalk

102

Envoi du message printString à une Envoi du message printString à une instance de Prof - 4instance de Prof - 4

self nomPrenomself nomPrenom Dans une méthode de PersonneDans une méthode de Personne

Début de la recherche dans ProfDébut de la recherche dans Prof pas de méthode nomPrenompas de méthode nomPrenom

Poursuite de la recherche dans PersonnePoursuite de la recherche dans Personne méthode nomPrenom trouvéeméthode nomPrenom trouvée

Exécution de la méthode trouvéeExécution de la méthode trouvéenomPrenom

^ nomPrenom

Object

printOn: aStreamprintString

PersonnenomPrenomdateNaissanceprintOn: aStreamnomPrenom…

ProfmatieresEnseigneesprintOn: aStreamajouteMatiere: nomMatiereenseigneMatiere: nomMatiere

Page 103: Introduction à la Programmation par Objets avec Smalltalk

103

Envoi du message printString à une Envoi du message printString à une instance de Prof - 5instance de Prof - 5

Terminaison de Personne>>printOn:Terminaison de Personne>>printOn:

Suite et fin de l'exécution de Prof>>printOn:Suite et fin de l'exécution de Prof>>printOn: aStream nextPutAll: ', Prof'aStream nextPutAll: ', Prof'

Suite et fin de l'exécution de Object>>printStringSuite et fin de l'exécution de Object>>printString Retour de la chaîne : 'Michel Vaillant, Prof'Retour de la chaîne : 'Michel Vaillant, Prof'

Object

printOn: aStreamprintString

PersonnenomPrenomdateNaissanceprintOn: aStreamnomPrenom…

ProfmatieresEnseigneesprintOn: aStreamajouteMatiere: nomMatiereenseigneMatiere: nomMatiere

Page 104: Introduction à la Programmation par Objets avec Smalltalk

104

Méthodes de classeMéthodes de classe

Les classes sont des objetsLes classes sont des objets Peuvent recevoir des messagesPeuvent recevoir des messages

Méthodes de classe :Méthodes de classe : sont exécutées suite aux envois de messages à à la classesont exécutées suite aux envois de messages à à la classe sont définies en mode "class" du browsersont définies en mode "class" du browser respectent les mêmes règles que les méthodes d'instancerespectent les mêmes règles que les méthodes d'instance

Masquage, redéfinition, …Masquage, redéfinition, … Exemples :Exemples :

new new méthode de création d'instancesméthode de création d'instances

subclass:instanceVariableNames:…subclass:instanceVariableNames:… méthode de création des sous-classesméthode de création des sous-classes

Page 105: Introduction à la Programmation par Objets avec Smalltalk

105

Browser en mode instanceBrowser en mode instance

Page 106: Introduction à la Programmation par Objets avec Smalltalk

106

Browser en mode classBrowser en mode class

Page 107: Introduction à la Programmation par Objets avec Smalltalk

107

Création d'instances - 1Création d'instances - 1

Objets littéraux : écriture = créationObjets littéraux : écriture = créationNombres : 2 , 3.14 , …Nombres : 2 , 3.14 , …Lettres $a , $z , …Lettres $a , $z , …Chaînes de caractères : Chaînes de caractères :

'Hello' 'Hello' 'l''oiseau''l''oiseau'

– double apostrophe pour inclure une apostrophe dans la chaîne de caractères

Symboles : #toto #abcd , …Symboles : #toto #abcd , … tableaux de littéraux (instances de Array): tableaux de littéraux (instances de Array):

#(2 $a 'Hello' #bidule)#(2 $a 'Hello' #bidule)

Page 108: Introduction à la Programmation par Objets avec Smalltalk

108

Création d'instances - 2Création d'instances - 2

Autres objets = Par envoi de message aux classesAutres objets = Par envoi de message aux classes Les classes sont des objetsLes classes sont des objets

Message à la classeMessage à la classe Point newPoint new OrderedCollection with: 2 with: $a with: 'Hello'OrderedCollection with: 2 with: $a with: 'Hello'

Crée une collection ordonnée avec les élémentsCrée une collection ordonnée avec les éléments : :– 2– $a– 'Hello'

Message à d'autres objetsMessage à d'autres objets 640 @ 480640 @ 480

Crée une instance de Point d'abscisse 640 et d'ordonnée 480Crée une instance de Point d'abscisse 640 et d'ordonnée 480

'Hello' 'Hello' ,, ' World!' ' World!'

Concaténation = Crée la chaîne de cractères : 'Hello World!'Concaténation = Crée la chaîne de cractères : 'Hello World!'

Page 109: Introduction à la Programmation par Objets avec Smalltalk

109

Création d'instances initialiséesCréation d'instances initialisées

Tous les champs d'un nouvel objet référencent nilTous les champs d'un nouvel objet référencent nil Besoin de leur donner une valeur par défautBesoin de leur donner une valeur par défaut

Solution : Solution : Définir une méthode d'instance pour chaque valeur par Définir une méthode d'instance pour chaque valeur par

défautdéfaut Possibilité de redéfinition dans les sous-classesPossibilité de redéfinition dans les sous-classes

Définir une méthode d'instance qui fait l'initialisationDéfinir une méthode d'instance qui fait l'initialisation Envoi de message pour obtenir les valeur par défautEnvoi de message pour obtenir les valeur par défaut

Définir une méthode de classe quiDéfinir une méthode de classe qui crée une nouvelle instancecrée une nouvelle instance envoie le message d'initialisation à la nouvelle instanceenvoie le message d'initialisation à la nouvelle instance retourne la nouvelle instanceretourne la nouvelle instance

Page 110: Introduction à la Programmation par Objets avec Smalltalk

110

Création de lampes initialisées – 1Création de lampes initialisées – 1Méthodes d'instanceMéthodes d'instance

Par défaut, les instances de Lampe doivent êtrePar défaut, les instances de Lampe doivent être éteintes, et de couleur jauneéteintes, et de couleur jaune

Lampe>>estInitialementAllumeeLampe>>estInitialementAllumee^false^false

Lampe>>couleurParDefautLampe>>couleurParDefaut^Color yellow^Color yellow

Lampe>>initialisationLampe>>initialisationself estAllumee: (self estInitialementAllumee).self estAllumee: (self estInitialementAllumee).self couleur: (self couleurParDefaut)self couleur: (self couleurParDefaut)

Page 111: Introduction à la Programmation par Objets avec Smalltalk

111

Création de lampes initialisées – 2Création de lampes initialisées – 2Méthodes de classeMéthodes de classe

Lampe class>>nouvelleLampeLampe class>>nouvelleLampe|uneLampe||uneLampe|uneLampe := self new.uneLampe := self new.uneLampe initialisation.uneLampe initialisation.^uneLampe^uneLampe

Lampe class>>lampeDeCouleur: uneCouleurLampe class>>lampeDeCouleur: uneCouleur|uneLampe||uneLampe|uneLampe := self nouvelleLampe.uneLampe := self nouvelleLampe.uneLampe couleur: uneCouleur.uneLampe couleur: uneCouleur.^uneLampe^uneLampe

Page 112: Introduction à la Programmation par Objets avec Smalltalk

112

La méthode de classe newLa méthode de classe new

Crée une nouvelle instanceCrée une nouvelle instance

Suivant les versions de Smalltalk, elle peut :Suivant les versions de Smalltalk, elle peut : Retourner simplement un nouvel objet non initialiséRetourner simplement un nouvel objet non initialisé Retourner un nouvel objet initialiséRetourner un nouvel objet initialisé

envoi du message envoi du message initializeinitialize au nouvel objet au nouvel objet Object dispose alors de la méthode Object dispose alors de la méthode initializeinitialize Redéfinition de Redéfinition de initializeinitialize dans les sous-classes dans les sous-classes

Exemple : Lampe>>initializeExemple : Lampe>>initializesuper initialize.super initialize.self estAllumee: (self estInitialementAllumee).self estAllumee: (self estInitialementAllumee).self couleur: (self couleurParDefaut)self couleur: (self couleurParDefaut)

Page 113: Introduction à la Programmation par Objets avec Smalltalk

113

Initialisation paresseuseInitialisation paresseuse

Intérêt : un champ n'est initialisé que s'il est utiliséIntérêt : un champ n'est initialisé que s'il est utilisé

Initialisation réalisée dans les méthodes d'accès en Initialisation réalisée dans les méthodes d'accès en lecture aux champslecture aux champs

Exemple :Exemple : Lampe>>couleurLampe>>couleurcouleur ifNil: [self couleur: self couleurParDefaut].couleur ifNil: [self couleur: self couleurParDefaut].^couleur^couleur

Lampe>>estAllumeeLampe>>estAllumeeestAllumee ifNil: [self estAllumee: self estInitialementAllumee].estAllumee ifNil: [self estAllumee: self estInitialementAllumee].^estAllumee^estAllumee

Page 114: Introduction à la Programmation par Objets avec Smalltalk

114

Variables d'instance, de classe, de pool - 1Variables d'instance, de classe, de pool - 1

Variables d'instanceVariables d'instance spécifiques à chaque instancespécifiques à chaque instance

Variables de classeVariables de classe partagées entre les instances de la classe et…partagées entre les instances de la classe et… avec les instances des sous-classes (héritables !)avec les instances des sous-classes (héritables !)

Variables de pool Variables de pool partagées entre des instances de classes différentespartagées entre des instances de classes différentes organisés en dictionnairesorganisés en dictionnaires

Page 115: Introduction à la Programmation par Objets avec Smalltalk

115

Variables d'instance, de classe, de pool - 2Variables d'instance, de classe, de pool - 2

Exemple :Exemple :Object subclass: #CompteBancaireObject subclass: #CompteBancaire

instanceVariableNames: 'solde numero'instanceVariableNames: 'solde numero'classVariableNames: 'classVariableNames: 'NombreComptesCreesNombreComptesCrees''poolDictionaries: 'poolDictionaries: 'TauxChangeTauxChange''category: 'Exemple'category: 'Exemple'

Page 116: Introduction à la Programmation par Objets avec Smalltalk

116

Blocs de codeBlocs de code

Un bloc est un objetUn bloc est un objet peut être référencé dans une variable peut être référencé dans une variable ou transmis comme argument ou valeur de retourou transmis comme argument ou valeur de retour

Peuvent avoir des paramètresPeuvent avoir des paramètres [:p1 :p2| "plusieurs lignes de code"][:p1 :p2| "plusieurs lignes de code"]

Evaluation retardéeEvaluation retardée value value value:value: value:ifError:value:ifError: valueWithArguments:valueWithArguments:

Très utilesTrès utiles Boucles, Conditionnelles, Exceptions, ConcurrenceBoucles, Conditionnelles, Exceptions, Concurrence

Page 117: Introduction à la Programmation par Objets avec Smalltalk

117

ExceptionsExceptions

Sous-classes de ExceptionSous-classes de Exception

Levée d'exception : Levée d'exception : signalsignal et et signal:signal: texteExceptiontexteException

Capture d'exceptionCapture d'exception A l'aide des blocsA l'aide des blocs bloc bloc on:on: classException classException do:do: [:ex| "traitement exception"] [:ex| "traitement exception"] bloc bloc ensure:ensure: ["A executer toujours"] ["A executer toujours"]

Page 118: Introduction à la Programmation par Objets avec Smalltalk

118

Biblio/Webo-graphieBiblio/Webo-graphie

Livres Livres (disponibles au centre de Doc de l'Ecole)(disponibles au centre de Doc de l'Ecole) Squeak – X. Briffault et S. Ducasse (en français !) Squeak – X. Briffault et S. Ducasse (en français !) On to On to SSmalltalk malltalk – P. H. Winston– P. H. Winston Smalltalk, Objects and Design – C. LiuSmalltalk, Objects and Design – C. Liu Smalltalk with Style – S. SkublicsSmalltalk with Style – S. Skublics Smalltalk Best Practice Patterns – K. BeckSmalltalk Best Practice Patterns – K. Beck

Sites WebSites Web http://www.squeak.orghttp://www.squeak.org http://minnow.cc.gatech.edu/squeakhttp://minnow.cc.gatech.edu/squeak http://csl.ensm-douai.fr/noury/10#smalltalkhttp://csl.ensm-douai.fr/noury/10#smalltalk Groupe Francophone des utilisateurs de Smalltalk Groupe Francophone des utilisateurs de Smalltalk

http://www.iutc3.unicaen.fr:8000/fsug/http://www.iutc3.unicaen.fr:8000/fsug/