Programmation orientée objets en Smalltalk
Date de publication : 8/08/2006 , Date de mise à jour : 8/08/2006
Par
hiko-seijuro (hiko-seijuro.developpez.com)
Le but de cet article est d'introduire la programmation orientée objets dans Squeak :
- parcourir le système de classes dans Squeak
- comprendre comment coder une classe
- sauvegarder et charger ses classes
I. Introduction
II. Le "browser" de Squeak
II-A. Les informations relatives à une classe
II-B. Le code d'une méthode
III. Créer ses propres classes
III-A. Création d'une bibliothèque
III-B. Création de la classe
III-C. Création d'une catégorie de méthodes
III-D. Création d'une méthode
IV. Sauvegarder et charger ses classes
IV-A. Sauvegarde de l'image
IV-B. Sauvegarde dans un fichier
IV-C. Chargement d'un fichier
V. Conclusion
VI. Remerciements
I. Introduction
L'objectif de cet article est d'expliquer les bases de la programmation objet en Smalltalk
avec l'environnement Squeak. Pour cela, l'article est décomposé en trois parties : la première explique le
"browser" de classes, intégré dans Squeak. La seconde explique comment créer une classe et y déclarer ses
méthodes ainsi que ses attributs. La dernière partie va vous permettre d'apprendre à sauvegarder et restaurer
vos classes.
II. Le "browser" de Squeak
Le "browser" de Squeak permet de représenter les classes de manière ordonnée. Pour l'ouvrir, deux
possibilités sont offertes :
Voici à quoi ressemble le "browser" :

Le browser de Squeak
6 parties le composent :
-
la liste des catégories qui permet de gérer les bibliothèques
-
la liste des Classes où sont affichées les classes de la bibliothèque selectionnée
-
la liste des catégories de méthodes pour regrouper les méthodes de l'objet selon leur
utilisation (accesseurs, affichage, ...)
-
la liste des méthodes de la catégorie selectionnée ou bien la liste complète des méthodes de la
classe sélectionnée si aucune catégorie n'est pointée.
-
la partie éditeur de code qui permet de coder les méthodes mais aussi de saisir les informations
relatives à une classe.
-
la partie éditeur de commentaires qui va permettre de préciser certaines informations sur la classe
II-A. Les informations relatives à une classe
Pour représenter une classe, plusieurs informations sont nécessaires. Elles peuvent être visualisées
dans la partie "éditeur de code" du "browser". Pour cela, il faut sélectionner une classe mais ne sélectionner
aucune méthode.
Voici comment une classe est représentée en Smalltalk :
| Représentation d'une classe en Smalltalk |
Classe_de_base subclass: #nom_de_la_classe
instanceVariableNames: 'var_int1 var_inst2'
classVariableNames: 'var_class1 var_class2'
poolDictionaries: '...'
category: 'nom_bibliothèque'
|
Cette description indique que la classe a pour nom nom_de_la_classe, qu'elle hérite de Classe_de_base,
qu'elle possède var_int1 et var_int2 comme variables d'instance ainsi que var_class1 et var_class2
comme variables de classe. Enfin, elle appartient à la catégorie nom_bibliothèque.
Grâce à cette description, on peut se rendre compte plus facilement que le Smalltalk est un langage où même les classes
sont des objets. En effet, subclass:instanceVariableNames: ... peut être considérée comme une méthode (elle fait partie de la
classe "Class" de la catégorie "kernel-object"). #nom_de_la_classe est un symbole qui permet de représenter, dans l'environnement
notre nouvelle classe.
Voici un exemple de déclaration complète d'une Classe :
| Représentation de la classe String en Smalltalk |
ArrayedCollection subclass: #String
instanceVariableNames: ''
classVariableNames: 'AsciiOrder CaseInsensitiveOrder CaseSensitiveOrder
CSLineEnders CSNonSeparators CSSeparators HtmlEntities
LowercasingTable Tokenish UppercasingTable'
poolDictionaries: ''
category: 'Collections-Strings'
|
II-B. Le code d'une méthode
Le code d'une méthode peut être visualisé dans la partie "éditeur de code" en sélectionnant obligatoirement
une méthode dans la "liste des méthodes" du "Browser".
Voici comment représenter une méthode en Smalltalk :
| Représentation d'une méthode en Smalltalk |
nomméthode:param1 suite_nom:param2
"commentaire expliquant la méthode"
"code"
"retour d'une valeur (non obligatoire)"
|
Contrairement à un système de programmation classique, du type C++ ou Java, le nom de la classe de la méthode
n'est pas présent dans l'éditeur de code. En effet, l'environnement considère que vous avez sélectionné la classe dans le browser
et la connaissez donc.
Le nom de la méthode se poursuit autant de fois qu'il y a besoin de paramètres. Vous pouvez constater, encore une fois, que le typage
est dynamique car aucun type n'est précisé pour les paramètres (
faites donc attention !!!). La partie
commentaire peut être
occultée mais, à mon avis, il est préférable de commenter le code bien que ça soit fait peu souvent. La partie
code permet de décrire
les opérations effectuées par la méthode, il s'agit de coder du Smalltalk comme indiqué dans l'article "
introduction au Smalltalk".
Voici un exemple de déclaration de méthodes :
| Méthode de classe String permettant de savoir si la chaîne est codée en ASCII |
isAsciiString
| c |
c := self detect: [:each | each asciiValue > 127] ifNone: [nil].
^ c isNil.
|
Dans cette section, nous avons vu comment est représentée une classe et ses méthodes dans Squeak. Maintenant, nous allons voir
comment créer une classe et coder ses méthodes grâce au "browser" intégré à Squeak.
III. Créer ses propres classes
La création d'une classe se fait en 2 parties : le renseignement des informations relatives à la classe puis le codage de ses
méthodes. La deuxième partie est, évidemment, dépendante de la première.
III-A. Création d'une bibliothèque
Pour créer une classe, il faut au préalable créer la bibliothèque dont elle va faire partie si celle-ci n'existe pas déjà.
Pour cela, ouvrez le "browser", effectuez un clic droit dans la liste des categories. Un menu se présente, il utiliser l'élément
"add item...". Une boite de dialogue (sisi cela en est une ...) apparaît et vous propose de saisir le nom de votre catégorie.
Saisissez-le, puis validez votre choix en cliquant sur le bouton "accept". Vérifiez que votre bibliothèque est
bien présente dans la liste des catégories (on ne sait jamais :D).
Voici le résumé en images :

Clic droit + selection élément 'add item ...'

Saisir le nom de la bibliothèque à créer

Pack-exemple est présent dans la liste
 |
Je dois vous précisez que Squeak ne classe pas forcément les bibliothèques par noms lorsque vous les créez. Pour le faire, il vous faut
choisir l'élément "alphabetize" du menu obtenu en effectuant un clic droit sur la liste des catégories.
|
III-B. Création de la classe
Pour créer une classe, il faut sélectionner la bibliothèque contenante mais ne sélectionner aucune classe existante. Vous
devez alors obtenir ceci dans l'éditeur de code :
| Template pour la création d'une classe |
Object subclass: #NameOfSubclass
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'pack-exemple'
|
Nous allons maintenant créer une classe basique nommée ExemplePoint (pour ne pas créer de conflit avec la classe Point qui existe dans certains
environnements Smalltalk). Saisissez les informations dans l'éditeur de code pour obtenir ceci :
| Code de la classe ExemplePoint |
Object subclass: #ExemplePoint
instanceVariableNames: 'x y'
classVariableNames: ''
poolDictionaries: ''
category: 'pack-exemple'
|
Validez en utilisant le raccourci "ALT+S" ou bien en effectuant un clic droit dans la partie éditeur de code et en choisissant l'élément "accept".
Vous devez alors obtenir ceci :

La classe est créée !!!
III-C. Création d'une catégorie de méthodes
Maintenant que la classe est créée, on va y intégrer ses méthodes. Pour mieux gérer ces méthodes, Squeak met à disposition
un système de classement par catégorie de méthodes. Le processus de création de catégories ressemble au processus de création d'une
bibliothèque. Voici un résumé en images :

Clic droit dans la liste des catégories de méthodes + sélection de l'élément 'new category...'

Choix d'une catégorie existante ou bien création d'une nouvelle catégorie ('new...')

Saisir le nom de la nouvelle catégorie (par exemple ''accessing'') et valider

Et voilà le résultat !!!!
III-D. Création d'une méthode
Maintenant que la catégorie est créée, il est temps de passer à la création de la méthode proprement dite. Pour commencer, il faut
qu'aucune méthode ne soit sélectionnée. Dans la partie "éditeur de code", vous verrez alors ceci :
| Template pour la déclaration d'une méthode |
messageSelectorAndArgumentNames
"comment stating purpose of message"
| temporary variable names |
statements
|
Maintenant, nous allons créer un accesseur permettant de renvoyer la valeur de la variable d'instance nommée
x.
Il s'agit évidemment d'une méthode simpliste mais l'objectif n'étant pas de comprendre le code Smalltalk (pour cela je vous laisse
lire l'article nommé "
introduction au Smalltalk") il est amplement suffisant. Voici le code :
| Template pour la déclaration d'une méthode |
|
Validez en utilisant le raccourci "ALT+S" ou bien en effectuant un clic droit dans la partie éditeur de code et en choisissant l'élément "accept".
Vous devez alors obtenir ceci :

La méthode est créée !!!!
Je vous laisse le soin d'intégrer de nouvelles méthodes plus complexes. N'hésitez pas à manipuler pour bien comprendre comment cela fonctionne.
IV. Sauvegarder et charger ses classes
Maintenant que nous savons faire des classes et des méthodes, il faut maintenant les sauvegarder pour mieux les réutiliser.
Deux méthodes s'offrent à nous : la sauvegarde de l'image ou bien la sauvegarde dans un fichier différent.
IV-A. Sauvegarde de l'image
La sauvegarde de l'image se fait très simplement. Cliquer (gauche) sur l'arrière-plan de Squeak et sélectionner l'élément "Save"
ou bien "Save and Quit" si vous souhaitez quitter Squeak. L'avantage de cette sauvegarde est que lorsque vous relancer Squeak la classe
est automatiquement rechargée. L'inconvénient est évidemment que la sauvegarde est locale à l'image et ne pourra être rechargée grâce à
une autre image. C'est pour cela qu'il existe la sauvegarde dans un fichier.
IV-B. Sauvegarde dans un fichier
Vous pouvez sauvegarder dans un fichier soit une bibliothèque complète, soit une classe. Nous allons expliquer comment sauvegarder
une bibliothèque. Le processus sera identique pour sauvegarder une classe.

Sélectionnez une bibliothèque, cliquez droit et sélectionnez l'élement 'fileOut' ....

Et le fichier ayant pour extension 'st' représente la bibliothèque sauvegardée (ou la classe)
| Contenu du fichier pack-exemple.st (ça ne vous rappelle rien ? :D) |
Object subclass: #ExemplePoint
instanceVariableNames: 'x y'
classVariableNames: ''
poolDictionaries: ''
category: 'pack-exemple'!
!ExemplePoint methodsFor: 'accessing' stamp: 'slm 8/3/2006 22:09'!
x
"GetX()"
^x! !
|
IV-C. Chargement d'un fichier
Maintenant que nous avons sauvegardé nos classes, il nous reste à les charger. Pour commencer, cliquer sur le fond de Squeak
pour ouvrir le "World" menu. Choisissez l'élément "Open" puis choisissez l'élément "file list" dans le sous menu obtenu. :

Choisir 'open' puis 'file list'(désolé pour la flèche :D)
Et voici ce que vous allez obtenir :

Le gestionnaire de fichier de squeak
Sélectionnez le fichier où les classes ont été sauvegardées, vous verrez alors une option "install" apparaître. Cliquez dessus pour
charger les classes :

L'option 'install' est en haut à droite
Et voilà vous pouvez rechercher vos classes, en utilisant la méthode précédente, elles sont rechargées dans Squeak.
V. Conclusion
Maintenant, si maîtrisez la programmation orientée objet, vous pouvez coder vos classes en Squeak. La prochaine étape consiste à étudier
les outils offerts par Squeak pour maîtriser notre développement (debugger, profiler, ....)
VI. Remerciements
Je tiens à remercier nico-pyright(c) et fearyourself pour leurs corrections :)


Copyright © 2006 hiko-seijuro. Aucune reproduction, même partielle, ne peut être faite
de ce site et de l'ensemble de son contenu : textes, documents, images, etc
sans l'autorisation expresse de l'auteur.
Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E
de dommages et intérêts.
Cette page est déposée à la
SACD.