Outils pour utilisateurs

Outils du site


cours:informatique:dev:programmation_objet_pharo:215_messages_sequences_et_cascades

Comprendre les messages : Séquence et Cascade

On aborde ici deux points, qui sont la séquence et la cascade d'expression que vous allez retrouver constamment en Pharo.

  1. " . est un séparateur d'expression"
  2. expr1.
  3. expr2. expr3.
  4.  
  5. "Exemple"
  6. Transcript cr.
  7. Transcript show:1. Transcript show:33.

L'idée, c'est que souvent, vous avez plusieurs expressions qui se suivent et donc on va devoir les séparer: on va les séparer avec un point ..

C'est ce que montre l'exemple ci-dessus. Là vous avez l'expression Transcript cr. Le Transcript est un petit outil pour faire du log, ici on envoie le message unaire cr (ligne 6) à l'objet Transcript pour passer à la ligne, puis on montre l'objet 1 via le message à mot-clé show: puis l'objet 33 de la même manière (ligne 7). Les expressions sont séparées par des points..

Ici un autre exemple.

  1. |macNode pcNode|
  2.  
  3. macNode := Workstation withName #mac.
  4. macNode sendPacket: 'HelloWorld'

On définit deux variables locales (ligne1), on définit une Workstation, c'est un simulateur de réseaux, on met un point parce que c'est la fin de cette expression (ligne 3), et on continue sur l' autre expression. On aurait pu mettre un point sur la dernière ligne (ligne 4), on ne l'a pas fait, ce n'est pas une faute de syntaxe. Le point est un séparateur, ce n'est pas un terminateur. En Java, vous seriez forcés de mettre un point-virgule à la fin de chaque expression, mais en Pharo vous n'avez pas besoin.

Pour les débutants en Pharo (parfois c'est un peu étrange) notons que pour la définition de variables locales (ligne 1) on utilise les barres verticales et il n'y a pas de point: vous aurez un cours là-dessus aussi dans le futur.

En général on commence par la définition de variable locale puis après la première expression, on met un point.

Donc maintenant, il y a autre chose, c'est que souvent on se trouve dans la situation suivante où on aimerait envoyer plusieurs messages au même objet. Et comme on est un peu feignant, on aimerait bien éviter de répéter toujours le receveur de l'objet. Donc, regardez le cas de figure. J'ai Transcript cr. , Transcript show:, Transcript, vous avez vu que déjà j'ai dit trois fois Transcript, alors que j'aimerais le dire qu'une seule fois. Je peux le faire, je vais utiliser ce qu'on appelle une cascade, c'est le point-virgule. Donc, là je vais faire Transcript cr. , j'envoie un message cr à l'objet Transcript, et la cascade dit “À partir de maintenant tous les messages sont envoyés au même receveur que le premier”. Donc ça veut dire que show: 1 va être envoyé à Transcript, que show: 2 va être envoyé à Transcript. D'accord? Donc je répète un petit coup parce que c'est un point particulier. J'envoie le premier message cr normalement. Et à partir de cr, je dis “au lieu de mettre point, qui est un séparateur, je vais mettre un point-virgule”, je vais dire “tous les autres messages, tu les envoies au même receveur”. Donc show: 1 va être envoyé au même receveur, le point-virgule dit “show: 2 va être envoyé au même receveur que moi”. Voilà. Donc, un autre exemple. Imaginons, souvent on veut créer une collection, donc on dit “moi, j'ai une collection donc je définis une variable c. Dans la variable c, je mets ma collection, vous voyez le point ici. Je mets 1 dans la collection, je mets 2 dans la collection”. Cette expression est strictement équivalente à celle-là. Ça veut dire que là, je vais faire OrderedCollection new, je la crée et j'envoie le premier message add:1 pour ajouter un élément et je mets point-virgule, ça veut dire je veux envoyer ce message-là à cette collection. Donc, moi ce que je vous suggère quand vous abordez Pharo c'est: ne vous prenez pas la tête à utiliser la cascade. Par contre, pourquoi on vous l'a présentée? C'est que vous allez lire du code et que dans le code les gens l'utilisent. Et une fois que vous aurez compris que vous êtes à l'aise avec cette syntaxe-là, avec les points, vous pouvez vous dire “bon, là, je peux commencer à être un peu plus agile et je vais utiliser la cascade”. En général, c'est comme ça que moi j'ai appris, c'est tranquillement de passer les étapes une par une. Donc voilà, donc qu'est-ce qu'on a vu? On a vu qu’on a le point qui est un séparateur qui est l'équivalent du point-virgule en Java. On a le point-virgule qui est une casquette qui évite de répéter plusieurs fois le même receveur. Et la cascade rend la valeur du dernier message envoyé.

Dans l'exemple ci-dessous combien de messages sont envoyés au stream (flux)?

  1. Stream new
  2. nextPutAll: familyGroupName asString, '::';
  3. nextPutAll:
  4. (locationType = #absolute
  5. ifTrue:['']
  6. ifFalse:['{',locationType asString,'}']);
  7. nextPutAll: absoluteOrRelativePath asString;
  8. cr

Réponse:

4 messages. Les trois messages “nextPutAll:” et le message “cr” sont tous envoyés au stream. Le message “new” est envoyé à Stream, qui est une classe, pas un flux. L'indentation aide souvent à comprendre quels messages sont envoyés à quels objets.

Combien de messages sont envoyés dans l'expression suivante ?

announcer replace: self with: (AnnouncementSubscription new announcer: announcer;
action: action asMessageSend) 

5 messages en tout. Messages: “replace:with:”, “new”, “announcer:”, “action:”, asMessageSend. La cascade permet d'envoyer les deux messages announcer: et action: au même objet (instance de AnnouncementSubscription).

cours/informatique/dev/programmation_objet_pharo/215_messages_sequences_et_cascades.txt · Dernière modification : 2022/07/18 08:50 de yoann