1
00:00:01,190 --> 00:00:03,000
Dans cette vidéo, nous
allons vous montrer comment on va

2
00:00:03,167 --> 00:00:05,220
créer un package, une
 classe, décrire des tests.

3
00:00:05,770 --> 00:00:09,100
La première chose à faire déjà, c'est
commencer à ouvrir le système Browser.

4
00:00:09,530 --> 00:00:11,710
Le système Browser, ça nous
permet de browser des packages.

5
00:00:11,877 --> 00:00:12,590
Là, il y a des packages.

6
00:00:14,260 --> 00:00:16,600
La première chose à faire,
c'est qu'on va créer un package.

7
00:00:16,830 --> 00:00:21,790
On va faire "Add
package" "MyCounter".

8
00:00:22,280 --> 00:00:23,640
Comme il y a beaucoup de
packages et qu'on ne veut pas

9
00:00:23,807 --> 00:00:27,050
les voir, c'est une bonne
chose de filtrer tout ça.

10
00:00:27,950 --> 00:00:30,000
On a notre package "MyCounter".

11
00:00:30,157 --> 00:00:32,740
Et là, on va définir une
 classe qu'on va appeler

12
00:00:32,907 --> 00:00:37,550
"Counter" et elle a une
variable d'instance count.

13
00:00:38,140 --> 00:00:42,290
Le petit icône orange nous
indique que le code n'est pas sauvé.

14
00:00:42,610 --> 00:00:45,690
Là, on va compiler le code
avec la fonction "Accept".

15
00:00:46,290 --> 00:00:49,570
Et là, j'ai la classe
"Counter" qui a été compilée.

16
00:00:49,830 --> 00:00:51,920
Le système regarde un petit
peu et nous dit qu'il y a des

17
00:00:53,200 --> 00:00:56,290
commentaires de qualité, on verra ça
plus tard pour le moment on s'en fiche.

18
00:01:00,790 --> 00:01:03,690
Il y a un point
d'exclamation rouge parce qu'on n'a pas

19
00:01:03,857 --> 00:01:05,280
écrit de commentaire.
Donc, on va écrire un premier

20
00:01:05,447 --> 00:01:12,330
commentaire :

21
00:01:12,497 --> 00:01:13,880
"I'ma simple counter".

22
00:01:45,790 --> 00:01:49,230
On va mettre un petit
exemple pour que lecteur comprenne

23
00:01:49,397 --> 00:01:53,050
comment ça va
fonctionner: Counter new,

24
00:01:55,750 --> 00:02:00,120
Counter increment, Counter

25
00:02:02,920 --> 00:02:07,500
count. Là, ça devrait être égal à 2.

26
00:02:09,880 --> 00:02:14,180
Encore une fois, le texte n'est
pas sauvé et on va le compiler.

27
00:02:14,347 --> 00:02:16,540
Il est sauvegardé. On
n'a plus de counter.

28
00:02:16,850 --> 00:02:20,050
Maintenant, on va
définir des accesseurs.

29
00:02:21,940 --> 00:02:24,770
Les accesseurs, on les met
généralement dans le protocole Accessing.

30
00:02:26,640 --> 00:02:31,540
On va faire "count rend count".

31
00:02:33,160 --> 00:02:35,720
Et de la même manière, on va faire

32
00:02:38,220 --> 00:02:40,740
aNumber, on va faire un Setter.

33
00:02:46,190 --> 00:02:48,380
Vous avez vu, j'ai
modifié la méthode count.

34
00:02:48,547 --> 00:02:50,770
Là, vous pouvez penser
qu'elle est perdue mais non parce

35
00:02:50,937 --> 00:02:54,120
qu'à chaque fois que je
change une méthode avec un nom

36
00:02:54,287 --> 00:02:55,320
différent, il en crée une nouvelle.

37
00:02:55,487 --> 00:02:58,530
Là, je compile une
nouvelle méthode, j'ai count.

38
00:03:01,160 --> 00:03:05,190
Maintenant, on peut vraiment tester
et faire notre premier petit programme.

39
00:03:07,360 --> 00:03:08,000
Là, je prends Playground.

40
00:03:09,910 --> 00:03:14,700
Je vais créer un counter.
On se met sur une autre

41
00:03:14,867 --> 00:03:19,730
ligne. Je vais lui mettre une valeur

42
00:03:21,000 --> 00:03:25,420
: C count 7. Si je demande
sa valeur, qu'est-ce que ça

43
00:03:25,587 --> 00:03:29,600
doit me rendre ? Ça va me rendre 7.

44
00:03:32,400 --> 00:03:34,390
Maintenant ce qu'on voudrait
faire, c'est vraiment écrire

45
00:03:34,557 --> 00:03:38,460
ça sous forme d'un test parce
que là, on ne peut pas l'exécuter

46
00:03:39,040 --> 00:03:40,350
et on aimerait
l'exécuter automatiquement.

47
00:03:40,630 --> 00:03:42,910
On va créer une classe de test.

48
00:03:43,077 --> 00:03:44,820
Comment on crée une
 classe de test dans Pharo?

49
00:03:45,000 --> 00:03:48,450
On change la super
 classe, on dit que ça hérite de

50
00:03:50,220 --> 00:03:55,000
TestCase et on va
définir une classe de

51
00:03:55,167 --> 00:03:56,140
test qu'on appelle CounterTest.

52
00:03:56,910 --> 00:03:59,860
Maintenant ce que je vais
faire je vais la compiler.

53
00:04:00,660 --> 00:04:03,700
J'ai une nouvelle classe
CounterTest dans mon système.

54
00:04:04,570 --> 00:04:08,410
Je vais définir une nouvelle
méthode, je vais ajouter un

55
00:04:08,577 --> 00:04:10,030
protocole qui s'appelle tests.

56
00:04:11,620 --> 00:04:14,300
Là, je vais pouvoir
définir une nouvelle méthode.

57
00:04:14,467 --> 00:04:17,940
Les méthodes de tests
doivent commencer par "test"

58
00:04:18,107 --> 00:04:21,690
toujours et être dans une
 classe qui hérite de TestCase.

59
00:04:22,380 --> 00:04:23,580
On va l'appeler
"testCounterisSetAndRead"

60
00:04:31,170 --> 00:04:35,590
par exemple. On l'a
pratiquement notre test, on a déjà

61
00:04:35,757 --> 00:04:36,540
presque tout écrit.

62
00:04:37,620 --> 00:04:40,330
On va l'indenter un
peu plus joliment.

63
00:04:40,497 --> 00:04:41,730
Je crée mon counter.

64
00:04:42,580 --> 00:04:45,680
Et maintenant, je
vais faire "self assert

65
00:04:49,750 --> 00:04:54,200
equals 7". Cette phrase-là est

66
00:04:54,367 --> 00:04:58,560
exactement équivalente à
"self assert C count égale 7".

67
00:05:01,870 --> 00:05:04,640
C'est que c'est plus
pratique, quand on fait une erreur

68
00:05:04,807 --> 00:05:08,470
le retour est beaucoup plus
intelligent quand on utilise la première forme.

69
00:05:08,637 --> 00:05:10,910
Là, on va compiler.

70
00:05:12,790 --> 00:05:17,690
Maintenant, je vais pouvoir
faire exécuter mon test, mon

71
00:05:19,790 --> 00:05:22,440
test est vert. Quand on a
un test et qu'il est vert,

72
00:05:22,607 --> 00:05:26,180
c'est un bon moment pour
sauver sa production, son code.

73
00:05:26,370 --> 00:05:27,930
Dans Pharo, vous allez
pouvoir sauver l'image.

74
00:05:28,097 --> 00:05:30,080
Là, c'est-ce que je fais, je
vais sauver l'image mais ce

75
00:05:30,247 --> 00:05:31,320
n'est pas satisfaisant l'image.

76
00:05:32,770 --> 00:05:35,040
Je voudrais vous montrer
comment vous allez sauver du

77
00:05:35,207 --> 00:05:36,820
code dans un système de version.

78
00:05:37,070 --> 00:05:39,960
Là, comme je ne sais pas
si vous allez avoir accès à

79
00:05:40,127 --> 00:05:44,610
Internet, je vais le
faire dans mon cache local.

80
00:05:44,777 --> 00:05:48,860
Vous voyez, j'ai ce
dossier-là qui pointe

81
00:05:49,027 --> 00:05:52,930
sur tous les
packages, sur lesquels je peux

82
00:05:54,000 --> 00:05:55,360
travailler, que j'ai chargés ou pas.

83
00:05:55,770 --> 00:05:58,490
Là, ce que nous montre
le système, c'est que j'ai

84
00:05:58,657 --> 00:06:02,870
plusieurs packages qui ont des
modifications qui n'ont pas été sauvegardées.

85
00:06:03,070 --> 00:06:05,060
On s'en fiche des 2
premières, mais nous, on voit que

86
00:06:05,227 --> 00:06:09,160
MyPackage a une étoile. Ça
veut dire que j'ai du code

87
00:06:09,327 --> 00:06:10,760
dans l'image qui n'a pas été sauvé.

88
00:06:12,130 --> 00:06:14,020
Là c'est ce que je vais
faire, je vais faire Save, je

89
00:06:14,187 --> 00:06:15,230
vais dire voila je
choisis le repository.

90
00:06:16,520 --> 00:06:17,320
Je vais faire save.

91
00:06:21,400 --> 00:06:26,180
Là, je vais marquer "first
version with accessors and a

92
00:06:27,210 --> 00:06:29,090
green test". Là,

93
00:06:32,640 --> 00:06:35,600
j'accepte. Là, il
m'a sauvé un package.

94
00:06:35,800 --> 00:06:36,530
On va aller vérifier.

95
00:06:36,697 --> 00:06:41,370
Je peux ouvrir ce dossier
et si je regarde, il contient

96
00:06:42,410 --> 00:06:44,460
plein de packages qui ont
été chargés par le système.

97
00:06:44,627 --> 00:06:48,470
Mais en particulier, si je
filtre là, je retrouve bien

98
00:06:48,637 --> 00:06:51,130
mon package avec ses versions.

99
00:06:57,620 --> 00:07:00,740
Je vous conseille à chaque
fois que vous avez ajouté une

100
00:07:00,907 --> 00:07:03,460
fonctionnalité, c'est ce qu'on va
faire systématiquement, de sauvegarder.

101
00:07:06,770 --> 00:07:09,900
Maintenant ce qu'on va
faire, on va d'abord définir un

102
00:07:10,067 --> 00:07:12,130
test avant de l'implémenter.

103
00:07:12,410 --> 00:07:14,590
On va écrire un test pour
qu'est-ce que c'est que l'incrément

104
00:07:14,757 --> 00:07:19,710
d'un

105
00:07:19,877 --> 00:07:21,200
counter. "TestIncrement"
qu'est-ce qu'on aimerait avoir?

106
00:07:21,367 --> 00:07:22,000
On aimerait lui dire "Je

107
00:07:26,330 --> 00:07:27,430
crée un counter,

108
00:07:33,510 --> 00:07:38,400
je vais lui mettre
une valeur par défaut,

109
00:07:38,840 --> 00:07:43,410
puis je vais
incrémenter 2 fois ce counter.

110
00:07:44,100 --> 00:07:45,310
" Qu'est-ce que je dois vérifier ?

111
00:07:45,477 --> 00:07:48,130
Je dois vérifier que
le counter en question

112
00:07:51,150 --> 00:07:51,870
a la bonne valeur.

113
00:07:57,900 --> 00:08:02,800
Je compile. Mon test

114
00:08:03,000 --> 00:08:06,880
est bien rouge puisque je
n'ai pas implémenté counter,

115
00:08:07,510 --> 00:08:10,390
les opérations dans compteur
incrémentent et décrémentent.

116
00:08:11,520 --> 00:08:12,450
Je vais ajouter
"operations increment".

117
00:08:21,660 --> 00:08:22,390
Qu'est-ce qu'on va faire ?

118
00:08:22,557 --> 00:08:26,890
On va faire "self
count 2: self count +

119
00:08:27,200 --> 00:08:30,270
1". Si on utilise
systématiquement les accesseurs en

120
00:08:30,437 --> 00:08:32,080
interne ou pas, ça dépend,
c'est une question de style.

121
00:08:34,510 --> 00:08:37,630
De la même manière vu que
c'est très proche, on va

122
00:08:39,710 --> 00:08:40,500
définir "decrement".

123
00:08:42,380 --> 00:08:44,470
Vous voyez que sur increment
il y a un test, donc je peux

124
00:08:44,637 --> 00:08:48,190
l'exécuter et mon test est vert.

125
00:08:48,357 --> 00:08:50,370
Donc, j'ai bien 2
tests qui fonctionnent.

126
00:08:50,710 --> 00:08:53,350
Si je vais dans la classe
test, tous mes tests sont verts.

127
00:08:53,670 --> 00:08:54,540
Qu'est-ce que je vais faire ?

128
00:08:54,707 --> 00:08:56,790
Je sauvegarde. Je vais
faire une nouvelle sauvegarde.

129
00:08:56,957 --> 00:09:00,340
Je vais dire "Adding
increment and decrement".

130
00:09:13,110 --> 00:09:17,850
Là maintenant si je
regarde, j'ai bien 2 versions

131
00:09:23,250 --> 00:09:23,883
de mes packages.

132
00:09:24,090 --> 00:09:29,020
On va écrire un test pour "decrement"

133
00:09:29,187 --> 00:09:30,100
parce qu'il n'y a pas de raison.

134
00:09:31,700 --> 00:09:36,590
"Decrement", par exemple je

135
00:09:36,757 --> 00:09:40,320
pourrais mettre une valeur
à 2 si j'en ai envie et je

136
00:09:40,487 --> 00:09:43,890
décrémente 2 fois. Je dois obtenir 0.

137
00:09:44,057 --> 00:09:48,550
Mon test est vert donc

138
00:09:49,570 --> 00:09:50,203
je vais sauver.

139
00:10:06,490 --> 00:10:10,490
Maintenant ce qu'on
aimerait avoir, c'est que si je

140
00:10:10,657 --> 00:10:14,300
regarde et que je fais
"Counter new" et que je fais

141
00:10:14,467 --> 00:10:16,910
"Print it", ça m'affiche un
counter et je ne sais pas sa

142
00:10:17,077 --> 00:10:19,000
valeur, donc ce n'est pas pratique.

143
00:10:19,360 --> 00:10:22,260
Ce qu'on aimerait c'est
modifier ce comportement.

144
00:10:24,130 --> 00:10:26,630
Pour cela ce qu'on va faire
on va ajouter une méthode qui

145
00:10:26,797 --> 00:10:29,840
s'appelle "PrintOn",
dans le protocole Printing.

146
00:10:31,340 --> 00:10:33,110
Print on, c'est une
méthode qui est appelée par le

147
00:10:33,277 --> 00:10:34,530
système à chaque fois
que l'on fait PrintStream.

148
00:10:35,760 --> 00:10:36,750
On a comme argument aStream.

149
00:10:38,690 --> 00:10:39,440
Qu'est-ce qu'on va faire ?

150
00:10:40,200 --> 00:10:43,170
On va dire qu'on
aimerait avoir un counter.

151
00:10:43,337 --> 00:10:47,460
Là typiquement, j'invoque
les fonctions du dessus.

152
00:10:51,740 --> 00:10:54,170
Maintenant ce que je
vais faire, j'aimerais

153
00:10:58,530 --> 00:10:59,850
ajouter un petit

154
00:11:04,470 --> 00:11:05,103
texte

155
00:11:17,370 --> 00:11:20,570
par exemple "with
value" et puis "self count".

156
00:11:24,150 --> 00:11:27,740
Je fais ça parce que le
counter c'est un nombre, donc je

157
00:11:27,907 --> 00:11:32,180
dois obtenir sa
représentation textuelle.

158
00:11:34,260 --> 00:11:35,290
Je vais faire "cr".

159
00:11:35,457 --> 00:11:36,260
Je compile.

160
00:11:42,900 --> 00:11:45,550
Le système me dit que je pourrais
faire mieux mais bon ce n'est pas grave.

161
00:11:46,040 --> 00:11:47,270
Pour le moment on s'en fiche.

162
00:11:48,590 --> 00:11:49,760
Je peux faire c'est "Counter new".

163
00:11:51,000 --> 00:11:54,740
Je regarde, il me dit que c'est
un counter avec comme valeur nil.

164
00:11:54,907 --> 00:11:58,020
C'est normal puisque je ne
l'ai pas encore initialisé.

165
00:12:01,260 --> 00:12:04,960
Maintenant, on va ajouter un
support à l'initialisation.

166
00:12:07,590 --> 00:12:09,780
On va commencer par écrire
un test et pour faire cela

167
00:12:14,050 --> 00:12:18,020
je vais dire, je veux que
les valeurs à la création

168
00:12:19,770 --> 00:12:23,180
soient 0.

169
00:12:24,950 --> 00:12:25,760
Qu'est-ce que je vais faire ?

170
00:12:25,927 --> 00:12:27,280
Je vais faire "self assert".

171
00:12:27,447 --> 00:12:30,840
Je vais m'assurer que "Counter new

172
00:12:33,030 --> 00:12:36,210
count = 0". Là,

173
00:12:38,020 --> 00:12:39,010
qu'est-ce qu'on voit ?

174
00:12:39,177 --> 00:12:41,090
Mon test est faux. Pourquoi ?

175
00:12:41,257 --> 00:12:45,140
Parce que si je fais
ça, j'obtiens nil.

176
00:12:47,140 --> 00:12:49,820
Vu que c'est une classe et
que je n'accède pas à des

177
00:12:50,000 --> 00:12:53,560
variables d'instance de la
 classe CounterTest, je peux

178
00:12:53,727 --> 00:12:57,110
sélectionner l'expression
et l'exécuter directement.

179
00:13:00,280 --> 00:13:03,170
Maintenant, une fois que
j'ai ce test qui ne passe pas,

180
00:13:03,680 --> 00:13:04,420
qu'est-ce que je vais faire ?

181
00:13:04,587 --> 00:13:09,110
Je vais ajouter une méthode
initialize dans le protocole initialisation.

182
00:13:16,900 --> 00:13:21,730
Et là qu'est-ce que je vais faire ?

183
00:13:22,160 --> 00:13:25,760
Je vais faire "super
initialize", au cas où, et je vais

184
00:13:25,927 --> 00:13:27,730
dire "count 2 points = 0".

185
00:13:27,897 --> 00:13:31,550
Cette méthode-là est invoquée à
chaque fois que j'ajoute la méthode "new".

186
00:13:32,330 --> 00:13:35,700
Maintenant je peux regarder
avec mes tests, c'est vert.

187
00:13:35,867 --> 00:13:40,070
De la même manière, si je
faisais "count", j'obtiens bien 0.

188
00:13:41,010 --> 00:13:45,320
Encore une fois, là on va
sauvegarder: ""added printOn"

189
00:13:45,487 --> 00:13:47,490
"added initialize + tests".

190
00:14:04,000 --> 00:14:06,270
Donc ce qu'on peut
maintenant qui est intéressant c'est

191
00:14:06,437 --> 00:14:09,300
que je peux voir tout mon historique.

192
00:14:09,467 --> 00:14:12,310
Je peux aussi voir et
naviguer dans cet historique.

193
00:14:12,520 --> 00:14:16,180
Si je clique sur "version" je peux
voir la différence entre 2 systèmes.

194
00:14:17,960 --> 00:14:20,440
Les changements entre la
version 3 et la version 4, c'est

195
00:14:20,607 --> 00:14:21,530
"initialize" "printOn" et le Test.

196
00:14:22,000 --> 00:14:24,660
Si je veux la
différence entre la version

197
00:14:28,490 --> 00:14:33,360
2 et la version 4, j'ai tous ces

198
00:14:33,527 --> 00:14:34,160
changements.

199
00:14:35,870 --> 00:14:38,220
Maintenant il me reste une
chose à faire, j'aimerais bien

200
00:14:38,387 --> 00:14:43,100
changer un petit peu la
manière dont les objets sont créés.

201
00:14:43,820 --> 00:14:47,210
Je vais commencer par créer
un test pour vous expliciter

202
00:14:47,377 --> 00:14:51,040
ce que j'ai envie
d'obtenir. Je vais définir un test

203
00:14:53,040 --> 00:14:56,000
que je vais appeler 
"AlternateClassCreation".

204
00:14:58,000 --> 00:14:59,500
Qu'est-ce qu'on a envie d'avoir ?

205
00:15:01,000 --> 00:15:03,000
On va dire, moi ce que je veux,
je veux garantir quoi...

206
00:15:05,000 --> 00:15:11,000
que Counter withValue: 19

207
00:15:11,500 --> 00:15:13,000
Si je fais increment dessus

208
00:15:15,000 --> 00:15:20,000
et que je demande sa valeur,
ça doit me rendre 20, 

209
00:15:21,000 --> 00:15:23,000
d'accord.

210
00:15:30,000 --> 00:15:34,000
On va mettre une parenthèse ici, 
c'est mieux,voilà.

211
00:15:38,000 --> 00:15:42,000
Donc, encore une fois, le 
test ne passe pas,

212
00:15:44,000 --> 00:15:48,000
et l'assistant me dit : "tu envoies 
un message qui n'est pas connu".

213
00:15:49,000 --> 00:15:52,000
Ce qu'il faut voir c'est que 
le message withValue 

214
00:15:52,200 --> 00:15:55,000
est envoyé non plus à un objet
mais à une classe.

215
00:15:55,500 --> 00:15:58,500
Donc ça veut dire que je vais 
devoir définir ce message là

216
00:15:58,600 --> 00:15:59,900
sur la classe.
Donc je sélectionne la classe.

217
00:16:00,000 --> 00:16:03,000
Maintenant je passe au niveau classe 
et je vais ajouter 

218
00:16:03,200 --> 00:16:10,000
un protocole qui s'appelle
instance creation 

219
00:16:12,500 --> 00:16:16,400
withValue: aNumber
Alors qu'est-ce que je dois faire ?

220
00:16:17,500 --> 00:16:18,400
La première des choses à faire 
ça va être,

221
00:16:19,000 --> 00:16:21,800
je vais créer un counter, une 
variable counter,

223
00:16:22,000 --> 00:16:24,500
counter, je le fais lentement hein, 

224
00:16:24,600 --> 00:16:26,000
self new 
Donc je crée un counter 

225
00:16:26,100 --> 00:16:29,900
et je vais faire 
self count: aNumber

226
00:16:30,000 --> 00:16:34,000
et je vais rendre ce counter.

227
00:16:34,100 --> 00:16:35,000
On peut le faire de manière plus 
compacte 

228
00:16:35,100 --> 00:16:38,000
mais pour le moment
faisons-le simplement.

229
00:16:38,100 --> 00:16:40,000
Donc je compile ma méthode.

230
00:16:40,100 --> 00:16:43,000
Et maintenant ça veut dire que 
je peux envoyer des messages.

231
00:16:43,500 --> 00:16:49,000
Et vous avez vu, quand je clique 
sur ce bouton, 

232
00:16:49,100 --> 00:16:52,000
je passe au niveau classe.
Donc je passe du niveau classe 

233
00:16:52,100 --> 00:16:53,000
au niveau instance.

234
00:16:53,100 --> 00:16:55,000
Donc là j'étais au niveau classe 
et là je reviens sur 

235
00:16:55,100 --> 00:16:57,500
les messages qui sont envoyés 
à des instances.

236
00:16:58,100 --> 00:17:01,200
Qu'est-ce que ça veut dire ?
ça veut dire que si je fais 

237
00:17:01,500 --> 00:17:08,900
Counter withValue: 18,
qu'est-ce que je vais obtenir ?

238
00:17:09,000 --> 00:17:11,000
Je vais obtenir une instance 
de la classe counter.

239
00:17:12,500 --> 00:17:15,000
J'obtiens bien un counter 
avec value 18.

240
00:17:15,100 --> 00:17:18,000
Et là je pourrais le faire
decrement.

241
00:17:21,100 --> 00:17:23,000
Et si je rafraichis, j'ai bien 17.

242
00:17:26,100 --> 00:17:28,900
Donc maintenant si je regarde 
mon test,

243
00:17:29,000 --> 00:17:32,000
tous mes tests passent, 
donc je vais encore une fois 

244
00:17:32,100 --> 00:17:35,000
sauvegarder et j'ai fini.

245
00:17:37,100 --> 00:17:44,000
Added instance creation 
API and tests. 

246
00:17:45,000 --> 00:17:48,000
Done for now.


