P
'
t
i
t
e
C
h
a
t
t
e
 
spacer~ GEEKISM IS GOOD FOR YOU Articles | Connexion
 
~Le langage Squeak

Précédent  
  Squeak  
  Suivant
 Présentation

Le langage Squeak est un langage entièrement objet. Les classes elle-mêmes correspondent à des objets appelés méta-classes. Apprendre à réaliser de nouvelles classes est donc indispensable à tout programmeur Squeak.

Pour créer une nouvelle classe au sein de l'environnement Squeak le programmeur doit employer le navigateur système par l'intermédiaire du menu open/browser. Toute classe Squeak doit appartenir à une catégorie. La liste proposée à gauche du navigateur dresse l'inventaire complet de toutes les catégories existantes dans votre environnement. Dans le souçi ne pas interférer avec des classes existantes, nous allons ajouter une nouvelle catégorie intitulée "Login-Squeak" en cliquant sur le bouton droit pour sélectionner "add item...".
 Sommaire


 La classe Vehicule

La seconde liste en partant de la gauche présente l'ensemble des classes appartenant à la catégorie sélectionnée. Notre liste doit donc être vide pour l'instant. Toutefois, la partie d'édition en bas de l'écran contient quelques lignes de code (voir listing 1). Ces lignes permettent de définir une nouvelle classe. Le listing 2 crée la classe Vehicule possédant une variable d'instance nommée nombreDeRoues. Les champs proposés donnent la possibilité de définir des variables d'instance, de classe et des dictionnaires. Une fois les paramétrages effectués, nous devons valider la classe en appuyant sur Alt+s. Il s'agit ici d'évaluer le code rédigé dans la zone d'édition. Examinons à nouveau ces lignes. Ce code envoie un message à la classe Object. Ce message concerne l'appel de la méthode subclass:instanceVariableNames:poolDictionaries:category. Une méthode comportant des caractères de ype deux-points désigne une méthode à plusieurs arguments. La valeu de chaque argument se voit précisée après les deux-points.

Object subclass: #NameOfSubclass
  instanceVariableNames: ''
  classVariableNames: ''
  poolDictionaries: ''
  category: 'Login-Squeak'
       
      
JextCopier dans Jext | Jext | Plugin Codegeek
Object subclass: #Vehicule
  instanceVariableNames: 'nombreDeRoues '
  classVariableNames: ''
  poolDictionaries: ''
  category: 'Login-Squeak'
       
      
JextCopier dans Jext
La nouvelle classe Vehicule apparaît à présent dans la liste des classes de la catégorie. En la sélectionnant, nous activons sa liste de catégories de méthodes, la troisième liste en partant de la gauche. L'ajout d'une méthode se réalise toujours au sein d'une catégorie donnée. Nous allons munir notre classe Vehicule de trois méthodes : show pour afficher un message de description de l'instance, roues pour connaître le nombre de roues du véhicule et roues: pour changer le nombre de roues du véhicule. La liste des catégories de méthodes possède deux boutons radio "instance" et "class" dont la manipulation sert à préciser la nature des méthodes : méthode d'instance ou de classe. Nos méthodes sont des méthodes d'instance.


 Les méthodes

Nous allons classer nos trois méthodes show, roues et roues: respectivement dans les catégories show, accesser et mutator. Bien entendu, ces noms sont tout à fait arbitraires et n'ont aucune incidence sur le code. La création d'une catégorie nécessite l'utilisation du menu "new category..." du menu contextuel. Lorsque vous sélectionnez une catégorie, nous commencerons par la catégorie show, de nouvelles lignes de code apparaissent au sein de la zone d'édition. La structure de ces lignes ressemble à celle présentée dans le listing 3.

selecteur et argument
  "commentaire"
  | variables |
  code
       
      
JextCopier dans Jext | Jext | Plugin Codegeek
Le sélecteur désigne le nom de la méthode. Un commentaire, fermé par les guillemets, peut s'étendre sur plusieurs lignes. Enfin, les barres verticales englobent la définition des variables locales à la méthode. La méthode show ne possède aucun argument, aussi nous contenterons nous de rédiger les lignes suivantes :

show
  "Description du véhicule"
  Transcript show: 'Ce véhicule possède '; show: nombreDeRoues; show: ' roues.'; cr.
       
      
JextCopier dans Jext
Le message cr trouvé en fin de ligne indique un saut de ligne dans la fenêtre de sortie standard. Toute méthode Squeak est en réalité une fonction. Autrement dit, la méthode show présentée ci-dessus renvoie toujours une valeur bien que le code ne le précise pas. Une méthode sans retour explicite possède l'instruction suivante :

^self
       
      
JextCopier dans Jext
Le mot-clé self désignant l'objet courant. Ceci n'est pas avéré pour la méthode roues définite de la sorte :

roues
  "Renvoie le nombre de roues du véhicule"
  ^nombreDeRoues
       
      
JextCopier dans Jext
La méthode roues ne demande aucun paramètre et retourne la valeur de la variable d'instance nombreDeRoues. Enfin, voici la méthode roues: servant à modifier la valeur de l'unique variable d'instance de notre classe :

roues: unNombreDeRoues
  "Change le nombre de roues."
  unNombreDeRoues > 0 ifTrue: [nombreDeRoues := unNombreDeRoues].
       
      
JextCopier dans Jext
La méthode roues: prend en paramètre un argument, dont le type est inconnu car Squeak se veut non typé. Nous différencions ainsi les méthodes sans arguments des méthodes avec arguments en post-fixant le nom des méthodes par le signe deux-points. Cette méthode donc affecte une nouvelle valeur à la variable nombreDeRoues, uniquement si la nouvelle valeur se révèle strictement supérieure à zéro.

Détaillons les opérations. L'expression "unNombreDeRoues > 0" se trouve évaluée comme un objet booléen true ou false. Pour tester la valeur de ce booléen, nous pourrions utiliser les opérateurs d'égalité = et ==. Toutefois, nous désirons exécuter un bloc de code suivant la valeur de l'expression. Le bloc de code en question se place entre crochets puis est donnée en paramètre à la méthode ifTrue. Cett dernière s'applique sur un objet booléen et permet l'exécution différée du bloc de code passé en paramètre.

Notre classe terminée, nous pouvons l'utiliser en créant un nouveau workspace :

v := Vehicule new.
v roues: 4.
v show.
       
      
JextCopier dans Jext
Si vous avez ouvert une fenêtre Transcript, l'exécution successive de ces trois lignes devrait conduire à l'affichage du message construit par la méthode show.


 Méthodes à plusieurs paramètres

La classe Vehicule définie jusqu'à présent ne caractérise que le nombre de roues du véhicule. Avant d'explorer les méthodes à plusieurs arguments, vous pouvez, à titre d'exercice, ajouter une nouvelle variable d'instance nombreDeSieges. Vous devrez accompagner cette variable d'un accesseur et d'un mutateur, placés dans les catégories correspondantes. La méthode que nous allons à présent ajouter à la classe octroie l'opportunité de modifier le nombre de roues et le nombre de sièges en même temps.

roues: nbRoues sieges: nbSieges
  "Change le nombre de roues et de sièges."
  nbRoues > 0 ifTrue: [nombreDeRoues := nbRoues].
  nbSieges > 0 ifTrue: [nombreDeSieges := nbSieges].
       
      
JextCopier dans Jext | Jext | Plugin Codegeek
La première ligne de notre méthode désigne l'emploi de deux paramètres : nbRoues et nbSieges. Chaque paramètre possède un identifiant faisant partie intégrante du sélecteur de la méthode. Ainsi, le sélecteur de cette méthode est "roues:sieges:". Nous pouvons l'employer de la sorte :

v := Vehicule new.
v roues: 4 sieges: 2.
v show.
       
      
JextCopier dans Jext
Sachez enfin qu'il est aisé de découvrir la nature exacte d'une classe ou d'un objet. Ainsi, le message class renvoie le nom de la classe d'un objet, le mesasge de classe allInstances donne la liste de toutes les instances existantes de la classe, le message de classe super donne la classe parente et le message de classe subclasses donne la liste des classes filles.



par Romain Guy
romain.guy@jext.org
http://www.jext.org
Dernière mise à jour : 14/10/2006


Précédent  
  Squeak  
  Suivant

 
#ProgX©2005 Mathieu GINOD - Romain GUY - Erik LOUISE