WEBVTT

00:00:07.930 --> 00:00:10.760 align:middle
Bonjour à tous. Dans cette
séquence, nous allons voir

00:00:10.960 --> 00:00:12.390 align:middle
quelques points
avancés sur les classes.

00:00:13.950 --> 00:00:17.370 align:middle
3 points, notamment
comment on va partager de l'état

00:00:17.690 --> 00:00:19.930 align:middle
entre plusieurs instances d'une
même classe et de ses sous-classes.

00:00:20.130 --> 00:00:24.820 align:middle
Deuxième point, on va
voir un point qui permet aux

00:00:25.020 --> 00:00:27.040 align:middle
 classes d'avoir leur propre variable.

00:00:28.680 --> 00:00:30.670 align:middle
Et enfin, on va voir
comment initialiser les classes.

00:00:33.100 --> 00:00:35.920 align:middle
Premier point, partager de
l'état entre plusieurs instances.

00:00:38.640 --> 00:00:42.560 align:middle
On a plusieurs instances
d'une même classe, et toutes ces

00:00:42.760 --> 00:00:47.040 align:middle
instances veulent avoir un objet
commun pour partager de l'état.

00:00:47.670 --> 00:00:52.510 align:middle
En Java, on utilise une
variable d'instance avec le

00:00:52.710 --> 00:00:57.500 align:middle
mot-clé statique. La
valeur d'une variable

00:00:57.700 --> 00:01:00.690 align:middle
statique est la même
pour toutes les instances.

00:01:01.710 --> 00:01:04.540 align:middle
En Pharo, on utilise
les variables de classes.

00:01:06.310 --> 00:01:08.730 align:middle
Vous avez pu voir cette
expression répétée encore et

00:01:08.930 --> 00:01:10.890 align:middle
encore qui permet
de créer une classe.

00:01:11.470 --> 00:01:15.290 align:middle
Là, on crée la classe color, on dit
que c'est une sous-classe d'objects.

00:01:15.800 --> 00:01:19.000 align:middle
On liste ses variables
d'instances et cette ligne-là à

00:01:19.200 --> 00:01:21.040 align:middle
laquelle on n'a pas trop
prêté attention jusqu'à

00:01:21.240 --> 00:01:25.360 align:middle
maintenant liste les variables
de classes de la classe color.

00:01:26.860 --> 00:01:30.120 align:middle
On voit que la classe
color a au moins 2 variables

00:01:30.320 --> 00:01:31.080 align:middle
colorRegistry et componentMask.

00:01:32.800 --> 00:01:35.310 align:middle
Les valeurs d'une variable
de classes sont partagées

00:01:35.510 --> 00:01:38.240 align:middle
entre toutes les instances
d'une classe et toutes les

00:01:38.440 --> 00:01:41.820 align:middle
instances des
sous-classes. Ces variables sont

00:01:42.020 --> 00:01:45.000 align:middle
accessibles à la fois à des
méthodes côté instances et

00:01:45.200 --> 00:01:49.540 align:middle
des méthodes côté classes et ces
variables prennent une majuscule.

00:01:50.820 --> 00:01:54.550 align:middle
Si je reviens à l'exemple
de color, ici, j'ai ma classe

00:01:54.880 --> 00:01:58.070 align:middle
color qui est une instance
de la classe Color class, donc

00:01:58.270 --> 00:01:59.400 align:middle
Color class c'est la méta classe.

00:02:01.160 --> 00:02:04.690 align:middle
On a la classe Color qui
définit 2 variables d'instances

00:02:04.890 --> 00:02:06.630 align:middle
standards, rgb et alpha.

00:02:07.000 --> 00:02:09.140 align:middle
Ces variables
d'instances sont privées

00:02:11.870 --> 00:02:14.250 align:middle
dans le sens où elles sont
accessibles seulement depuis

00:02:14.840 --> 00:02:16.190 align:middle
les méthodes de la classe Color.

00:02:18.420 --> 00:02:22.890 align:middle
Et ColorRegistry, on voit
que c'est une variable qui a 1,

00:02:23.090 --> 00:02:25.550 align:middle
une majuscule 2, qui est soulignée.

00:02:25.750 --> 00:02:30.350 align:middle
Ça indique que cette
variable est une variable de

00:02:30.550 --> 00:02:34.000 align:middle
 classes et qu'elle est
accessible non seulement depuis

00:02:34.200 --> 00:02:36.500 align:middle
les méthodes de la classe
Color, mais aussi depuis les

00:02:36.700 --> 00:02:38.800 align:middle
méthodes de la classe Color class.

00:02:40.240 --> 00:02:43.460 align:middle
Là, on a des exemples
d'utilisation de cette variable-là.

00:02:44.170 --> 00:02:47.110 align:middle
Dans une méthode
d'instances, dans la méthode private

00:02:47.310 --> 00:02:52.000 align:middle
good de la classe color,
on accède à la variable de

00:02:52.200 --> 00:02:54.180 align:middle
 classe avec son nom.

00:02:55.390 --> 00:02:58.420 align:middle
De la même façon, pour
mettre une valeur dans cette

00:02:58.620 --> 00:03:03.150 align:middle
variable, c'est juste 2
points égal comme avec n'importe

00:03:03.350 --> 00:03:05.540 align:middle
quelle variable. Et on
peut faire ça soit du côté

00:03:05.740 --> 00:03:09.200 align:middle
instances, soit du côté
 classes. Très fréquemment, les

00:03:09.400 --> 00:03:14.000 align:middle
valeurs de ces variables
de classes seront lues à l'

00:03:14.200 --> 00:03:18.850 align:middle
intérieur des méthodes
d'instances et seront écrites

00:03:19.310 --> 00:03:21.680 align:middle
à l'intérieur des
méthodes de classes.

00:03:22.120 --> 00:03:23.840 align:middle
C'est juste ce que l'on
retrouve le plus fréquemment,

00:03:24.040 --> 00:03:25.450 align:middle
rien ne contraint à
cette utilisation.

00:03:28.200 --> 00:03:31.390 align:middle
Maintenant, on va parler des
variables d'instances de classes.

00:03:33.540 --> 00:03:34.380 align:middle
Ce n'est pas la même chose.

00:03:35.250 --> 00:03:38.140 align:middle
Une classe, c'est un
objet comme les autres.

00:03:38.450 --> 00:03:41.330 align:middle
Et comme tous les objets une
 classe peut avoir ses instances.

00:03:42.400 --> 00:03:44.800 align:middle
Une classe étant décrite
par sa méta classe, c'est la

00:03:45.000 --> 00:03:47.450 align:middle
méta classe qui va lister
les variables d'instances

00:03:47.650 --> 00:03:52.270 align:middle
auxquelles son unique instance, qui
est donc la classe, va pouvoir accéder.

00:03:53.420 --> 00:03:57.760 align:middle
Pour définir une variable
d'instances du côté classes,

00:03:58.480 --> 00:04:01.500 align:middle
on appuie sur le bouton
 classes dans le navigateur de

00:04:01.700 --> 00:04:03.330 align:middle
code, ce qui nous
donne cette expression-là.

00:04:03.530 --> 00:04:07.000 align:middle
Là, je suis en train de
naviguer dans la classe

00:04:07.200 --> 00:04:10.000 align:middle
RPackageSet et sa
méta classe définit une

00:04:12.010 --> 00:04:12.770 align:middle
variable cashePackages.

00:04:13.000 --> 00:04:17.610 align:middle
Ces variables ne
sont accessibles que des

00:04:17.810 --> 00:04:22.330 align:middle
méthodes de classes et
les variables commencent

00:04:23.000 --> 00:04:24.890 align:middle
toujours par une lettre minuscule.

00:04:25.770 --> 00:04:27.000 align:middle
Là, vous avez un exemple.

00:04:27.960 --> 00:04:32.350 align:middle
La variable cash packages est définie
dans la méta classe RPackageSet class.

00:04:35.330 --> 00:04:39.540 align:middle
Ce qui signifie que la
 classe RPackageSet, qui est une

00:04:39.740 --> 00:04:44.670 align:middle
instance de la méta classe,
a une valeur associée à cette

00:04:44.870 --> 00:04:49.700 align:middle
variable. De la même façon, toutes

00:04:49.900 --> 00:04:54.320 align:middle
les instances des
sous-classes de RPackageSet class ont

00:04:54.520 --> 00:04:58.550 align:middle
une valeur dédiée pour cette
variable, une valeur différente.

00:04:58.750 --> 00:05:00.090 align:middle
Là, il n'y a aucun partage.

00:05:00.460 --> 00:05:04.000 align:middle
Chaque instance de la
 classe RPackageSet class ou d'une

00:05:04.200 --> 00:05:07.150 align:middle
de ses sous-classes va avoir sa
propre valeur pour cette variable-là.

00:05:08.320 --> 00:05:12.000 align:middle
On va bien distinguer les
variables de classes et les

00:05:12.200 --> 00:05:15.030 align:middle
variables d'instances côté
 classes grâce à un exemple.

00:05:15.230 --> 00:05:18.380 align:middle
Là, on va implémenter le
design pattern Singleton, dont

00:05:18.580 --> 00:05:23.230 align:middle
le but c'est de garantir qu'on a une
et une seule instance d'une classe.

00:05:25.140 --> 00:05:27.720 align:middle
Une solution pour
implémenter un Singleton, c'est de

00:05:27.920 --> 00:05:32.720 align:middle
stocker dans une
variable l'instance à laquelle

00:05:32.920 --> 00:05:35.350 align:middle
tout le monde va accéder et
de désactiver la construction

00:05:35.550 --> 00:05:37.820 align:middle
de nouvelles instances.
C'est exactement ce qu'on va

00:05:38.020 --> 00:05:39.080 align:middle
faire dans cet exemple de webServer.

00:05:39.280 --> 00:05:43.900 align:middle
Là, j'utilise une
variable d'instance côté

00:05:44.100 --> 00:05:45.280 align:middle
 classes, ce qu'on vient de voir.

00:05:46.780 --> 00:05:51.050 align:middle
Nom minuscule, c'est dans la
définition de ma méta classe

00:05:51.250 --> 00:05:52.500 align:middle
que je vais définir
cette variable-là.

00:05:52.700 --> 00:05:56.740 align:middle
Là, je désactive
l'exécution de la méthode new,

00:05:57.890 --> 00:06:00.440 align:middle
personne ne pourra envoyer
le message new à la classe web

00:06:00.640 --> 00:06:02.130 align:middle
serveur pour créer une
nouvelle instance, il faudra

00:06:02.330 --> 00:06:06.290 align:middle
absolument passer par
uniqueInstance, qui renvoie soit

00:06:07.340 --> 00:06:09.550 align:middle
la valeur de la variable si
ce n'est pas vide, s'il y a

00:06:09.750 --> 00:06:12.370 align:middle
déjà quelque chose dedans,
soit qui met quelque chose

00:06:12.570 --> 00:06:16.380 align:middle
dans cette variable, qui
grâce à super new va créer une

00:06:16.580 --> 00:06:19.290 align:middle
nouvelle instance de la
 classe web serveur et qui va

00:06:19.490 --> 00:06:21.880 align:middle
mettre cette instance dans
la variable unique instance.

00:06:22.670 --> 00:06:27.350 align:middle
Le fait d'avoir utilisé des
 classes instance variable va

00:06:27.550 --> 00:06:30.350 align:middle
faire qu'on a la
conséquence suivante.

00:06:31.200 --> 00:06:35.470 align:middle
Chaque sous-classe de la
 classe webServer va avoir sa

00:06:35.670 --> 00:06:38.340 align:middle
propre valeur pour uniqueInstance.

00:06:38.540 --> 00:06:43.310 align:middle
C'est-à-dire que si web
serveur a 3 sous-classes, il va

00:06:43.510 --> 00:06:47.140 align:middle
y avoir en tout 4
valeurs pour la variable

00:06:47.340 --> 00:06:49.030 align:middle
uniqueInstance, donc une
pour webServer et une pour

00:06:49.230 --> 00:06:50.000 align:middle
chacune de ces sous-classes-là.

00:06:51.520 --> 00:06:54.440 align:middle
Si maintenant, j'utilise
une variable de classes.

00:06:55.100 --> 00:06:59.050 align:middle
Là, on édite la classe côté

00:06:59.480 --> 00:07:03.680 align:middle
instances et on ajoute
UniqueInstance avec une majuscule.

00:07:06.960 --> 00:07:11.210 align:middle
De la même façon, j'interdis
l'envoi du message new et j'implémente

00:07:11.410 --> 00:07:13.680 align:middle
UniqueInstance, la seule
chose qui a changé c'est que j'ai

00:07:13.880 --> 00:07:16.110 align:middle
mis un U majuscule
plutôt qu'un u minuscule.

00:07:18.070 --> 00:07:22.930 align:middle
Conséquence de choisir une
variable de classe, on a un

00:07:23.130 --> 00:07:24.610 align:middle
singleton pour
l'ensemble de la hiérarchie.

00:07:24.960 --> 00:07:29.470 align:middle
Si le webServer a 3
sous-classes, les 3 sous-classes plus

00:07:29.670 --> 00:07:32.360 align:middle
la classe webServer vont
partager le même singleton, donc

00:07:32.560 --> 00:07:36.920 align:middle
on aura une instance qui
sera partagée par tout le monde.

00:07:37.120 --> 00:07:39.120 align:middle
Maintenant, on va parler
d'initiation de classes parce qu'on

00:07:39.320 --> 00:07:41.170 align:middle
peut avoir des variables
qui sont partagées entre

00:07:41.370 --> 00:07:43.200 align:middle
plusieurs instances, on
peut avoir des variables de

00:07:43.400 --> 00:07:45.200 align:middle
 classes, mais à un moment
il va bien falloir mettre une

00:07:45.400 --> 00:07:49.000 align:middle
valeur dans ces
variables-là. En général, on fait ça au

00:07:49.200 --> 00:07:50.000 align:middle
moment de
l'initialisation de la classe.

00:07:51.110 --> 00:07:55.040 align:middle
Les objets sont initialisés lorsque
est envoyé le message initialize dessus.

00:07:55.380 --> 00:07:57.760 align:middle
Les classes, c'est pareil,
on peut envoyer le message

00:07:57.960 --> 00:08:00.110 align:middle
initialize à une classe
et c'est dans le code de la

00:08:00.310 --> 00:08:03.950 align:middle
méthode initialize qu'on va décider
comment les variables sont initialisées.

00:08:06.000 --> 00:08:09.800 align:middle
Si je veux initialiser la
 classe couleurs, j'envoie le

00:08:10.000 --> 00:08:11.800 align:middle
message initialize à la classe Color.

00:08:12.730 --> 00:08:16.130 align:middle
En général, lorsque une
 classe est chargée dans le

00:08:16.330 --> 00:08:19.820 align:middle
système, grâce au
gestionnaire de versions, le message

00:08:20.020 --> 00:08:23.660 align:middle
initialize est automatiquement
envoyé à toutes les classes au bon moment.

00:08:23.860 --> 00:08:25.460 align:middle
Donc, il n'y a pas besoin
de se préoccuper d'envoyer le

00:08:25.660 --> 00:08:28.940 align:middle
message initialize manuellement à
toutes les classes qu'on recherche.

00:08:29.140 --> 00:08:31.670 align:middle
Par contre, si on
implémente une classe, le développeur

00:08:31.870 --> 00:08:34.580 align:middle
qui crée une nouvelle classe
avec une méthode initialize,

00:08:34.780 --> 00:08:37.000 align:middle
va devoir envoyer ses
messages initialize lui-même.

00:08:38.630 --> 00:08:40.590 align:middle
Là, on a un exemple
dans la classe Color.

00:08:41.680 --> 00:08:44.870 align:middle
On voit qu'ici on est bien
du côté de la méta classe et

00:08:45.070 --> 00:08:49.020 align:middle
on initialise quelques
variables de classes ou variables

00:08:51.570 --> 00:08:52.730 align:middle
d'instances côté classes.

00:08:53.250 --> 00:08:55.050 align:middle
Là, il y a les 2 types de variables.

00:08:58.000 --> 00:09:01.400 align:middle
Dans les méthodes
initialize, côté classes il ne faut

00:09:01.600 --> 00:09:03.160 align:middle
jamais utiliser super initialize.

00:09:03.690 --> 00:09:06.520 align:middle
On vous a dit que côté
instances quand on ajoutait une

00:09:06.720 --> 00:09:10.620 align:middle
méthode initialize, on
appelait systématiquement super

00:09:10.820 --> 00:09:13.830 align:middle
initialize pour initialiser
toutes les variables d'instances

00:09:14.030 --> 00:09:14.900 align:middle
d'un nouvel objet qui est crée.

00:09:15.400 --> 00:09:17.860 align:middle
Pour les classes par
contre, comme les classes existent

00:09:18.240 --> 00:09:20.180 align:middle
dans le système et les
super classes existent déjà dans

00:09:20.380 --> 00:09:22.490 align:middle
le système au moment où
on envoie initialize, on

00:09:22.690 --> 00:09:24.950 align:middle
n'utilise pas super
initialize dans une méthode

00:09:25.150 --> 00:09:28.340 align:middle
initialize côté classes,
pour ne pas réinitialiser des

00:09:28.540 --> 00:09:29.330 align:middle
 classes qui auraient
été déjà initialisées.

00:09:29.530 --> 00:09:34.250 align:middle
Ce que vous devez retenir,
c'est que pour partager de l'état

00:09:34.450 --> 00:09:35.570 align:middle
on utilise les variables de classes.

00:09:37.310 --> 00:09:39.150 align:middle
Les classes sont des objets
comme les autres qui peuvent

00:09:39.350 --> 00:09:42.190 align:middle
avoir leurs propres
variables, et dans ces cas-là on

00:09:42.390 --> 00:09:43.700 align:middle
utilise des variables
d'instances côté classes.

00:09:45.330 --> 00:09:47.620 align:middle
Une classe est
initialisée en envoyant un message

00:09:47.820 --> 00:09:50.090 align:middle
initialize à la classe, et
en implémentant une méthode

00:09:50.290 --> 00:09:51.050 align:middle
initialize côté classes.

