Bonjour. Donc dans ce cours, on va vraiment prendre le
temps de comprendre comment marchent les méthodes de classe.
Donc normalement, vous avez fait l'exercice avec le
counter et puis vous avez fait une méthode de classe, ça
a marché, très bien. Maintenant, on va vraiment regarder
pour que vous ayez compris une fois pour toutes.
Donc ce que vous allez apprendre dans ce cours, c'est qu'en
fait dans Pharo il n'y a pas de différence entre une
méthode de classes et une méthode d'instances au niveau
de la recherche de la méthode, il n'y a qu'un seul
mécanisme de recherche de méthode qui est invoqué, et qui
est utilisé et qui existe d'ailleurs, qui a été défini
dans la machine virtuelle. Et vous allez voir que, alors
que l'on aurait pu dire que les méthodes de classe en
première approche sont comme des méthodes statiques en
Java, ce n'est pas le cas. En fait, elles sont
dynamiquement liées, ça veut dire qu'il y a une recherche
à l'exécution qui se fait alors qu'en Java typiquement,
les méthodes statiques ne sont pas cherchées dynamiquement.
Donc regardons comment ça marche.
En fait, ce que vous avez vu, c'est qu'il n'y a qu'une
seule recherche de méthode qui commence toujours dans la classe du receveur.
Donc si la méthode est définie dans la classe, alors elle
est rendue, sinon on va chercher dans la super classe.
Donc ce que ça donne graphiquement, c'est que j'ai mon
instance de la classe Counter, quand je lui envoie le
message Increment, qu'est-ce qui va se passer?
Première étape, je cherche dans la classe du Counter et
je remonte donc si j'incrémente, il est défini là, si c'est
une méthode qui est définie plus haut dans la hiérarchie,
elle sera cherchée plus haut.
Et en fait, ce mécanisme-là dans Pharo, il est utilisé,
il n'y en a qu'un, il est utilisé aussi bien pour les
instances que pour les classes.
Donc quand vous avez fait l'exercice avec la classe
Counter et que vous avez envoyé le message with value à
la classe Counter, pour créer une instance, qu'est-ce qui s'est passé?
La classe Counter est instance d'une classe qui s'appelle
Counter class et on a cherché, on a suivi le même
principe que précédemment, on a cherché dans la classe du
receveur, le receveur c'était Counter, donc on a cherché
dans la classe Counter classe, on a trouvé la méthode
withValue et on l'a appliquée sur le receveur et ça nous
a rendu une nouvelle instance.
Donc on a appliqué exactement le même procédé que pour
les messages qu'on a envoyés à une instance de la classe Counter.
Donc maintenant, qu'est-ce que c'est qu'une classe en
fait finalement dans Pharo ?
Une classe, c'est une instance.
C'est une instance, c'est un objet comme tous les objets,
de toute façon dans Pharo il n'y a que des objets.
Donc une classe est une instance d'une autre classe qu'on
appelle une méta classe, c'est juste pour les distinguer.
En fait une méta classe, c'est juste une classe dont les
instances sont des classes. Pour faire la différence
entre les instances terminales et les instances qui sont des classes.
Donc maintenant ce qu'il faut voir, c'est que la classe
Counter, c'est ce que je dis dans cette ligne-là, la
classe Counter et l'unique instance de la classe Counter class.
Et cette classe Counter class, elle est créée
automatiquement, ça veut dire que vous ne vous en êtes
pas rendu compte mais quand vous avez défini la classe
Counter, le système a automatiquement créé la classe
Counter class et cette classe Counter class a créé la classe Counter.
Donc il vous a donné l'illusion que vous n'avez créé qu'une
seule classe, mais en fait vous en avez créé 2.
Et ce qu'il faut voir dans Pharo, c'est que toutes les
classes d'une classe qui s'appellerait xxx s'appellent
xxx classe donc si j'ai Counter, la classe de Counter ça
sera Counter class systématiquement.
Donc en fait dans la réalité, ce que vous faites, on vous
montre juste comment ça fonctionne.
On aurait très bien pu par ailleurs ne pas vous l'expliquer,
mais ça veut dire que quand le browser vous montre la
classe Counter, il vous montre le code qui va être
exécuté sur les instances de cette classe.
Ça veut dire qu'incrémente-là, c'est le code qui va être
exécuté sur cette instance-là.
Quand vous cliquez sur le bouton class, pour
définir une méthode de classe, il vous montre le code qui
va être exécuté sur cet objet-là.
Et en fait, si on regarde, quand j'envoie le message
Increment à l'instance Counter, je vais chercher dans la
classe Counter, ah bah tiens, c'est bien cette méthode-là
qui est exécutée, quand j'envoie le message withValue à
la classe Counter, où est-ce que je vais chercher?
Je vais chercher dans sa classe donc je suis ce lien-là
et donc c'est bien cette méthode là.
Donc qu'est-ce que vous devez savoir en fait?
Une classe c'est un objet dans Pharo, les classes peuvent
recevoir des messages, d'ailleurs je vous l'avais dit
quand on a fait la syntaxe, je vous ai dit Date today c'est quoi?
C'est bien un message qu'on a envoyé à une classe.
Il n'y a pas d'éléments syntaxiques différenciants.
C'est la même chose qu'envoyer un message syntaxiquement à une instance.
Et de plus, là, ce que ce cours vous montre c'est qu'il n'y
a qu'une seule recherche de la méthode.
Les méthodes de classessont recherchées dynamiquement
comme les méthodes d'instances, où est-ce qu'elles sont recherchées?
Dans la classe du receveur.
Quand c'est une instance, c'est recherché dans la classe,
quand c'est une instance de classe comme la classe
Counter, c'est recherché dans la méta classe donc dans la
classe qui s'appelle Counter class.
Donc une classe en fait est une instance d'une autre
classe qui s'appelle une méta classe, et il n'y a qu'un
seul lookup qui fonctionne.
Donc on va revenir sur cette notion-là lors de la
dernière séance pour, dans le cours qui s'appelle
Understanding Metaclasses et on va revisiter, et on va
ouvrir vraiment le capot de Pharo, et vous montrer
comment ça fonctionne et que c'est complètement uniforme.