Alors, dans cette séquence, on va voir le modèle-objet de Pharo.
Donc, on va faire un survol de tout le modèle-objet pour
essayer de vous en montrer l'élégance et la simplicité.
Donc l'objectif, c'est vraiment de ne pas tout comprendre
cette fois-ci, puisqu'on reviendra sur la plupart de ces
notions dans les séquences qui vont suivre et les prochaines semaines.
Donc, en Pharo, il n'y a que des objets et des messages.
Donc, il va y avoir beaucoup d'objets.
Des objets pour représenter le curseur de la souris, les
booléens, les tableaux, les nombres, les chaînes de
caractères, les fenêtres, les scrollbars, ce que vous
voulez, voire même le compilateur, les objets du système,
que ce soit les sockets, les polices de caractères, les collections, etc.
Tout ça, ça sera des objets et ces objets-là, on va
pouvoir leur envoyer des messages. On va leur envoyer
différents types de messages. Il y en aura plein.
Par exemple à une collection, je pourrai lui envoyer
message le message size pour obtenir sa taille, le
message +, le message ot:put, le message do.
Donc, des objets et des messages.
Donc, les messages dénotent l'intention du programmeur,
quand j'envoie un message à un objet, je lui demande de
réaliser un traitement. Donc, c'est vraiment une demande
à l'objet qu'on fait. Et l'objet va décider de la méthode
à exécuter pour réaliser ces traitements.
Donc, c'est le comment.
Comment réaliser l'intention du programmeur en décidant
quelle méthode à exécuter. Donc ensuite, on a un autre
concept qui est le concept de closure, donc c'est les
fermetures lexicales, ce sont des blocks, des sortes de
méthodes anonymes en Pharo.
On appelle ça des blocks en Pharo.
C'est le vocabulaire important.
Donc, les blocks sont délimités par des crochets.
Par exemple, ici, vous avez un exemple: crochet ouvrant, crochet fermant.
Donc tout ça, c'est un block, d'accord?
Donc on verra, il faut considérer ça comme une méthode anonyme.
Donc, en Pharo, on a un modèle qui est très simple et très uniforme.
Tout est objet, tout est instance d'une classe.
Même les classes et les messages sont des objets
eux-mêmes, et tous les calculs se passent par envoi de
messages à des objets. Donc, on parle vraiment d'envoi de messages.
Donc, c'est le terme consacré, et pas d'exécution de
méthodes, puisque quand on envoie un message à un objet,
il y a un algorithme particulier qu'on appelle le method lookup.
Donc, c'est un algorithme qui va sélectionner la bonne méthode à exécuter.
Donc, les méthodes; en fait, elles sont virtuellement
liées, elles acceptent la liaison tardive.
Donc, j'envoie un message à un objet.
Et il y a le method lookup qui va sélectionner la bonne méthode à exécuter.
Donc, on reviendra là-dessus dans une séquence particulière.
Donc, le modèle-objet de Pharo est le suivant: les
variables d'instance sont protégées.
Donc, tous les objets ont des variables d'instance et
elles sont protégées, c'est-à-dire qu'elles ne sont
accessibles que par l'objet lui-même, ou alors depuis les
sous-classes de cet objet.
Les méthodes sont publiques et virtuellement liées.
Donc, toutes les méthodes sont publiques.
Il n'y a pas de mot-clé public en Pharo.
Et puis Pharo accepte l'héritage simple entre classes.
Donc, une classe ne peut avoir qu'une seule super-classe.
Donc, voici un exemple de code qui est le produit en
croix de deux points: donc on a un point 1 et un point
2, donc je vais multiplier le champ X du point 1 par le
choix Y du point 2 et le soustraire à la multiplication
du champ Y du point 1 et le champ X du point 2.
Donc, c'est un exemple de calcul qu'on peut réaliser en Pharo.
Donc, pour créer des objets en fait, on va avoir des
messages particuliers, donc par exemple ici, si j'envoie
le message @ à l'entier 10 et que je passe en
paramètre l'entier 20, ça va me créer un point, donc une
instance de la classe point.
Donc ici, le nom du message, c'est bien @, le receveur du
message, l'entier qui a reçu le message, c'est l'entier
10, c'était celui qui était avant le nom du message, et
puis l'argument, c'était 20, celui qui était après le nom du message.
Donc, un autre exemple, par exemple ici, je vais créer
une chaîne de caractères, on voit le résultat ici c'est
une chaîne de caractères. Et comment cette chaîne de
caractères a été obtenue ?
On a utilisé une première chaîne de caractères, ici,'Pharo'.
On lui a envoyé le message, virgule.
En paramètre de ce message, on avait la chaîne de
caractères'is Cool'd'accord qui est ici.
Et la sémantique du message virgule, c'est la
concaténation de chaines, donc les deux chaînes ont été
collées pour en produire une seule concaténée.
Donc on peut créer des objets en instanciant une classe
directement grâce au message new par exemple.
Donc, si j'ai une classe Monster, j'envoie le message
new, j'obtiens bien une instance de la classe monster donc un objet monstre.
Je peux créer une instance de la classe tableau, Array,
en spécifiant l'objet new et en passant un paramètre.
Pour passer un paramètre, c'est deux points, et puis je
passe l'entier 6 et j'obtiens bien un tableau de taille 6.
Donc, on peut avoir des types de message particulier pour
créer des objets et je peux définir mes propres messages
sur mes classes typiquement, je peux créer une classe
Tamagotchi avec une méthode withHunger.
Cette méthode-là, je vais lui passer l'entier 10, ça
permet de créer une instance de la classe Tamagotchi en
les passant en paramètres. Donc c'est vraiment des
messages pour spécialiser pour la création d'objets.
Donc, ce qu'on a vu dans cette séquence, c'était un
survol du modèle objet de Pharo.
L'objectif, ce n'était pas de tout comprendre.
On reviendra sur ces notions dans les prochaines séquences.
Mais ce qu'il est important de retenir, c'est qu'il n'y a
pas de constructeur en Pharo.
Il n'y a pas de méthode statique.
Il n'y a pas de déclaration type.
Il n'y a pas d'interface.
Il n'y a pas de package, de private, de protected.
Tous les modifieurs que l'on rencontre dans les langages AEG.
Il n'y a pas de type paramétré, il n'y a pas de boxing,
unboxing et vous verrez que c'est pourtant un langage extrêmement puissant.
Donc, en Pharo, tout est objet.
Tous les calculs se passent par envoi de messages à des
objets, donc les méthodes acceptent la liaison
tardive, d'accord. Donc, c'est-à-dire qu'il y a un
algorithme qu'on appelle le method lookup qui va
sélectionner la bonne méthode à exécuter quand un objet reçoit un message.
Il y a la notion de blocks qui sont des méthodes anonymes.
On verra que c'est extrêmement important en Pharo.
Et puis, on peut envoyer des messages particuliers à des
classes pour créer des objets.