1. Chapitre 1 - Une visite de Pharo▲
Nous vous proposons dans ce chapitre une première visite de Pharo afin de vous familiariser avec son environnement. De nombreux aspects seront abordés ; il est conseillé d'avoir une machine prête à l'emploi pour suivre ce chapitre.
Cette icône dans le texte signalera les étapes où vous devrez essayer quelque chose par vous-même. Vous apprendrez à lancer Pharo et les différentes manières d'utiliser l'environnement et les outils de base. La création des méthodes, des objets et les envois de messages seront également abordés.
1-1. Premiers pas▲
Pharo est librement disponible au téléchargement depuis la page http://pharo-project.org/pharo-download du site web de Pharo. Pour bien démarrer, il vous faudra trois archives : une archive image (contenant deux fichiers, l'image proprement dite et le fichier de changes) disponible dans le paragraphe Pharo 1.* image, un fichier nommé sources disponible dans le paragraphe Sources file et enfin, un programme exécutable appelé machine virtuelle selon votre système d'exploitation dans le paragraphe Virtual Machines.
Dans le cas du présent cours, nous aurons seulement besoin de télécharger une archive unique contenant tout le nécessaire. Sachez que si vous avez déjà une autre version de Pharo qui fonctionne sur votre machine, la plupart des exemples d'introduction de ce cours fonctionneront, mais, en raison de subtils changements dans l'interface et les outils proposés dans une version actuelle de Pharo, nous vous recommandons le téléchargement du fichier « Pharo-1.1-OneClick» disponible ici http://gforge.inria.fr/frs/download.php/27303/Pharo-1.1-OneClick.zip : vous aurez alors une image en parfait accord avec le cours.
Depuis le site http://gforge.inria.fr/frs/download.php/27303/Pharo-1.1-OneClick.zip, téléchargez et décompressez l'archive Pharo sur votre ordinateur.
Le dossier résultant de la décompression de l'archive contient quatre fichiers importants : la machine virtuelle selon votre système d'exploitation, l'image, le fichier « sources » et le fichier « changes ». Si vous êtes utilisateur de Mac OS X, ne vous inquiétez pas de ne voir qu'un seul fichier ; il s'agit d'un exécutable en bundle que vous pouvez explorer en cliquant dessus avec le bouton droit et en choisissant l'option du menu contextuel dite « Afficher le contenu du paquet ».
Avec la machine virtuelle, vous devriez donc avoir quatre fichiers tels que nous pouvons le voir sur la figure 1.1. Ainsi Pharo se compose :
- D'une machine virtuelle (abrégée en VM pour virtual machine) : c'est la seule partie de l'environnement qui est particulière à chaque couple système d'exploitation et processeur. Des machines virtuelles précompilées sont disponibles pour la plupart des systèmes (Linux, Mac OS X, Win32). Dans la figure 1.1, vous pouvez voir que la machine virtuelle pour la plateforme Windows est appelée pharo.exe. En naviguant dans le répertoire Contents/Linux, les utilisateurs trouveront un fichier binaire nommé squeakvm(7) : il s'agit de la machine virtuelle qui est appelée grâce au script shell pharo.sh ;
- Du fichier source : il contient le code source du système Pharo. Ce fichier ne change pas très fréquemment. Dans la figure 1.1, il correspond au fichier PharoV10.sources ;
- De l'image système : il s'agit d'un cliché d'un système Pharo en fonctionnement, figé à un instant donné. Il est composé de deux fichiers : le premier nommé avec l'extension .image contient l'état de tous les objets du système dont les classes et les méthodes (qui sont aussi des objets). Le second avec l'extension .changes contient le journal de toutes les modifications apportées au code source du système (contenu dans le fichier source). Dans la figure 1.1, ces fichiers sont appelés PBE.image et PBE.changes.
Ces trois derniers fichiers résident discrètement dans le répertoire Contents/Resources. Pendant que vous travaillez avec Pharo, les fichiers .image et .changes sont modifiés ; si vous êtes amenés à utiliser d'autres images, vous devez donc vous assurer qu'ils sont accessibles en écriture et qu'ils sont toujours ensemble, c.-à-d. dans le même dossier. Ne tentez pas de les modifier avec un éditeur de texte, Pharo les utilise pour stocker vos objets de travail et vos changements dans le code source. Faire une copie de sauvegarde de vos images téléchargées et de vos fichiers changes est une bonne idée ; vous pourrez ainsi toujours démarrer à partir d'une image propre et y recharger votre code. Les fichiers source et l'exécutable de la VM peuvent être en lecture seule — il est donc possible de les partager entre plusieurs utilisateurs.
Lancement. Pour lancer Pharo :
- si vous êtes sous Windows, cliquez sur pharo.exe à la racine du répertoire PBE-1.0-OneClick.app. Le fichier pharo.ini contient diverses options de lancement telles que ImageFile permettant de pointer vers une image particulière. Veillez à ne pas toucher ou déplacer ce fichier ;
-
si vous êtes sous Linux, vous pouvez au choix cliquer sur pharo.sh ou lancer depuis votre terminal la commande .pharo.sh depuis la racine du répertoire PBE-1.0-OneClick.app. Si vous ouvrez le script shell avec un éditeur, vous verrez que la commande exécute la machine virtuelle avec l'image PBE.image du répertoire Contents/Resources.
- si vous êtes sous Mac OS X, cliquez sur le fichier PBE-1.0-OneClick (ou PBE-1.0-OneClick.app suivant votre configuration). En affichant le contenu du paquet, vous avez dû voir le fichier de propriétés Info.plist à la racine du répertoire Contents. C'est là que la magie opère. Si vous ouvrez ce dernier fichier avec le programme Property List Editor, vous verrez que notre application PBE-1.0-OneClick cache le lancement d'une machine nommée Squeak VM Opt sur le fichier PBE.image.
Ainsi, cette archive dite « OneClick » (c.-à-d. un clic) nous évite de faire un glissé-déposé de notre image PBE.image sur le programme exécutable de notre machine virtuelle ou d'écrire notre propre script de lancement : tout se passe en un clic de souris.
Une fois lancé, Pharo vous présente une large fenêtre qui peut contenir des espaces de travail nommés Workspace (voir la figure 1.2). Vous pourriez remarquer une barre de menus, mais Pharo emploie principalement des menus contextuels.
Lancez Pharo. Vous pouvez fermer les fenêtres déjà ouvertes en cliquant sur la bulle rouge dans le coin supérieur gauche des fenêtres.
Vous pouvez minimiser les fenêtres (ce qui les masque dans la barre de tâches située dans le bas de l'écran) en cliquant sur la bulle orange. Cliquer sur la bulle verte entraîne l'agrandissement maximal de la fenêtre.
Première interaction. Les options du menu World (« Monde » en anglais) présentées dans la figure 1.3 (a) sont un bon point de départ.
Cliquez à l'aide de la souris dans l'arrière-plan de la fenêtre principale pour afficher le menu World, puis sélectionnez Workspace pour créer un nouvel espace de travail ou Workspace.
Smalltalk a été conçu à l'origine pour être utilisé avec une souris à trois boutons. Si votre souris en a moins, vous pourrez utiliser des touches du clavier en complément de la souris pour simuler les boutons manquants. Une souris à deux boutons fonctionne bien avec Pharo, mais si la vôtre n'a qu'un seul bouton vous devriez songer à adopter un modèle récent avec une molette qui fera office de troisième bouton : votre travail avec Pharo n'en sera que plus agréable.
Pharo évite les termes « clic gauche » ou « clic droit », car leurs effets peuvent varier selon les systèmes, le matériel ou les réglages utilisateur. Originellement, Smalltalk introduit des couleurs pour définir les différents boutons de souris(8). Puisque de nombreux utilisateurs utiliseront diverses touches de modifications (Ctrl, Alt, Meta etc) pour réaliser les mêmes actions, nous utiliserons plutôt les termes suivants :
clic : il s'agit du bouton de la souris le plus fréquemment utilisé et correspond au fait de cliquer avec une souris à un seul bouton sans aucune touche de modification ; cliquer sur l'arrière-plan de l'image fait apparaître le menu « World » (voir la figure 1.3 (a)) ; nous utiliserons le terme « cliquer » pour définir cette action ;
clic d'action : c'est le second bouton le plus utilisé ; il est utilisé pour afficher un menu contextuel c.-à-d. un menu qui fournit différentes actions dépendantes de la position de la souris comme le montre la figure 1.3 (b). Si vous n'avez pas de souris à multiples boutons, vous configurerez normalement la touche de modifications Ctrl pour effectuer cette même action avec votre unique bouton de souris ; nous utiliserons l'expression « cliquer avec le bouton d'action »(9).
meta-clic : vous pouvez finalement meta-cliquer sur un objet affiché dans l'image pour activer le « halo Morphic » qui est une constellation d'icônes autour de l'objet actif à l'écran ; chaque icône représentant une poignée de contrôle permettant des actions telles que changer la taille ou faire pivoter l'objet, comme vous pouvez le voir sur la figure 1.3 (c)(10). En survolant lentement une icône avec le pointeur de votre souris, une bulle d'aide en affichera un descriptif de sa fonction. Dans Pharo, meta-cliquer dépend de votre système d'exploitation : soit vous devez maintenir SHIFT Ctrl soit SHIFT Option tout en cliquant.
Saisissez Time now (expression retournant l'heure actuelle) dans le Workspace, puis cliquez avec le bouton d'action dans le Workspace et sélectionnez print it (en français, « imprimez-le ») dans le menu qui apparaît.
Nous recommandons aux droitiers de configurer leur souris pour cliquer avec le bouton gauche (qui devient donc le bouton de clic), cliquer avec le bouton d'action avec le bouton droit et meta-cliquer avec la molette de défilement cliquable, si elle est disponible. Si vous utilisez un Macintosh avec une souris à un bouton, vous pouvez simuler le second bouton en maintenant ⌘ la touche enfoncée en cliquant. Cependant, si vous prévoyez d'utiliser Pharo souvent, nous vous recommandons d'investir dans un modèle à deux boutons au minimum.
Vous pouvez configurer votre souris selon vos souhaits en utilisant les préférences de votre système ou le pilote de votre dispositif de pointage. Pharo vous propose des réglages pour adapter votre souris et les touches spéciales de votre clavier. Dans l'outil de réglage des préférences nommé Preference Browser (System ▷ Preferences… ▷ Preference Browser… dans le menu World ), la catégorie keyboard contient une option swapControlAndAltKeys permettant de permuter les fonctions « cliquer avec le bouton d'action » et « meta-cliquer ». Cette catégorie propose aussi des options afin de dupliquer les touches de modification.
1-2. Le menu World▲
Cliquez dans l'arrière-plan de Pharo.
Le menu World apparaît à nouveau. La plupart des menus de Pharo ne sont pas modaux ; ils ne bloquent pas le système dans l'attente d'une réponse. Avec Pharo vous pouvez maintenir ces menus sur l'écran en cliquant sur l'icône en forme d'épingle au coin supérieur droit. Essayez !
Le menu World vous offre un moyen simple d'accéder à la plupart des outils disponibles dans Pharo.
Étudiez attentivement le menu World et, en particulier, son sous-menu Tools (voir la figure 1.3 (a)).
Vous y trouverez une liste des principaux outils de Pharo. Nous aurons affaire à eux dans les prochains chapitres.
1-3. Envoyer des messages▲
Ouvrez un espace de travail Workspace et saisissez-y le texte suivant :
BouncingAtomsMorph new openInWorld
Maintenant, cliquez avec le bouton d'action. Un menu devrait apparaître. Sélectionnez l'option do it (d) (en français, « faites-le ! ») comme le montre la figure 1.5.
Une fenêtre contenant un grand nombre d'atomes rebondissants (en anglais, « bouncing atoms ») s'ouvre dans le coin supérieur gauche de votre image Pharo.
Vous venez tout simplement d'évaluer votre première expression Smalltalk. Vous avez juste envoyé le message new à la classe BouncingAtomsMorph ce qui résulte de la création d'une nouvelle instance qui à son tour reçoit le message openInWorld. La classe BouncingAtomsMorph a décidé de ce qu'il fallait faire avec le message new : elle recherche dans ses méthodes pour répondre de façon appropriée au message new (c.-à-d. « nouveau » en français ; ce que nous traduirons par nouvelle instance). De même, l'instance BouncingAtomsMorph recherchera dans ses méthodes comment répondre à openInWorld.
Si vous discutez avec des habitués de Smalltalk, vous constaterez rapidement qu'ils n'emploient généralement pas les expressions comme « faire appel à une opération » ou « invoquer une méthode » : ils diront « envoyer un message ». Ceci reflète l'idée que les objets sont responsables de leurs propres actions. Vous ne direz jamais à un objet quoi faire — vous lui demanderez poliment de faire quelque chose en lui envoyant un message. C'est l'objet, et non pas vous, qui choisit la méthode appropriée pour répondre à votre message.
1-4. Enregistrer, quitter et redémarrer une session Pharo.▲
Cliquez sur la fenêtre de démo des atomes rebondissants et déplacez-la où vous voulez. Vous avons maintenant la démo « dans la main ». Posez-la en cliquant.
Sélectionnez World .▷ Save and quit pour sauvegarder votre image et quitter Pharo.
Les fichiers « PBE.image » et « PBE.changes » contenus dans votre dossier Contents/Resources ont changé. Ces fichiers représentent l'image « vivante » de votre session Pharo au moment qui précédait votre enregistrement avec Save and quit. Ces deux fichiers peuvent être copiés à votre convenance dans les dossiers de votre disque pour y être utilisés plus tard : il faudra veiller à ce que le fichier « sources » soit présent et que l'exécutable de la machine virtuelle soit informé de la nouvelle localisation de notre image. Pour le cas du présent cours, il n'est pas souhaitable de toucher à ces fichiers ,mais si vous voulez en savoir plus sur la possibilité de préserver l'image actuelle et de changer d'image en utilisant l'option Save as…, rendez-vous dans la FAQ 4, p. 348.
Relancez Pharo en cliquant sur l'icône de votre programme (en fonction de votre système d'exploitation).
Vous retrouvez l'état de votre session exactement tel qu'il était avant que vous quittiez Pharo. La démo des atomes rebondissants est toujours sur votre fenêtre de travail et les atomes continuent de rebondir depuis la position qu'ils avaient lorsque vous avez quitté Pharo.
En lançant pour la première fois Pharo, la machine virtuelle charge le fichier image que vous spécifiez. Ce fichier contient l'instantané d'un grand nombre d'objets et surtout le code préexistant accompagné des outils de développement qui sont d'ailleurs des objets comme les autres. En travaillant dans Pharo, vous allez envoyer des messages à ces objets, en créer de nouveaux, et certains seront supprimés et l'espace mémoire utilisé sera récupéré (c.-à-d. passé au ramasse-miettes ou garbage collector).
En quittant Pharo, vous sauvegardez un instantané de tous vos objets. En sauvegardant par World ▷ Save, vous remplacerez l'image courante par l'instantané de votre session comme nous l'avons fait grâce à Save and quit, mais sans quitter le programme.
Chaque fichier .image est accompagné d'un fichier .changes. Ce dernier contient un journal de toutes les modifications que vous avez faites en utilisant l'environnement de développement. Vous n'avez pas à vous soucier de ce fichier la plupart du temps. Mais comme nous allons le voir plus tard, le fichier .changes pourra être utilisé pour rétablir votre système Pharo à la suite d'erreurs.
L'image sur laquelle vous travaillez provient d'une image de Smalltalk-80 créée à la fin des années 1970. Beaucoup des objets qu'elle contient sont là depuis des décennies !
Vous pourriez penser que l'utilisation d'une image est incontournable pour stocker et gérer des projets, mais comme nous le verrons bientôt il existe des outils plus adaptés pour gérer le code et travailler en équipe sur des projets. Les images sont très utiles, mais nous les considérons comme une pratique un peu dépassée et fragile pour diffuser et partager vos projets alors qu'il existe des outils tels que Monticello qui proposent de biens meilleurs moyens de suivre les évolutions du code et de le partager entre plusieurs développeurs.
Meta-cliquez (en utilisant les touches de modifications appropriées conjointement avec votre souris) sur la fenêtre d'atomes rebondissants(11).
Vous verrez tout autour une collection d'icônes circulaires colorées nommée halo de BouncingAtomsMorph ; l'icône halo est aussi appelée poignée. Cliquez sur la poignée rose pâle qui contient une croix ; la fenêtre de démo disparaît.
1-5. Les fenêtres Workspace et Transcript▲
Fermez toutes fenêtres actuellement ouvertes. Ouvrez un Transcript (grâce au menu World ▷ Tools) et un Workspace. Positionnez et redimensionnez le Transcript et le Workspace pour que ce dernier recouvre le Transcript.
Vous pouvez redimensionner les fenêtres en glissant l'un de leurs coins ou en meta-cliquant pour afficher le halo Morphic : utilisez alors l'icône jaune située en bas à droite.
Une seule fenêtre est active à la fois ; elle s'affiche au premier plan et son contour est alors mis en relief.
Le Transcript est un objet qui est couramment utilisé pour afficher des messages du système. C'est un genre de « console ».
Les fenêtres Workspace (ou espace de travail) sont destinées à y saisir vos expressions de code Smalltalk à expérimenter. Vous pouvez aussi les utiliser simplement pour taper une quelconque note de texte à retenir, comme une liste de choses à faire (en anglais, todo-list) ou des instructions pour quiconque est amené à utiliser votre image. Les Workspaces sont souvent employés pour maintenir une documentation à propos de l'image courante, comme c'est le cas dans l'image standard précédemment chargée (voir la figure 1.2).
Saisissez le texte suivant dans l'espace de travail Workspace :
Transcript show: 'hello world'; cr.
Expérimentez la sélection en double-cliquant dans l'espace de travail à différents points dans le texte que vous venez de saisir. Remarquez comment un mot entier ou tout un texte est sélectionné selon que vous cliquez sur un mot, à la fin d'une chaîne de caractères ou à la fin d'une expression entière.
Sélectionnez le texte que vous avez saisi puis cliquez avec le bouton d'action. Choisissez do it (d) (dans le sens « faites-le ! », c.-à-d. évaluer le code sélectionné) dans le menu contextuel.
Notez que le texte « hello world »(12) apparaît dans la fenêtre Transcript (voir la figure 1.5). Refaites un do it (d) (Le (d) dans l'option de menu do it (d) vous indique que le raccourci-clavier correspondant est CMD–d. Pour plus d'informations, rendez-vous dans la prochaine section !).
1-6. Les raccourcis-clavier▲
Si vous voulez évaluer une expression, vous n'avez pas besoin de toujours passer par le menu accessible en cliquant avec le bouton d'action : les raccourcis-clavier sont là pour vous. Ils sont mentionnés dans les expressions entre parenthèses des options des menus. Selon votre plateforme, vous pouvez être amené à presser l'une des touches de modifications soit Control, Alt, Command ou Meta (nous les indiquerons de manière générique par CMD–touche). Réévaluez l'expression dans le Workspace en utilisant cette fois-ci le raccourci-clavier : CMD–d.
En plus de do it, vous aurez noté la présence de print it (pour évaluer et afficher le résultat dans le même espace de travail), de inspect it (pour inspecter) et de explore it (pour explorer). Jetons un coup d'œil à ceux-ci.
Entrez l'expression « 3 + 4 » dans le Workspace. Maintenant, évaluez-la en faisant un do it avec le raccourci-clavier.
Ne soyez pas surpris que rien ne se passe ! Ce que vous venez de faire, c'est d'envoyer le message + avec l'argument 4 au nombre 3. Le résultat 7 aura normalement été calculé et renvoyé, mais puisque votre espace de travail Workspace ne savait que faire de ce résultat, la réponse a simplement été jetée dans le vide. Si vous voulez voir le résultat, vous devez faire print it au lieu de do it . En fait, print it compile l'expression, l'exécute et envoie le message printString au résultat puis affiche la chaîne de caractères résultante.
Sélectionnez « 3 + 4 » et faites print it (CMD–p).
Cette fois, nous pouvons lire le résultat que nous attendions (voir la figure 1.7).
3 + 4 −→ 7
Nous utilisons la notation −→ comme convention dans tout le cours pour indiquer qu'une expression particulière donne un certain résultat quand vous l'évaluez avec print it.
Effacez le texte surligné « 7 » ; comme Pharo devrait l'avoir sélectionné pour vous, vous n'avez qu'à presser sur la touche de suppression (suivant votre type de clavier Suppr. ou Del.). Sélectionnez 3 + 4 à nouveau et, cette fois, faites une inspection avec inspect it (CMD–i).
Vous devriez maintenant voir une nouvelle fenêtre appelée inspecteur avec pour titre SmallInteger: 7 (voir la figure 1.8). L'inspecteur ou (sous son nom de classe) Inspector est un outil extrêmement utile : il vous permet de naviguer et d'interagir avec n'importe quel objet du système. Le titre nous dit que 7 est une instance de la classe SmallInteger (classe des entiers sur 31 bits). Le panneau de gauche nous offre une vue des variables d'instance de l'objet en cours d'inspection. Nous pouvons naviguer entre ces variables, et le panneau de droite nous affiche leur valeur. Le panneau inférieur peut être utilisé pour écrire des expressions envoyant des messages à l'objet.
Saisissez self squared dans le panneau inférieur de l'inspecteur que vous aviez ouvert sur l'entier 7 et faites un print it. Le message squared (carré) va élever le nombre 7 lui-même (self).
Fermez l'inspecteur. Saisissez dans un Workspace le mot-expression Object et explorez-le grâce à explore it (CMD–I, i majuscule).
Vous devriez voir maintenant une fenêtre intitulée Object contenant le texte « ▷ root: Object ». Cliquez sur le triangle pour l'ouvrir (voir la figure 1.9).
Cet explorateur (ou Explorer) est similaire à l'inspecteur, mais il offre une vue arborescente d'un objet complexe. Dans notre cas, l'objet que nous observons est la classe Object. Nous pouvons voir directement toutes les informations stockées dans cette classe et naviguer facilement dans toutes ses parties.
1-7. Le navigateur de classes Class Browser▲
Le navigateur de classes nommé Class Browser(13) est l’un des outils-clefs pour programmer. Comme nous le verrons bientôt, il y a plusieurs navigateurs ou browsers intéressants disponibles pour Pharo, mais c'est le plus simple que vous pourrez trouver dans n'importe quelle image, que nous allons utiliser ici.
Ouvrez un navigateur de classes en sélectionnant World ▷ Class Browser(14).
Nous pouvons voir un navigateur de classes sur la figure 1.10. La barre de titre indique que nous sommes en train de parcourir la classe Object.
À l'ouverture du Browser, tous les panneaux sont vides excepté le premier à gauche. Ce premier panneau liste tous les paquetages (en anglais, packages) connus ; ils contiennent des groupes de classes parentes.
cliquez sur le paquetage Kernel.
Cette manipulation permet l'affichage dans le second panneau de toutes les classes du paquetage sélectionné.
Sélectionnez la classe Object.
Désormais, les deux panneaux restants se remplissent. Le troisième panneau affiche les protocoles de la classe sélectionnée. Ce sont des regroupements commodes pour relier des méthodes connexes. Si aucun protocole n'est sélectionné, vous devriez voir toutes les méthodes disponibles de la classe dans le quatrième panneau.
Sélectionnez le protocole printing , protocole de l'affichage.
Vous pourriez avoir besoin de faire défiler (avec la barre de défilement) la liste des protocoles pour le trouver. Vous ne voyez maintenant que les méthodes relatives à l'affichage.
Sélectionnez la méthode printString.
Dès lors, vous voyez dans la partie inférieure du Browser le code source de la méthode printString partagé par tous les objets (tous dérivés de la classe Object, exception faite de ceux qui la surchargent).
1-8. Trouver des classes▲
Il existe plusieurs moyens pour trouver une classe dans Pharo. Tout d'abord, comme nous l'avons vu plus haut, nous pouvons savoir (ou deviner) dans quelle catégorie elle se trouve et, de là, naviguer jusqu'à elle avec le navigateur de classes.
Une seconde technique consiste à envoyer le message browse (ce mot a le sens de « naviguer ») à la classe, ce qui a pour effet d'ouvrir un navigateur de classes sur celle-ci (si elle existe bien sûr). Supposons que nous voulions naviguer dans la classe Boolean (la classe des booléens).
Saisissez Boolean browse dans un Workspace et faites un do it.
Un navigateur s'ouvrira sur la classe Boolean (voir la figure 1.11). Il existe aussi un raccourci-clavier CMD –b (browse) que vous pouvez utiliser dans n'importe quel outil où vous trouvez un nom de classe ; sélectionnez le nom de la classe (par ex., Boolean) puis tapez CMD –b.
Utilisez le raccourci-clavier pour naviguer dans la classe Boolean.
Remarquez que nous voyons une définition de classe quand la classe Boolean est sélectionnée, mais sans qu'aucun protocole ni aucune méthode ne le soit (voir la figure 1.11). Ce n'est rien de plus qu'un message Smalltalk ordinaire qui est envoyé à la classe parente lui réclamant de créer une sous-classe. Ici, nous voyons qu'il est demandé à la classe Object de créer une sous-classe nommée Boolean sans aucune variable d'instance, ni variable de classe ou « pool dictionaries » et de mettre la classe Boolean dans la catégorie Kernel-Objects. Si vous cliquez sur le bouton ? en bas du panneau de classes, vous verrez le commentaire de classe dans un panneau dédié comme le montre la figure 1.12.
Souvent, la méthode la plus rapide pour trouver une classe consiste à la rechercher par son nom. Par exemple, supposons que vous êtes à la recherche d'une classe inconnue qui représente les jours et les heures.
Placez la souris dans le panneau des paquetages du Browser et tapez CMD –f ou sélectionnez find class... (f) dans le menu contextuel accessible en cliquant avec le bouton d'action. Saisissez « time » (c.-à-d. le temps, puisque c'est l'objet de notre quête) dans la boîte de dialogue et acceptez cette entrée.
Une liste de classes dont le nom contient « time » vous sera présentée (voir la figure 1.13). Choisissez-en une, disons, Time ; un navigateur l'affichera avec un commentaire de classe suggérant d'autres classes pouvant être utiles. Si vous voulez naviguer dans l'une des autres classes, sélectionnez son nom (dans n'importe quelle zone de texte) et tapez CMD–b.
Notez que si vous tapez le nom complet (et correctement capitalisé c.-à-d. en respectant la casse) de la classe dans la boîte de dialogue de recherche (find), le navigateur ira directement à cette classe sans montrer aucune liste de classes à choisir.
1-9. Trouver des méthodes▲
Vous pouvez parfois deviner le nom de la méthode, ou tout au moins une partie de son nom, plus facilement que le nom d'une classe. Par exemple, si vous êtes intéressé par la connaissance du temps actuel, vous pouvez vous attendre à ce qu'il y ait une méthode affichant le temps maintenant : comme la langue de Smalltalk est l'anglais et que maintenant se dit « now », une méthode contenant le mot « now » a de fortes chances d'exister. Mais où pourrait-elle être ? L'outil Method Finder peut vous aider à la trouver.
Sélectionnez World ▷ Tools ▷ Method Finder.
Saisissez « now » dans le panneau supérieur gauche et cliquez sur accept (ou utilisez simplement la touche ENTRÉE). Le chercheur de méthodes Method Finder affichera une liste de tous les noms de méthodes contenant la sous-chaîne de caractères « now ».
Pour défiler jusqu'à now lui-même, tapez « n » ; cette astuce fonctionne sur toutes les zones à défilement de n'importe quelle fenêtre. En sélectionnant « now », le panneau de droite vous présentera les classes qui définissent une méthode avec ce nom, comme le montre la figure 1.14. Sélectionner une de ces classes vous ouvrira un navigateur sur celle-ci.
À d'autres moments, vous pourriez avoir en tête qu'une méthode existe bien sans savoir comment elle s'appelle. Le Method Finder peut encore vous aider ! Par exemple, partons de la situation suivante : vous voulez trouvez une méthode qui transforme une chaîne de caractères en sa version majuscule, c.-à-d. qui transforme 'eureka' en 'EUREKA'.
Saisissez 'eureka' . 'EUREKA' dans le Method Finder, comme le montre la figure 1.15.
Le Method Finder vous suggère une méthode qui fait ce que vous voulez(15).
Un astérisque au début d'une ligne dans le panneau de droite du Method Finder vous indique que cette méthode est celle qui a été effectivement utilisée pour obtenir le résultat requis. Ainsi, l'astérisque devant String asUppercase vous fait savoir que la méthode asUppercase (traduisible par « en tant que majuscule ») définie dans la classe String (la classe des chaînes de caractères) a été exécutée et a renvoyé le résultat voulu. Les méthodes qui n'ont pas d'astérisque ne sont que d'autres méthodes que celles qui retournent le résultat attendu. Character»asUppercase n'a pas été exécutée dans notre exemple, parce que 'eureka' n'est pas un caractère de classe Character.
Vous pouvez aussi utiliser le Method Finder pour trouver des méthodes avec plusieurs arguments ; par exemple, si vous recherchez une méthode qui trouve le plus grand commun diviseur de deux entiers, vous pouvez essayer de saisir 25. 35. 5. Vous pouvez aussi donner au Method Finder de multiples exemples pour restreindre le champ des recherches ; le texte d'aide situé dans le panneau inférieur vous apprendra comment faire.
1-10. Définir une nouvelle méthode▲
L'avènement de la méthodologie de développement orientée tests ou Test Driven Development(16) a changé la façon d'écrire du code. L'idée derrière cette technique aussi appelée TDD se résume par l'écriture du test qui définit le comportement désiré de notre code avant celle du code proprement dit. À partir de là seulement, nous écrivons le code qui satisfait au test.
Supposons que nous voulions écrire une méthode qui « hurle quelque chose ». Qu'est-ce que cela veut dire au juste ? Quel serait le nom le plus convenable pour une telle méthode ? Comment pourrions-nous être sûrs que les programmeurs en charge de la maintenance future du code auront une description sans ambiguïté de ce que ce code est censé faire ? Nous pouvons répondre à toutes ces questions en proposant l'exemple suivant :
quand nous envoyons le message shout (qui veut dire « crier » en anglais) à la chaîne de caractères « Pas de panique », le résultat devrait être « PAS DE PANIQUE ! ».
Pour faire de cet exemple quelque chose que le système peut utiliser, nous le transformons en méthode de test :
testShout
self assert: ('Pas de panique' shout = 'PAS DE PANIQUE!')
Comment créons-nous une nouvelle méthode dans Pharo ? Premièrement, nous devons décider quelle classe va accueillir la méthode. Dans ce cas, la méthode shout que nous testons ira dans la classe String car c'est la classe des chaînes de caractères et « Pas de panique » en est une. Donc, par convention, le test correspondant ira dans une classe nommée StringTest.
Ouvrez un navigateur de classes sur la classe StringTest. Sélectionnez un protocole approprié pour notre méthode ; dans notre cas, tests - converting (signifiant tests de conversion, puisque notre méthode modifiera le texte en retour), comme nous pouvons le voir sur la figure 1.16. Le texte surligné dans le panneau inférieur est un patron de méthode qui vous rappelle ce à quoi ressemble une méthode. Effacez-le et saisissez le code de la méthode 1.1.
Une fois que vous avez commencé à entrer le texte dans le navigateur, l'espace de saisie est entouré de rouge pour vous rappeler que ce panneau contient des changements non sauvegardés. Lorsque vous avez fini de saisir le texte de la méthode de test, sélectionnez accept (s) grâce au menu activé en cliquant avec le bouton d'action dans ce panneau ou utilisez le raccourci clavier CMD–s : ainsi, vous compilerez et sauvegarderez votre méthode.
Si c'est la première fois que vous acceptez du code dans votre image, vous serez invité à saisir votre nom dans une fenêtre spécifique. Beaucoup de personnes ont contribué au code de l'image ; c'est important de garder une trace de tous ceux qui créent ou modifient les méthodes. Entrez simplement votre prénom suivi de votre nom sans espaces ni point de séparation.
Puisqu'il n'y a pas encore de méthode nommée shout, le Browser vous demandera confirmation que c'est bien le nom que vous désirez — il vous suggérera d'ailleurs d'autres noms de méthodes existantes dans le système (voir la figure 1.18). Ce comportement du navigateur est utile si vous aviez effectivement fait une erreur de frappe. Mais ici, nous voulons vraiment écrire shout puisque c'est la méthode que nous voulons créer. Dès lors, nous n'avons qu'à confirmer cela en sélectionnant la première option parmi celles du menu, comme vous le voyez sur la figure 1.18.
Lancez votre test nouvellement créé : ouvrez le programme SUnit nommé TestRunner depuis le menu World.
Les deux panneaux les plus à gauche se présentent un peu comme les panneaux supérieurs du Browser. Le panneau de gauche contient une liste de catégories restreintes aux catégories qui contiennent des classes de test.
Sélectionnez CollectionsTests-Text et le panneau juste à droite vous affichera alors toutes les classes de test de cette catégorie dont la classe StringTest.
Les classes sont déjà sélectionnées dans cette catégorie ; cliquez alors sur Run Selected pour lancer tous ces tests.
Vous devriez voir un message comme celui de la figure 1.19, vous indiquant qu'il y a eu une erreur lors de l'exécution des tests. La liste des tests qui donne naissance à une erreur est affichée dans le panneau inférieur de droite ; comme vous pouvez le voir, c'est bien StringTest»#testShout le coupable (remarquez que la notation StringTest»#testShout est la convention Smalltalk pour identifier la méthode de la classe StringTest). Si vous cliquez sur cette ligne de texte, le test erroné sera lancé à nouveau, mais cette fois-ci, de telle façon que vous voyez l'erreur surgir : « MessageNotUnderstood: ByteString»shout ».
La fenêtre qui s'ouvre avec le message d'erreur est le débogueur Smalltalk (voir la figure 1.20). Nous verrons le débogueur nommé Debugger et ses fonctionnalités dans le chapitre 6.
L'erreur était bien sûr attendue ; lancer le test génère une erreur parce que nous n'avons pas encore écrit la méthode qui dit aux chaînes de caractères comment hurler c.-à-d. comment répondre au message shout. De toute façon, c'est une bonne pratique de s'assurer que le test échoue ; cela confirme que nous avons correctement configuré notre machine à tests et que le nouveau test est en cours d'exécution. Une fois que vous avez vu l'erreur, vous pouvez cliquer sur le bouton Abandon pour abandonner le test en cours, ce qui fermera la fenêtre du débogueur. Sachez qu'en Smalltalk vous pouvez souvent définir la méthode manquante directement depuis le débogueur en utilisant le bouton Create, en y éditant la méthode nouvellement créée puis, in fine, en appuyant sur le bouton Proceed pour poursuivre le test. Définissons maintenant la méthode qui fera du test un succès !
Sélectionnez la classe String dans le Browser et rendez-vous dans le protocole déjà existant des méthodes de conversion et appelé converting. À la place du patron de création de méthode, saisissez le texte de la méthode 1.2 et faites accept (saisissez ˆ pour obtenir un ↑)
shout
↑ self asUppercase, '!'
La virgule est un opérateur de concaténation de chaînes de caractères, donc, le corps de cette méthode ajoute un point d'exclamation à la version majuscule (obtenue avec la méthode asUppercase) de l'objet String auquel le message shout a été envoyé. Le ↑ dit à Pharo que l'expression qui suit est la réponse que la méthode doit retourner ; dans notre cas, il s'agit de la nouvelle chaîne concaténée.
Est-ce que cette méthode fonctionne ? Lançons tout simplement notre test afin de le savoir.
Cliquez encore sur le bouton Run Selected du Test Runner. Cette fois vous devriez obtenir une barre de signalisation verte (et non plus rouge) et son texte vous confirmera que tous les tests lancés se feront sans aucun échec (ni failures, ni errors).
Vous voyez une barre verte dans le Test Runner ? Bravo ! Sauvegardez votre image et faites une pause. Vous l'avez bien méritée.
1-11. Résumé du chapitre▲
Dans ce chapitre, nous vous avons introduit à l'environnement de Pharo et nous vous avons montré comment utiliser certains de ses principaux outils comme le Browser, le Method Finder et le Test Runner. Vous avez pu avoir un aperçu de la syntaxe sans que vous puissiez encore la comprendre suffisamment à ce stade.
- Un système Pharo fonctionnel comprend une machine virtuelle (souvent abrégée par VM), un fichier « sources » et un couple de fichiers : une image et un fichier « changes ». Ces deux derniers sont les seuls à être susceptibles de changer, puisqu'ils sauvegardent un cliché du système actif.
- Quand vous restaurez une image Pharo, vous vous retrouvez exactement dans le même état — avec les mêmes objets lancés — que lorsque vous l'avez laissée au moment de votre dernière sauvegarde de cette image.
- Pharo est destiné à fonctionner avec une souris à trois boutons pour cliquer, cliquer avec le bouton d'action ou meta-cliquer. Si vous n'avez pas de souris à trois boutons, vous pouvez utiliser des touches de modifications au clavier pour obtenir le même effet.
- Vous cliquez sur l'arrière-plan de Pharo pour faire apparaître le menu World et pouvoir lancer divers outils depuis celui-ci.
- Un Workspace ou espace de travail est un outil destiné à écrire et évaluer des fragments de code. Vous pouvez aussi l'utiliser pour y stocker un texte quelconque.
- Vous pouvez utiliser des raccourcis-clavier sur du texte dans un Workspace ou tout autre outil pour en évaluer le code. Les plus importants sont do it (CMD–d), print it (CMD–p), inspect it (CMD–i) et explore it (CMD–I).
- SqueakMap est un outil pour télécharger des paquetages utiles depuis Internet.
- Le navigateur de classes Browser est le principal outil pour naviguer dans le code Pharo et pour développer du nouveau code.
- Le Test Runner permet d'effectuer des tests unitaires. Il supporte pleinement la méthodologie de programmation orientée tests connue sous le nom de Test Driven Development.