1.1 UN PREMIER CONTACT


PIC

FIG. 1.5: L’attache des objets graphiques (Supplies)


Sur l’image de l’écran initial (figure 1.2 page 22) la bordure de la fenêtre SMALLTALK est décorée de petits rectangles colorés: ce sont des attaches, en anglais des «flaps». Par défaut on trouve une attache nommée Squeak au milieu à gauche de la fenêtre, une nommée Tools au milieu à droite, et en bas de la fenêtre, de gauche à droite, les attaches Navigator, Widgets et Supplies. Toutes ces attaches donnent, si on les active (par un clic avec le bouton gauche de la souris) accès à un ensemble d’outils SQUEAK.1 La figure 1.5, page 31 montre le contenu de l’attache «Supplies». Pour activer un de ces contenus, il suffit de le sélectionner (toujours avec le bouton gauche de la souris2) et de le tirer vers l’extérieur de l’attache (en gardant le bouton enfoncé et en déplacant la souris vers l’intérieur de la fenêtre SQUEAK).

Si nous activons l’outil Workspace de l’attache Tools nous obtenons une fenêtre similaire à celle de la Figure 1.6. Dans une telle fenêtre on peut entrer du code, le sélectionner et puis l’exécuter. Ainsi si l’on y entre

7 + 4
et qu’on selectionne dans le menu contextuel print it, SQUEAK vous répond tout naturellement 11. Notons qu’au lieu de sélectionner «print it» dans le menu contextuel, nous aurions pu taper Alt+p (en enfonçant la touche «Alt» en même temps que la touche «p»).3

PIC

FIG. 1.6: Une fenêtre Workspace


Notons que l’expression «7 + 4» se lit: «demandons à l’objet 7 ce qu’il obtient si nous lui envoyons le message «+» avec l’argument 4». Ou, encore plus clair: «l’objet 7 répond à la transmission du message + avec l’argument 4 en retournant l’objet 11». Notons aussi qu’à la fois l’objet 7, 4 et 11 sont des nombres entiers, plus précisément: des petits entiers.

Bref, en SMALLTALK un calcul se fait toujours en envoyant des messages à des objets, et les objets receveurs du message répondent par l’envoi d’un objet réponse à l’objet émetteur du message. Nous allons revenir vers cet aspect fondamental de la programmation par objet dans la suite. Pour l’instant rappelons qu’en SMALLTALK tout est objet et que les objets communiquent entre eux par la transmission de messages.

Nous sommes d’accord: ce premier programme, 7 + 4, est très minimaliste. Essayons-en un autre et faisons un «do it» («Alt+d») sur l’expression:

Display restoreAfter: [Pen example]
Ce qui dessinera sur notre écran SQUEAK une belle spirale bleue comme dans la figure 1.7.

PIC

FIG. 1.7: L’effet de Pen example


À nouveau: Display restoreAfter: [Pen example] est l’écriture SMALLTALK pour transmettre à l’objet Display, l’écran de SQUEAK, le message restoreAfter: avec l’argument [Pen example], qui, lui même, est une transmission du message example à l’objet Pen. Rappelons-le: tout calcul SMALLTALK est le résultat de la transmission d’un message, eventuellement avec ou sans arguments. Le message example n’a pas d’argument. C’est un message unaire. Par contre le message restoreAfter:4 a un argument (syntaxiquement indiqué par le signe deux-points). Ici c’est, entre crochets, le code SMALLTALK correspondant à la transmission du message example à l’objet Pen.

Notons aussi que l’action «do it» fait la même chose que «print it», c’est-à-dire: elle calcule, elle évalue l’expression sélectionnée, mais, au contraire de «print it», elle n’imprime pas la valeur que la transmission retourne à l’émetteur (dans ce cas la valeur retournée serait l’objet Display).

Une dernière remarque sur cet exemple: l’écriture de «Display» et «Pen» débute par un caractère majuscule. En SMALLTALK, qui est sensible à la casse, ceci veut dire que le mot décrit une classe - un objet qui est une classe. Une classe est un objet bien particulier et bien important en SMALLTALK. Une classe décrit une structure et c’est le seul type d’objet qui sait créer d’autres objets si on le demande (en général avec le message new). C’est une sorte de moule à objets. Puisqu’en SMALLTALK tout est objet, maintenant nous savons au moins d’où ils viennent: ils sont créés par des objets de type classe. Les objets qu’une classe peut créer sont appelés des instances de la classe. Les classes elles-mêmes sont des instances d’autres classes: de leur méta-classe. Nous allons revenir vers ces notions dans les chapitres suivants. Pour l’instant retenons que:

Le système SQUEAK met à notre disposition, dans sa version actuelle, autour de 3500 classes déjà existantes. Nous pouvons toujours en ajouter des nouvelles, définies pour nos propres besoins. C’est cette activité de définir des nouvelles classes qui sera l’activité principale d’un programmeur SMALLTALK. Mais qu’est-ce que c’est, une classe? Pour l’instant disons que c’est un moule produisant des instances et que ce moule doit définir à la fois les caractéristiques determinant la spécificité de chacune de ses instances (nous dirons: il doit définir ses variables d’instances) et qu’il doit définir les messages spécifiques que chacune de ses instances doit comprendre (nous dirons: il doit définir ses méthodes). Ainsi si, dans un programme, nous avons besoin de modéliser des voitures, nous distinguerons probablement chacune des voitures par sa puissance, sa couleur, sa taille, etc. Ce seront des variables d’instances et chaque voiture aura ses propres valeurs associées à ces variables d’instances. Mais toutes les voitures devront savoir comment avancer, reculer, accélerer, etc. Ce seront les méthodes définies dans la classe Voiture, et toute voiture particulière (chaque instance de la classe Voiture) pourra regarder dans sa classe comment accélérer, reculer, avancer etc. Nous dirons que les instances héritent des méthodes de leur classe.


PIC
FIG. 1.8: Un explorateur de classes centré sur la classe Number

Mais ce n’est pas tout. Puisqu’un programme contiendra probablement beaucoup de classes différentes, et puisque - de toute façon - le système SQUEAK nous en livre dès le départ un grand nombre, les classes sont organisés hiérachiquement en une structure arborescente, similaire aux systèmes de classification, qui raisonnent toujours sur des concepts organisés en arborescence. Du coup, nous parlerons non seulement de classes, mais aussi de sous-classes et sur-classes. Par exemple, la classe Voiture pourrait avoir des sous-classes nommées Break, Camion, Caravane, Formule-1 etc., qui se distingueront par la puissance, la possibilité de prendre des charges ou pas, des grandes vitesses, les permis nécessaires, etc. Mais elles sauront toutes reculer, avancer ou accélérer. Ainsi, nous dirons que les sous-classes héritent des comportements de leurs sur-classes. Ici, c’est la classe Voiture qui saura comment avancer, point n’est besoin de le redire dans les classes Break, Camion, Caravane, Bus etc. Elles peuvent hériter de ce savoir de leur sur-classe (la classe Voiture).

Si, dans le menu principal (cf. Figure 1.3) nous cliquons sur «open...» et ensuite sur browser, ou si de l’attache Tools nous importons l’icone browser, SQUEAK nous donne une fenètre System Browser, un explorateur des classes existantes. Nous en montrons un dans la figure 1.8. Cet outil permet d’explorer l’ensemble des classes SMALLTALK: CELLES QUI EXISTENT DéJà A PRIORI DANS LE SYSTèME ET CELLES QUE VOUS AVEZ DéFINIES VOUS MêME. VOUS POUVEZ Y voir comment les classes et leur méthodes ont été définies, leur hiérarchie, leur implémentation. Tout le système SMALLTALK est écrit en SMALLTALK! Du coup, vous avez un ensemble absolument remarquable d’exemples de programmes SMALLTALK à explorer. N’hésitez pas, lancez un explorateur de classes (System Browser) et donnez-vous en à cœur joie!


PIC

FIG. 1.9: Les menus de la première rangée de sous-fenêtres du system browser, (de gauche à droite: catégories, classes, protocoles et méthodes)


L’explorateur de classes est composé d’une première rangée de sous-fenêtres qui décrivent, de gauche à droite les:

catégories: les classes de SMALLTALK sont groupées dans des catégories mettant ensemble des classes suivant des idées du concepteur de ces classes. Une catégorie est quelque chose de conceptuel, et n’a pas de correspondant au niveau de l’organisation hiérarchique propre des classes. Très souvent les classes d’un projet sont groupées dans une catégorie au nom de ce projet. Le menu de la fenêtre catégorie (cf. Figure 1.9, page 43) offre une entrée permettant la recherche d’une classe spécifique. Dans notre exemple, Figure 1.8 page 40, c’est la catégorie Kernel-Numbers qui a été sélectionnée, ce qui faisait apparaître dans la sous-fenêtre «classes» l’ensemble des classes appartenant à cette catégorie.

classes: dans ce menu déroulant on trouve l’ensemble des classes d’une catégorie. Il suffit de cliquer sur le nom de la classe désirée pour voir apparaître, dans la grande fenêtre en dessous de cette première rangée, la définition de cette classe. En dessous du menu déroulant des classes on trouve trois boutons supplémentaire: instance,?, class. Le bouton «?» montre le commentaire attachée à la définition de la classe qu’on visualise actuellement. Les boutons «instance» et «class» indiquent aux deux fenêtres suivantes si l’on s’intéresse plutôt aux messages qu’on peut envoyer aux instances de la classe ou aux messages qu’on peut envoyer à la classe même. Dans notre exemple, Figure 1.8 page 40, c’est la classe Number et le bouton «instance» qui ont été sélectionnés, ce qui faisait apparaître dans la sous-fenêtre «protocoles» l’ensemble des protocoles d’instance existants de cette classe.

protocoles: smilaires aux catégories, qui regroupent conceptuellement des classes, les protocoles permettent de regrouper conceptuellement des méthodes. Souvent on verra un protocole testing, printing ou private. Comme les noms l’indiquent, le protocole «testing» groupe des méthodes qui retournent soit vrai, soit faux, le protocole «printing» groupe des méthodes pour imprimer des instances de la classe et le protocole «private» groupe des méthodes qui ne devraient être connues que par les instances de cette classe et être inaccéssibles de l’extérieur de cette classe.

méthodes: dans ce menu déroulant on trouve les noms des méthodes (les sélecteurs) groupés sous le protocole choisi. Dans notre exemple, Figure 1.8 page 40, c’est l’ensemble des méthodes d’implémentation des opérations arithmétiques pour la classe Number.


PIC
FIG. 1.10: Un explorateur de classes montrant la hiérarchie de la classe Number

En dessous de cette première rangée se trouvent (dans la version actuelle) 9 boutons qui permettent (de gauche à droite) d’ouvrir un autre explorateur sur la chose actuellement sélectionnée, sur toutes les méthodes qui contiennent le sélecteur de la méthode actuellement sélectionnée dans une transmission (les émetteurs de ce message), sur toutes les classes qui implémentent le sélecteur choisi, sur les différentes versions existantes de la chose sélectionnée, sur l’ensemble des méthodes du même nom avec des indications sur les manières d’héritage, sur la hiérarchie de la classe sélectionnée, sur tous les accès à une variable d’instance ou une variable de classe sélectionnée, finalement, le dernier bouton permet de déterminer la manière d’affichage de ce qui est montré dans la grande fenêtre pour le code.

Il ne nous reste que la sous-fenêtre la plus importante et la plus grande: elle contient le code SMALLTALK de la chose sélectionnée. Cette sous-fenêtre contient un éditeur et toutes les capacités de la fenêtre Workspace. Tout code qui y est montré peut être modifié, sauvegardé ou évalué. Pour que la modification soit prise en compte, on doit choisir accept dans le menu contextuel (ou simplement taper «Alt+s»). De temps à autre, cette fenêtre est horizontalement divisée en deux. La partie basse montre alors le commentaire associé à la classe sélectionnée.