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

Image non disponible
Le browser de Squeak

6 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 selectionné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 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.
  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
Sélectionnez

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
Sélectionnez

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
Sélectionnez

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
Sélectionnez

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 :

Image non disponible
Clic droit + selection élément 'add item ...'
Image non disponible
Saisir le nom de la bibliothèque à créer
Image non disponible
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
Sélectionnez

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
Sélectionnez

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 :

Image non disponible
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 :

Image non disponible
Clic droit dans la liste des catégories de méthodes + sélection de l'élément 'new category...'
Image non disponible
Choix d'une catégorie existante ou bien création d'une nouvelle catégorie ('new...')
Image non disponible
Saisir le nom de la nouvelle catégorie (par exemple ''accessing'') et valider
Image non disponible
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
Sélectionnez

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
Sélectionnez

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 :

Image non disponible
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.

Image non disponible
Sélectionnez une bibliothèque, cliquez droit et sélectionnez l'élement 'fileOut' ....
Image non disponible
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)
Sélectionnez

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

Image non disponible
Choisir 'open' puis 'file list'(désolé pour la flèche :D)


Et voici ce que vous allez obtenir :

Image non disponible
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 :

Image non disponible
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 :)