Programmation orientée objet en Smalltalk

hiko-seijuro

Le but de cet article est d'introduire la programmation orientée objet dans Squeak :

- parcourir le système de classes dans Squeak ;

- comprendre comment coder une classe ;

- sauvegarder et charger ses classes.

- Titre : Programmation orientée objet en Smalltalk

- Auteur : hiko-seijuro

- Parution : 8 août 2006

- Mise à jour : 8 août 2006

- Licence : 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'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Introduction

- II. Le « browser » de Squeak

- II-A. Les informations relatives à une classe

- II-A-1. sauvegarder et charger ses classes

- II-B. Le code d'une méthode

- II-B-1. sauvegarder et charger ses classes

- III. Créer ses propres classes

- III-A. Création d'une bibliothèque

- III-A-1. sauvegarder et charger ses classes

- III-B. Création de la classe

- III-B-1. sauvegarder et charger ses classes

- III-C. Création d'une catégorie de méthodes

- III-C-1. sauvegarder et charger ses classes

- III-D. Création d'une méthode

- III-D-1. sauvegarder et charger ses classes

- IV. Sauvegarder et charger ses classes

- IV-A. Sauvegarde de l'image

- IV-A-1. sauvegarder et charger ses classes

- IV-B. Sauvegarde dans un fichier

- IV-B-1. sauvegarder et charger ses classes

- IV-C. Chargement d'un fichier

- IV-C-1. sauvegarder et charger ses classes

- 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 :

- en utilisant le raccourci ALT+ B ;

- en utilisant le menu World (voir article introduction à Smalltalk).

Voici à quoi ressemble le « browser » :

Le browser de Squeak

Six parties le composent :

1. La liste des catégories qui permet de gérer les bibliothèques ;

2. La liste des Classes où sont affichées les classes de la bibliothèque sélectionnée ;

3. La liste des catégories de méthodes pour regrouper les méthodes de l'objet selon leur utilisation (accesseurs, affichage…) ;

4. La liste des méthodes de la catégorie sélectionnée ou bien la liste complète des méthodes de la classe sélectionnée si aucune catégorie n'est pointée ;

5. La partie éditeur de code qui permet de coder les méthodes, mais aussi de saisir les informations relatives à une classe ;

6. 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-A-1 - sauvegarder et charger ses classes

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 sont représentées 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.

II-B-1 - sauvegarder et charger ses classes

III - Créer ses propres classes

La création d'une classe se fait en deux 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 catégories. Un menu se présente, il utiliser l'élément « add item… ». Une boite de dialogue (si si 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 + sélection é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éciser 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-A-1 - sauvegarder et charger ses classes

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-B-1 - sauvegarder et charger ses classes

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-C-1 - sauvegarder et charger ses classes

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

x
"GetX()"
^x

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.

III-D-1 - sauvegarder et charger ses classes

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 relancez 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-A-1 - sauvegarder et charger ses classes

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'élément '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-B-1 - sauvegarder et charger ses classes

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 fichiers 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.

IV-C-1 - sauvegarder et charger ses classes

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 nicopyright(c) et fearyourself pour leurs corrections :)