Introduction à la Programmation par Objets avec Smalltalk
description
Transcript of 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
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
3
Concepts fondamentauxConcepts fondamentauxavec le langageavec le langage
SmalltalkSmalltalk
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
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
6
Exemple de messagesExemple de messages
allumer
éteindre
l'heure?
7
Messages avec 0, 1 ou plusieurs argumentsMessages avec 0, 1 ou plusieurs arguments
allumer
remplacer couleurpar : vert
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
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
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
11
x allumerx allumer
xx
yy nil
allumer
12
y := xy := x
xx
yy
13
y éteindrey éteindre
xx
yy éteindre
14
y éteindrey éteindre
xx
yy éteindre
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
16
Accès à la mémoire d'un objetAccès à la mémoire d'un objet
remplacer couleurpar : vert
MémoireMémoireCouleurCouleur jaunejaune
17
Accès à la mémoire d'un objetAccès à la mémoire d'un objet
remplacer couleurpar : vert
MémoireMémoireCouleurCouleur vertvert
18
Accès à la mémoire d'un objetAccès à la mémoire d'un objet
remplacer couleurpar : vert
OK
MémoireMémoireCouleurCouleur vertvert
19
Accès à la mémoire d'un objetAccès à la mémoire d'un objet
couleur ?
vert
MémoireMémoireCouleurCouleur vertvert
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)
21
Exemple de traitementsExemple de traitements
MémoireMémoirelampeCourantelampeCourante
lampeRougelampeRouge
lampeOrangelampeOrange
LampeVerteLampeVerte
allumer lampesuivante
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
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
24
lampeCourante eteindrelampeCourante eteindre
MémoireMémoirelampeCourantelampeCourante
lampeRougelampeRouge
lampeOrangelampeOrange
LampeVerteLampeVerte
allumer lampesuivante
étei
ndre
25
lampeCourante eteindrelampeCourante eteindre
MémoireMémoirelampeCourantelampeCourante
lampeRougelampeRouge
lampeOrangelampeOrange
LampeVerteLampeVerte
allumer lampesuivante
étei
ndre
26
self trouverLampeSuivanteself trouverLampeSuivante
MémoireMémoirelampeCourantelampeCourante
lampeRougelampeRouge
lampeOrangelampeOrange
LampeVerteLampeVerte
allumer lampesuivante
trouver lampe suivante
27
lampeCourante := lampeCourante := self trouverLampeSuivanteself trouverLampeSuivante
MémoireMémoirelampeCourantelampeCourante
lampeRougelampeRouge
lampeOrangelampeOrange
LampeVerteLampeVerte
allumer lampesuivante
28
lampeCourante allumerlampeCourante allumer
MémoireMémoirelampeCourantelampeCourante
lampeRougelampeRouge
lampeOrangelampeOrange
LampeVerteLampeVerte
allumer lampesuivante
allumer
29
lampeCourante allumerlampeCourante allumer
MémoireMémoirelampeCourantelampeCourante
lampeRougelampeRouge
lampeOrangelampeOrange
LampeVerteLampeVerte
allumer lampesuivante
allumer
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
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
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…)
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.
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 := …
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
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
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
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
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
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
……
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 ' '
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
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
44
Squeak 3.6 au premier démarrageSqueak 3.6 au premier démarrage
45
Accès aux outilsAccès aux outils
46
Menu "World"Menu "World"
47
Browser - 1Browser - 1
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"
49
Exemple de création d'une classe - 1Exemple de création d'une classe - 1
1
2
3
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'
51
Exemple de définition d'une méthode - 1Exemple de définition d'une méthode - 1
1
2
5
34
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
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..
54
Transcript = "Console"Transcript = "Console"
55
Workspace : exécuter, afficher, inspecter…Workspace : exécuter, afficher, inspecter…
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
57
File List : Gestionnaire de fichierFile List : Gestionnaire de fichier
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
59
Débogueur– OuvertureDébogueur– Ouverture
60
Le Débogueur !Le Débogueur !
61
Eléments de base deEléments de base deSmalltalkSmalltalk
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"]
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"]
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)
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)
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
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
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
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)
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].
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
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
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)]
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
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
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
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::
78
Un peu plus loin avec SmalltalkUn peu plus loin 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)
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)
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
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
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
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'
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'
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
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
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
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
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
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
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
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
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
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
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
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)
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
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
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
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
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
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
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
105
Browser en mode instanceBrowser en mode instance
106
Browser en mode classBrowser en mode class
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)
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!'
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
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)
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
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)
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
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
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'
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
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"]
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/