1
00:00:07,930 --> 00:00:10,760
Bonjour à tous. Dans cette
séquence, nous allons voir

2
00:00:10,960 --> 00:00:12,390
quelques points
avancés sur les classes.

3
00:00:13,950 --> 00:00:17,370
3 points, notamment
comment on va partager de l'état

4
00:00:17,690 --> 00:00:19,930
entre plusieurs instances d'une
même classe et de ses sous-classes.

5
00:00:20,130 --> 00:00:24,820
Deuxième point, on va
voir un point qui permet aux

6
00:00:25,020 --> 00:00:27,040
 classes d'avoir leur propre variable.

7
00:00:28,680 --> 00:00:30,670
Et enfin, on va voir
comment initialiser les classes.

8
00:00:33,100 --> 00:00:35,920
Premier point, partager de
l'état entre plusieurs instances.

9
00:00:38,640 --> 00:00:42,560
On a plusieurs instances
d'une même classe, et toutes ces

10
00:00:42,760 --> 00:00:47,040
instances veulent avoir un objet
commun pour partager de l'état.

11
00:00:47,670 --> 00:00:52,510
En Java, on utilise une
variable d'instance avec le

12
00:00:52,710 --> 00:00:57,500
mot-clé statique. La
valeur d'une variable

13
00:00:57,700 --> 00:01:00,690
statique est la même
pour toutes les instances.

14
00:01:01,710 --> 00:01:04,540
En Pharo, on utilise
les variables de classes.

15
00:01:06,310 --> 00:01:08,730
Vous avez pu voir cette
expression répétée encore et

16
00:01:08,930 --> 00:01:10,890
encore qui permet
de créer une classe.

17
00:01:11,470 --> 00:01:15,290
Là, on crée la classe color, on dit
que c'est une sous-classe d'objects.

18
00:01:15,800 --> 00:01:19,000
On liste ses variables
d'instances et cette ligne-là à

19
00:01:19,200 --> 00:01:21,040
laquelle on n'a pas trop
prêté attention jusqu'à

20
00:01:21,240 --> 00:01:25,360
maintenant liste les variables
de classes de la classe color.

21
00:01:26,860 --> 00:01:30,120
On voit que la classe
color a au moins 2 variables

22
00:01:30,320 --> 00:01:31,080
colorRegistry et componentMask.

23
00:01:32,800 --> 00:01:35,310
Les valeurs d'une variable
de classes sont partagées

24
00:01:35,510 --> 00:01:38,240
entre toutes les instances
d'une classe et toutes les

25
00:01:38,440 --> 00:01:41,820
instances des
sous-classes. Ces variables sont

26
00:01:42,020 --> 00:01:45,000
accessibles à la fois à des
méthodes côté instances et

27
00:01:45,200 --> 00:01:49,540
des méthodes côté classes et ces
variables prennent une majuscule.

28
00:01:50,820 --> 00:01:54,550
Si je reviens à l'exemple
de color, ici, j'ai ma classe

29
00:01:54,880 --> 00:01:58,070
color qui est une instance
de la classe Color class, donc

30
00:01:58,270 --> 00:01:59,400
Color class c'est la méta classe.

31
00:02:01,160 --> 00:02:04,690
On a la classe Color qui
définit 2 variables d'instances

32
00:02:04,890 --> 00:02:06,630
standards, rgb et alpha.

33
00:02:07,000 --> 00:02:09,140
Ces variables
d'instances sont privées

34
00:02:11,870 --> 00:02:14,250
dans le sens où elles sont
accessibles seulement depuis

35
00:02:14,840 --> 00:02:16,190
les méthodes de la classe Color.

36
00:02:18,420 --> 00:02:22,890
Et ColorRegistry, on voit
que c'est une variable qui a 1,

37
00:02:23,090 --> 00:02:25,550
une majuscule 2, qui est soulignée.

38
00:02:25,750 --> 00:02:30,350
Ça indique que cette
variable est une variable de

39
00:02:30,550 --> 00:02:34,000
 classes et qu'elle est
accessible non seulement depuis

40
00:02:34,200 --> 00:02:36,500
les méthodes de la classe
Color, mais aussi depuis les

41
00:02:36,700 --> 00:02:38,800
méthodes de la classe Color class.

42
00:02:40,240 --> 00:02:43,460
Là, on a des exemples
d'utilisation de cette variable-là.

43
00:02:44,170 --> 00:02:47,110
Dans une méthode
d'instances, dans la méthode private

44
00:02:47,310 --> 00:02:52,000
good de la classe color,
on accède à la variable de

45
00:02:52,200 --> 00:02:54,180
 classe avec son nom.

46
00:02:55,390 --> 00:02:58,420
De la même façon, pour
mettre une valeur dans cette

47
00:02:58,620 --> 00:03:03,150
variable, c'est juste 2
points égal comme avec n'importe

48
00:03:03,350 --> 00:03:05,540
quelle variable. Et on
peut faire ça soit du côté

49
00:03:05,740 --> 00:03:09,200
instances, soit du côté
 classes. Très fréquemment, les

50
00:03:09,400 --> 00:03:14,000
valeurs de ces variables
de classes seront lues à l'

51
00:03:14,200 --> 00:03:18,850
intérieur des méthodes
d'instances et seront écrites

52
00:03:19,310 --> 00:03:21,680
à l'intérieur des
méthodes de classes.

53
00:03:22,120 --> 00:03:23,840
C'est juste ce que l'on
retrouve le plus fréquemment,

54
00:03:24,040 --> 00:03:25,450
rien ne contraint à
cette utilisation.

55
00:03:28,200 --> 00:03:31,390
Maintenant, on va parler des
variables d'instances de classes.

56
00:03:33,540 --> 00:03:34,380
Ce n'est pas la même chose.

57
00:03:35,250 --> 00:03:38,140
Une classe, c'est un
objet comme les autres.

58
00:03:38,450 --> 00:03:41,330
Et comme tous les objets une
 classe peut avoir ses instances.

59
00:03:42,400 --> 00:03:44,800
Une classe étant décrite
par sa méta classe, c'est la

60
00:03:45,000 --> 00:03:47,450
méta classe qui va lister
les variables d'instances

61
00:03:47,650 --> 00:03:52,270
auxquelles son unique instance, qui
est donc la classe, va pouvoir accéder.

62
00:03:53,420 --> 00:03:57,760
Pour définir une variable
d'instances du côté classes,

63
00:03:58,480 --> 00:04:01,500
on appuie sur le bouton
 classes dans le navigateur de

64
00:04:01,700 --> 00:04:03,330
code, ce qui nous
donne cette expression-là.

65
00:04:03,530 --> 00:04:07,000
Là, je suis en train de
naviguer dans la classe

66
00:04:07,200 --> 00:04:10,000
RPackageSet et sa
méta classe définit une

67
00:04:12,010 --> 00:04:12,770
variable cashePackages.

68
00:04:13,000 --> 00:04:17,610
Ces variables ne
sont accessibles que des

69
00:04:17,810 --> 00:04:22,330
méthodes de classes et
les variables commencent

70
00:04:23,000 --> 00:04:24,890
toujours par une lettre minuscule.

71
00:04:25,770 --> 00:04:27,000
Là, vous avez un exemple.

72
00:04:27,960 --> 00:04:32,350
La variable cash packages est définie
dans la méta classe RPackageSet class.

73
00:04:35,330 --> 00:04:39,540
Ce qui signifie que la
 classe RPackageSet, qui est une

74
00:04:39,740 --> 00:04:44,670
instance de la méta classe,
a une valeur associée à cette

75
00:04:44,870 --> 00:04:49,700
variable. De la même façon, toutes

76
00:04:49,900 --> 00:04:54,320
les instances des
sous-classes de RPackageSet class ont

77
00:04:54,520 --> 00:04:58,550
une valeur dédiée pour cette
variable, une valeur différente.

78
00:04:58,750 --> 00:05:00,090
Là, il n'y a aucun partage.

79
00:05:00,460 --> 00:05:04,000
Chaque instance de la
 classe RPackageSet class ou d'une

80
00:05:04,200 --> 00:05:07,150
de ses sous-classes va avoir sa
propre valeur pour cette variable-là.

81
00:05:08,320 --> 00:05:12,000
On va bien distinguer les
variables de classes et les

82
00:05:12,200 --> 00:05:15,030
variables d'instances côté
 classes grâce à un exemple.

83
00:05:15,230 --> 00:05:18,380
Là, on va implémenter le
design pattern Singleton, dont

84
00:05:18,580 --> 00:05:23,230
le but c'est de garantir qu'on a une
et une seule instance d'une classe.

85
00:05:25,140 --> 00:05:27,720
Une solution pour
implémenter un Singleton, c'est de

86
00:05:27,920 --> 00:05:32,720
stocker dans une
variable l'instance à laquelle

87
00:05:32,920 --> 00:05:35,350
tout le monde va accéder et
de désactiver la construction

88
00:05:35,550 --> 00:05:37,820
de nouvelles instances.
C'est exactement ce qu'on va

89
00:05:38,020 --> 00:05:39,080
faire dans cet exemple de webServer.

90
00:05:39,280 --> 00:05:43,900
Là, j'utilise une
variable d'instance côté

91
00:05:44,100 --> 00:05:45,280
 classes, ce qu'on vient de voir.

92
00:05:46,780 --> 00:05:51,050
Nom minuscule, c'est dans la
définition de ma méta classe

93
00:05:51,250 --> 00:05:52,500
que je vais définir
cette variable-là.

94
00:05:52,700 --> 00:05:56,740
Là, je désactive
l'exécution de la méthode new,

95
00:05:57,890 --> 00:06:00,440
personne ne pourra envoyer
le message new à la classe web

96
00:06:00,640 --> 00:06:02,130
serveur pour créer une
nouvelle instance, il faudra

97
00:06:02,330 --> 00:06:06,290
absolument passer par
uniqueInstance, qui renvoie soit

98
00:06:07,340 --> 00:06:09,550
la valeur de la variable si
ce n'est pas vide, s'il y a

99
00:06:09,750 --> 00:06:12,370
déjà quelque chose dedans,
soit qui met quelque chose

100
00:06:12,570 --> 00:06:16,380
dans cette variable, qui
grâce à super new va créer une

101
00:06:16,580 --> 00:06:19,290
nouvelle instance de la
 classe web serveur et qui va

102
00:06:19,490 --> 00:06:21,880
mettre cette instance dans
la variable unique instance.

103
00:06:22,670 --> 00:06:27,350
Le fait d'avoir utilisé des
 classes instance variable va

104
00:06:27,550 --> 00:06:30,350
faire qu'on a la
conséquence suivante.

105
00:06:31,200 --> 00:06:35,470
Chaque sous-classe de la
 classe webServer va avoir sa

106
00:06:35,670 --> 00:06:38,340
propre valeur pour uniqueInstance.

107
00:06:38,540 --> 00:06:43,310
C'est-à-dire que si web
serveur a 3 sous-classes, il va

108
00:06:43,510 --> 00:06:47,140
y avoir en tout 4
valeurs pour la variable

109
00:06:47,340 --> 00:06:49,030
uniqueInstance, donc une
pour webServer et une pour

110
00:06:49,230 --> 00:06:50,000
chacune de ces sous-classes-là.

111
00:06:51,520 --> 00:06:54,440
Si maintenant, j'utilise
une variable de classes.

112
00:06:55,100 --> 00:06:59,050
Là, on édite la classe côté

113
00:06:59,480 --> 00:07:03,680
instances et on ajoute
UniqueInstance avec une majuscule.

114
00:07:06,960 --> 00:07:11,210
De la même façon, j'interdis
l'envoi du message new et j'implémente

115
00:07:11,410 --> 00:07:13,680
UniqueInstance, la seule
chose qui a changé c'est que j'ai

116
00:07:13,880 --> 00:07:16,110
mis un U majuscule
plutôt qu'un u minuscule.

117
00:07:18,070 --> 00:07:22,930
Conséquence de choisir une
variable de classe, on a un

118
00:07:23,130 --> 00:07:24,610
singleton pour
l'ensemble de la hiérarchie.

119
00:07:24,960 --> 00:07:29,470
Si le webServer a 3
sous-classes, les 3 sous-classes plus

120
00:07:29,670 --> 00:07:32,360
la classe webServer vont
partager le même singleton, donc

121
00:07:32,560 --> 00:07:36,920
on aura une instance qui
sera partagée par tout le monde.

122
00:07:37,120 --> 00:07:39,120
Maintenant, on va parler
d'initiation de classes parce qu'on

123
00:07:39,320 --> 00:07:41,170
peut avoir des variables
qui sont partagées entre

124
00:07:41,370 --> 00:07:43,200
plusieurs instances, on
peut avoir des variables de

125
00:07:43,400 --> 00:07:45,200
 classes, mais à un moment
il va bien falloir mettre une

126
00:07:45,400 --> 00:07:49,000
valeur dans ces
variables-là. En général, on fait ça au

127
00:07:49,200 --> 00:07:50,000
moment de
l'initialisation de la classe.

128
00:07:51,110 --> 00:07:55,040
Les objets sont initialisés lorsque
est envoyé le message initialize dessus.

129
00:07:55,380 --> 00:07:57,760
Les classes, c'est pareil,
on peut envoyer le message

130
00:07:57,960 --> 00:08:00,110
initialize à une classe
et c'est dans le code de la

131
00:08:00,310 --> 00:08:03,950
méthode initialize qu'on va décider
comment les variables sont initialisées.

132
00:08:06,000 --> 00:08:09,800
Si je veux initialiser la
 classe couleurs, j'envoie le

133
00:08:10,000 --> 00:08:11,800
message initialize à la classe Color.

134
00:08:12,730 --> 00:08:16,130
En général, lorsque une
 classe est chargée dans le

135
00:08:16,330 --> 00:08:19,820
système, grâce au
gestionnaire de versions, le message

136
00:08:20,020 --> 00:08:23,660
initialize est automatiquement
envoyé à toutes les classes au bon moment.

137
00:08:23,860 --> 00:08:25,460
Donc, il n'y a pas besoin
de se préoccuper d'envoyer le

138
00:08:25,660 --> 00:08:28,940
message initialize manuellement à
toutes les classes qu'on recherche.

139
00:08:29,140 --> 00:08:31,670
Par contre, si on
implémente une classe, le développeur

140
00:08:31,870 --> 00:08:34,580
qui crée une nouvelle classe
avec une méthode initialize,

141
00:08:34,780 --> 00:08:37,000
va devoir envoyer ses
messages initialize lui-même.

142
00:08:38,630 --> 00:08:40,590
Là, on a un exemple
dans la classe Color.

143
00:08:41,680 --> 00:08:44,870
On voit qu'ici on est bien
du côté de la méta classe et

144
00:08:45,070 --> 00:08:49,020
on initialise quelques
variables de classes ou variables

145
00:08:51,570 --> 00:08:52,730
d'instances côté classes.

146
00:08:53,250 --> 00:08:55,050
Là, il y a les 2 types de variables.

147
00:08:58,000 --> 00:09:01,400
Dans les méthodes
initialize, côté classes il ne faut

148
00:09:01,600 --> 00:09:03,160
jamais utiliser super initialize.

149
00:09:03,690 --> 00:09:06,520
On vous a dit que côté
instances quand on ajoutait une

150
00:09:06,720 --> 00:09:10,620
méthode initialize, on
appelait systématiquement super

151
00:09:10,820 --> 00:09:13,830
initialize pour initialiser
toutes les variables d'instances

152
00:09:14,030 --> 00:09:14,900
d'un nouvel objet qui est crée.

153
00:09:15,400 --> 00:09:17,860
Pour les classes par
contre, comme les classes existent

154
00:09:18,240 --> 00:09:20,180
dans le système et les
super classes existent déjà dans

155
00:09:20,380 --> 00:09:22,490
le système au moment où
on envoie initialize, on

156
00:09:22,690 --> 00:09:24,950
n'utilise pas super
initialize dans une méthode

157
00:09:25,150 --> 00:09:28,340
initialize côté classes,
pour ne pas réinitialiser des

158
00:09:28,540 --> 00:09:29,330
 classes qui auraient
été déjà initialisées.

159
00:09:29,530 --> 00:09:34,250
Ce que vous devez retenir,
c'est que pour partager de l'état

160
00:09:34,450 --> 00:09:35,570
on utilise les variables de classes.

161
00:09:37,310 --> 00:09:39,150
Les classes sont des objets
comme les autres qui peuvent

162
00:09:39,350 --> 00:09:42,190
avoir leurs propres
variables, et dans ces cas-là on

163
00:09:42,390 --> 00:09:43,700
utilise des variables
d'instances côté classes.

164
00:09:45,330 --> 00:09:47,620
Une classe est
initialisée en envoyant un message

165
00:09:47,820 --> 00:09:50,090
initialize à la classe, et
en implémentant une méthode

166
00:09:50,290 --> 00:09:51,050
initialize côté classes.

