1
00:00:00,410 --> 00:00:02,520
Bonjour. Dans ce cours on
va aborder un point qui n'est

2
00:00:02,720 --> 00:00:05,750
pas souvent abordé dans
les cours de Pharo qui sont:

3
00:00:05,950 --> 00:00:09,210
Comment est-ce qu'on définit
des objets de taille variable?

4
00:00:09,410 --> 00:00:13,800
Si on regarde, on voit qu'on utilise
déjà des objets de taille variable.

5
00:00:14,000 --> 00:00:18,060
Quand je veux créer un
tableau avec cette expression-là,

6
00:00:18,260 --> 00:00:20,350
je vais créer un
tableau ayant 10 éléments.

7
00:00:20,550 --> 00:00:22,530
Là, ils sont tous mis à 1
000, mais avec cette même

8
00:00:22,730 --> 00:00:26,800
expression-là, je vais
créer un tableau qui aura 5

9
00:00:28,120 --> 00:00:31,560
éléments. Donc on voit que
la classe "Tableaux" crée des

10
00:00:31,760 --> 00:00:33,600
instances qui sont
de taille variable.

11
00:00:34,110 --> 00:00:36,310
Et pour le moment, on ne vous a pas
expliqué comment vous pouviez faire.

12
00:00:36,510 --> 00:00:38,550
Si je vous donnais ça comme
exercice, vous ne sauriez pas le faire.

13
00:00:39,480 --> 00:00:41,870
Donc, ce qu'on va voir dans
ce cours, rapidement, c'est

14
00:00:42,070 --> 00:00:44,890
comment on définit des
 classes dont les instances ont des

15
00:00:45,090 --> 00:00:48,880
tailles variables, comment
on instancie de tels objets et

16
00:00:49,080 --> 00:00:51,780
comment on accède à
ces tailles variables.

17
00:00:52,940 --> 00:00:54,120
Commençons par le premier point.

18
00:00:55,600 --> 00:00:56,520
En fait c'est très simple.

19
00:00:57,600 --> 00:00:59,880
On va utiliser le message
"variableSubclass" au lieu du

20
00:01:00,080 --> 00:01:02,300
message "subclass" dans
la définition de classe.

21
00:01:02,600 --> 00:01:04,740
Là, j'ai copié la
définition de la classe "Tableaux".

22
00:01:05,220 --> 00:01:06,440
Vous voyez que
j'utilise "variableSubclass",

23
00:01:06,640 --> 00:01:11,580
"instanceVariableNames",
et caetera., pour créer ma

24
00:01:11,780 --> 00:01:14,770
 classe. Alors que
normalement, quand vous avez défini la

25
00:01:15,000 --> 00:01:19,880
 classe "Counter" ou la
 classe "D", de toute façon

26
00:01:20,080 --> 00:01:21,030
vous n'aviez utilisé que "subclass".

27
00:01:22,010 --> 00:01:24,890
Donc avec cette
définition-là, les instances que vous

28
00:01:25,090 --> 00:01:27,370
allez créer ont des
tailles variables.

29
00:01:27,570 --> 00:01:29,090
On va prendre un exemple
débile: imaginons qu'on veuille

30
00:01:29,290 --> 00:01:32,380
faire un point un peu
étrange avec 2 variables d'instance

31
00:01:33,090 --> 00:01:37,000
X et Y comme un point et une
variable, une zone variable,

32
00:01:37,200 --> 00:01:40,250
on mettrait cette
définition-là. Qu'est-ce que ça crée?

33
00:01:40,450 --> 00:01:41,930
Ça créerai des objets qui
ont cet aspect-là, en fait.

34
00:01:42,130 --> 00:01:45,650
Ce qui veut dire que
j'aurais une valeur pour X, une

35
00:01:45,850 --> 00:01:49,760
valeur pour Y, et une
zone variable par instance.

36
00:01:50,000 --> 00:01:53,630
Je pourrais avoir une autre
instance qui a aussi X, Y,

37
00:01:53,830 --> 00:01:58,460
avec 10 ici, puis 20 là,
et là 100 et là 200 par

38
00:01:58,660 --> 00:02:02,680
exemple, et là avec une
autre taille variable où je peux

39
00:02:02,880 --> 00:02:03,660
mettre différents objets.

40
00:02:04,840 --> 00:02:07,720
Donc ce qu'on voit, c'est
que les instances d'une classe

41
00:02:07,920 --> 00:02:09,470
qui permet d'avoir des
instances de taille variable ont

42
00:02:10,000 --> 00:02:12,900
une zone indexée, qui vient
s'ajouter après les variables

43
00:02:13,100 --> 00:02:15,420
d'instance qui sont
nommées, comme X Y.

44
00:02:15,770 --> 00:02:18,000
Et elle est implicite et il
n'y en a qu'une par classe

45
00:02:18,820 --> 00:02:20,540
pour des problèmes
d'implémentation, sinon on ne saurait

46
00:02:20,740 --> 00:02:23,820
pas comment ça grandit. Donc
voilà, vous avez vu comment

47
00:02:24,020 --> 00:02:27,890
on crée des classes dont les
instances ont une taille variable.

48
00:02:28,860 --> 00:02:30,880
Maintenant, comment on les
instancie, on l'a déjà vu tout

49
00:02:31,080 --> 00:02:32,900
au début du cours mais on
va regarder, et comment on

50
00:02:33,100 --> 00:02:34,190
accède à cette taille variable.

51
00:02:36,340 --> 00:02:40,190
En fait, on les instancie en
utilisant le message "New:".

52
00:02:41,070 --> 00:02:43,000
Ce qui est important
c'est le message "New:".

53
00:02:43,180 --> 00:02:46,310
On a vu ça dans le cours sur les
collections mais c'est bien de le rappeler.

54
00:02:46,720 --> 00:02:49,480
Là ça nous donne: "OK, je
veux créer un objet de taille

55
00:02:49,680 --> 00:02:52,680
variable et la taille
variable de cet objet est spécifiée

56
00:02:52,880 --> 00:02:54,390
par la valeur max
qui est donnée ici".

57
00:02:54,720 --> 00:02:58,060
Donc là, je crée un objet, un
tableau, qui aura 4 éléments.

58
00:03:02,000 --> 00:03:04,180
Comment je vais accéder
à cette taille variable?

59
00:03:04,820 --> 00:03:08,200
Je vais accéder avec les
messages "At" et "at put" que

60
00:03:08,400 --> 00:03:10,760
vous avez vus sur les
tableaux. Et ça, ça va marcher pour

61
00:03:10,960 --> 00:03:13,680
tous les objets qui
ont une taille variable.

62
00:03:14,320 --> 00:03:17,510
Donc là, si je mets "At 2",
ici je vais mettre "Lulu".

63
00:03:21,180 --> 00:03:23,870
Si je regarde et que
j'accède à la valeur 1, ça va me

64
00:03:24,070 --> 00:03:26,530
rendre 1 000, c'est normal.
Et si je regarde quelle est

65
00:03:26,730 --> 00:03:29,550
la valeur 2, ça me donnera "Lulu".

66
00:03:30,100 --> 00:03:34,900
Donc, en fait, il y a un
mapping entre les tableaux et

67
00:03:35,100 --> 00:03:38,060
les objets à taille
variable en utilisant "at put" et

68
00:03:38,260 --> 00:03:40,580
"New" parce que ce
protocole-là, d'API, va fonctionner

69
00:03:40,780 --> 00:03:44,610
pour les Array et pour tous
les objets dont on voudrait

70
00:03:44,810 --> 00:03:47,270
qu'ils aient une taille
variable, plus "Variable Size".

71
00:03:50,110 --> 00:03:52,430
Finalement, je ne vous ai
pas appris grand-chose dans ce

72
00:03:52,630 --> 00:03:54,280
cours, je vous ai juste
montré comment on définissait la

73
00:03:54,480 --> 00:03:56,350
 classe "Array" et comment
ça se généralise à d'autres

74
00:03:56,550 --> 00:03:58,160
objets, parce que vous
connaissiez déjà le protocole.

75
00:03:59,850 --> 00:04:01,860
Donc finalement, si on
regarde dans Pharo, on a des

76
00:04:02,060 --> 00:04:05,850
objets ou des classes qui ont ce
qu'on appelle des formes différentes.

77
00:04:06,070 --> 00:04:09,690
On va avoir des classes qui
n'ont que des variables d'instance

78
00:04:09,890 --> 00:04:14,070
nommées, comme le Counter
avec 40 ou la classe D avec le

79
00:04:14,270 --> 00:04:18,150
nombre de faces. Après, on
va avoir des classes qui ont

80
00:04:18,350 --> 00:04:22,740
seulement une zone variable ou
indexée, comme la classe "Array".

81
00:04:22,940 --> 00:04:26,090
Et puis après, on va voir les autres
qui peuvent être un mélange des deux.

82
00:04:27,000 --> 00:04:30,090
Donc là on a quelques
contraintes, on peut faire ça,mais

83
00:04:30,290 --> 00:04:31,280
c'est un petit peu plus subtil.

84
00:04:31,480 --> 00:04:34,550
Ça veut dire qu'on peut
maintenant décider quel est le

85
00:04:34,750 --> 00:04:36,650
type de classe variable.
Là, je ne veux aller dans les

86
00:04:36,850 --> 00:04:38,030
détails je veux juste
vous donner l'intention.

87
00:04:38,360 --> 00:04:41,750
Je peux dire que la classe,
la partie variable, va être

88
00:04:41,950 --> 00:04:46,610
juste des pointeurs sur
des objets, ou des bytes

89
00:04:46,860 --> 00:04:50,610
ou des words. On a besoin de ça
parce que parfois, pour s'interfacer

90
00:04:50,810 --> 00:04:52,810
avec le monde extérieur, on a
besoin de pouvoir spécifier.

91
00:04:53,010 --> 00:04:55,380
Moi, je veux une taille, et
je veux dans cette taille,

92
00:04:55,580 --> 00:04:58,640
mettre des pointeurs sur des
objets qui ont une certaine forme.

93
00:04:59,240 --> 00:05:02,870
Cette partie est vraiment avancée,
mais c'est juste pour vous montrer.

94
00:05:03,070 --> 00:05:06,360
Donc vous, souvent, vous allez
rester dans ce monde-là, avec subclass.

95
00:05:06,730 --> 00:05:09,170
De temps en temps, vous
allez utiliser variableSubclass.

96
00:05:10,700 --> 00:05:13,620
Et par exemple, Bitmap, qui est
l'objet qui représente l'écran,

97
00:05:14,820 --> 00:05:19,600
est vraiment un objet qui a
une zone variable qui sont

98
00:05:19,800 --> 00:05:23,220
des Word. C'était juste
pour vous dire que ça existe.

99
00:05:24,120 --> 00:05:27,260
Le système, comme je vous
l'ai dit, est un système

100
00:05:27,460 --> 00:05:29,700
réflexif, on peut lui
poser des questions.

101
00:05:29,920 --> 00:05:32,580
Vous pouvez donc très bien
demander, en utilisant ces

102
00:05:32,780 --> 00:05:36,010
méthodes-là, si c'est une
taille fixe, si c'est une

103
00:05:36,940 --> 00:05:39,160
taille variable, si ce
sont des pointeurs, si ce sont

104
00:05:39,360 --> 00:05:41,570
plutôt des bytes qui
sont stockés, et caetera.

105
00:05:41,770 --> 00:05:45,470
Donc on a toute l'API pour
pouvoir demander de quelle

106
00:05:45,670 --> 00:05:48,360
sorte sont les classes.
C'est comme ça qu'on a fait cette

107
00:05:48,560 --> 00:05:49,740
liste, en faisant des
queries dans le système.

108
00:05:51,240 --> 00:05:55,920
Maintenant, il y a une
contrainte: les classes définies

109
00:05:56,750 --> 00:06:00,580
en utilisant subclass peuvent avoir
n'importe quelle sorte de sous-classe.

110
00:06:00,780 --> 00:06:04,560
Ça veut dire que si j'ai
des points avec X Y, je vais

111
00:06:04,760 --> 00:06:08,140
pouvoir mettre une
sous-classe qui va être Z, ou une

112
00:06:08,340 --> 00:06:12,240
sous-classe qui va être X
Y plus une taille variable.

113
00:06:14,520 --> 00:06:19,400
Quand vous voulez faire une
sous-classe d'une classe qui

114
00:06:19,600 --> 00:06:23,690
est déjà une variable, vous
pouvez utiliser exclusivement

115
00:06:24,430 --> 00:06:26,470
des classes qui sont
variables, c'est comme ça.

116
00:06:26,910 --> 00:06:29,080
Le système qui construit les
 classes va vérifier et dire

117
00:06:29,280 --> 00:06:30,530
"Non, c'est incompatible,
je ne peux pas le faire".

118
00:06:30,730 --> 00:06:33,830
Pourquoi? Parce que lui a
besoin de savoir qu'il n'y a

119
00:06:34,030 --> 00:06:35,880
qu'une zone et
traiter les contraintes.

120
00:06:36,080 --> 00:06:37,600
Donc, de toute façon, le
système vous dira que ce n'est

121
00:06:37,800 --> 00:06:40,170
pas possible de le créer. C'était
juste pour vous dire que ça existe.

122
00:06:41,610 --> 00:06:43,940
Donc, ce que vous devez
savoir finalement maintenant, c'est

123
00:06:45,860 --> 00:06:49,610
comment on définit des
 classes dont les instances ont une

124
00:06:49,810 --> 00:06:54,230
taille variable, comment on
les instancie, avec New:, et

125
00:06:56,890 --> 00:06:59,780
comment on y accède avec
les protocoles qui sont les

126
00:07:00,000 --> 00:07:01,820
protocoles que vous
avez vus sur les tableaux.

