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 » :
Six 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 sélectionné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 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 ;
- 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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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.
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. :
Et voici ce que vous allez obtenir :
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 :
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 :)