﻿1
00:00:01,910 --> 00:00:04,410
Este video es un Redo para el MOOC.

2
00:00:04,577 --> 00:00:07,030
Re-do en el sentido que
le pedimos de rehacer, de

3
00:00:07,520 --> 00:00:09,540
seguir el video y
paso a paso repetirlo.

4
00:00:10,060 --> 00:00:13,470
También es una invitación a
mirar cómo programamos.

5
00:00:13,720 --> 00:00:17,680
No vamos a seguir un guión preciso,

6
00:00:17,847 --> 00:00:20,060
Intentaré hacerlo,
pero si encuentro errores o

7
00:00:20,227 --> 00:00:23,090
cosas así, voy a
manejarlos a medida que avance.

8
00:00:24,870 --> 00:00:29,130
En este video, la idea
es programar un pequeño

9
00:00:29,297 --> 00:00:32,040
lenguaje que puede encontrar
en juegos de rol como

10
00:00:32,207 --> 00:00:35,930
"Calabozos y Dragones",
por ejemplo,

11
00:00:36,097 --> 00:00:38,800
esta 
expresión

12
00:00:38,967 --> 00:00:40,010
¿Qué significa esta expresión?

13
00:00:40,420 --> 00:00:45,380
Significa que debe lanzar 2
dados de 20 lados y 1 dado de 4 lados.

14
00:00:45,547 --> 00:00:47,420
Verá que como és una
expresión en Pharo.

15
00:00:48,000 --> 00:00:52,490
Entonces en este video vamos a

16
00:00:52,657 --> 00:00:55,170
implementar una clase que representa
un dado y una clase

17
00:00:55,337 --> 00:00:57,420
que representa una mano.

18
00:00:58,660 --> 00:00:59,770
Empezaremos.

19
00:01:00,870 --> 00:01:04,290
Comenzamos definiendo un paquete.

20
00:01:05,710 --> 00:01:06,790
A este paquete lo llamamos "Dice" (dado).

21
00:01:06,957 --> 00:01:11,860
No tengo ganas de ver

22
00:01:12,027 --> 00:01:16,660
mas cosas. Entonces este

23
00:01:16,827 --> 00:01:19,450
video no lo codificaré en el

24
00:01:19,617 --> 00:01:22,210
depurador, como ha visto en otro
video, lo haré

25
00:01:22,377 --> 00:01:24,410
caso a caso
de manera oportunista.

26
00:01:25,490 --> 00:01:30,030
Aquí defino la clase "Die",
que tiene

27
00:01:30,197 --> 00:01:31,370
una cierta cantidad de "faces" (caras).

28
00:01:32,100 --> 00:01:35,630
Compilo y agrego un comentario de clase.

29
00:01:43,380 --> 00:01:45,890
Por el momento, poca cosa,
porque es muy muy simple.

30
00:01:47,550 --> 00:01:52,360
Empezaremos de manera que podamos

31
00:01:52,527 --> 00:01:53,950
inicializar nuestro objeto

32
00:02:00,450 --> 00:02:02,260
Lo haré así.

33
00:02:10,190 --> 00:02:13,560
Llamo la inicialización de
la superclase, y

34
00:02:13,727 --> 00:02:18,140
por defecto asigno 6 caras
a mi dado, porque es

35
00:02:18,307 --> 00:02:19,140
el dado más común.

36
00:02:19,820 --> 00:02:22,530
Ahora estoy empezando a
desarrollar una

37
00:02:22,697 --> 00:02:25,640
clase de test, para asegurarnos de que
lo que hagamos

38
00:02:25,807 --> 00:02:26,900
no rompe lo que ya ha
esta hecho.

39
00:02:27,260 --> 00:02:30,450
Las clases de prueba son subclases del
clase TestCase

40
00:02:30,617 --> 00:02:34,100
Lo llamamos "DieTest".

41
00:02:34,370 --> 00:02:37,510
Tengo mi clase de test (prueba).

42
00:02:37,790 --> 00:02:40,220
Una de las primeras pruebas que haremos,


43
00:02:40,387 --> 00:02:42,480
no siempre tenemos que hacerlo
así, pero

44
00:02:42,647 --> 00:02:46,650
en este caso me gustaría comenzar con
una prueba que funcione.

45
00:02:47,840 --> 00:02:52,120
Como aquí, no tenemos mucha cosa,
dire que la inicialización está ok.

46
00:02:53,820 --> 00:02:56,160
Esta es también 
una manera de mostrarte

47
00:02:56,327 --> 00:02:59,770
cómo probar que puedes
capturar excepciones

48
00:02:59,937 --> 00:03:01,440
o que las excepciones no deben
ocurrir.

49
00:03:02,180 --> 00:03:04,590
Aquí estoy diciendo:

50
00:03:04,757 --> 00:03:06,460
Die new should not raise error.

51
00:03:18,120 --> 00:03:19,170
Qué significa eso?

52
00:03:19,337 --> 00:03:23,290
Significa que cuando ejecuto este
trozo de código "Die

53
00:03:23,457 --> 00:03:25,600
new" (dado nuevo), no debe 
producirse ningún error.

54
00:03:28,170 --> 00:03:32,560
Voy a clasificar mi test
y ejecutarlo.

55
00:03:32,727 --> 00:03:35,550
Verde. Todo bien.

56
00:03:36,000 --> 00:03:40,020
Ahora, me gustaría definir el

57
00:03:40,187 --> 00:03:44,540
método que imita una tirada del dado.

58
00:03:44,707 --> 00:03:48,610
Me parece que en Pharo debe
haber un método

59
00:03:48,777 --> 00:03:49,720
llamado "atRandom" (al azar).

60
00:03:49,887 --> 00:03:53,940
atRandom, ¿qué hace?

61
00:03:54,480 --> 00:03:57,780
Me permite tener ... Ok ...

62
00:03:58,310 --> 00:04:00,770
Entonces ahora voy a mirar
la implementación para asegurarme

63
00:04:00,937 --> 00:04:03,620
que es correcto. AtRandom, ¿qué hace?

64
00:04:04,870 --> 00:04:09,070
Devuelve un número entero al azar
De 1 a sí mismo, perfecto.

65
00:04:10,910 --> 00:04:13,910
Entonces voy a definir un nuevo

66
00:04:15,290 --> 00:04:19,220
método en Operations (operaciones).

67
00:04:21,160 --> 00:04:22,230
Que va a hacer

68
00:04:22,397 --> 00:04:26,640
Roll (rueda). Le diré
me devuelves "faces

69
00:04:27,570 --> 00:04:28,203
atRandom" (caras al azar).

70
00:04:35,750 --> 00:04:37,400
Entonces escribo un test para esto.

71
00:04:40,490 --> 00:04:43,590
TestRolling ¿Que hacemos ahora?

72
00:04:44,120 --> 00:04:49,040
Creamos un dado.
d := Die

73
00:04:49,207 --> 00:04:49,840
new

74
00:04:51,210 --> 00:04:53,140
Y ahora escribo
"1000 timesRepeat".

75
00:04:54,420 --> 00:04:58,240
¿Qué? "d roll".

76
00:05:03,620 --> 00:05:07,580
Y quiero que sea
entre 1 y 6

77
00:05:07,747 --> 00:05:12,640
"Between: and:", esta

78
00:05:12,807 --> 00:05:15,560
bien. (Entre 1 y 6).

79
00:05:15,820 --> 00:05:18,510
No es muy bueno
porque aquí creamos

80
00:05:18,677 --> 00:05:22,470
una prueba solo para dados de 6 lados,
podríamos haber hecho que

81
00:05:22,637 --> 00:05:25,310
funcione según el
número de lados del dado

82
00:05:25,640 --> 00:05:26,580
Lo haremos más tarde.

83
00:05:26,830 --> 00:05:27,463
Entonces compilo

84
00:05:32,840 --> 00:05:35,620
Me sale un error Aquí está ...

85
00:05:37,910 --> 00:05:39,170
Está bien, tengo mi test.

86
00:05:39,337 --> 00:05:41,460
Ahora es el momento de guardar.
Aquí tengo mi

87
00:05:41,627 --> 00:05:44,590
paquete "Dice", lo
guardo localmente, "Save".

88
00:05:44,757 --> 00:05:49,000
Había creado unos cuantos antes
para entrenar, así que

89
00:05:49,167 --> 00:05:51,710
volveré a crear uno
"New version with

90
00:05:56,530 --> 00:06:00,780
rolling and test". Muy bien.

91
00:06:01,030 --> 00:06:02,370
Ok, se guarda.

92
00:06:11,480 --> 00:06:14,610
Ahora me gustaría cambiar

93
00:06:14,777 --> 00:06:18,890
la interfaz de creación
Primero re-categorizamos

94
00:06:19,810 --> 00:06:22,200
Si queremos cambiar
un poco la interfaz de creación

95
00:06:22,367 --> 00:06:26,390
Nos gustaría decir:
"to create a die

96
00:06:26,557 --> 00:06:28,090
use die faces".

97
00:06:39,290 --> 00:06:42,610
En esta expresión debe ver que

98
00:06:42,777 --> 00:06:46,030
faces és un mensaje enviado a
la clase Die y no

99
00:06:46,197 --> 00:06:48,610
a una instancia de la clase Die,
como en el

100
00:06:49,090 --> 00:06:51,880
método roll o otros métodos
codificados con anterioridad.

101
00:06:52,047 --> 00:06:55,040
Haré esto para que entienda
cuando

102
00:06:55,207 --> 00:06:58,900
tiene ir o no al nivel
class.

103
00:06:59,350 --> 00:07:00,710
Empezaremos escribiendo un test.

104
00:07:03,050 --> 00:07:06,420
Así "betterInterface".

105
00:07:08,790 --> 00:07:10,200
Si continúo con la misma lógica,

106
00:07:12,230 --> 00:07:18,080
"TestbetterCreationInterface",

107
00:07:18,247 --> 00:07:20,950
Me gustaría hacer algo como
esto,

108
00:07:22,680 --> 00:07:23,640
y que esto, sea faces (caras).

109
00:07:30,620 --> 00:07:32,420
Lo haré lentamente.

110
00:07:32,950 --> 00:07:36,840
Vengo aquí y escribo
"instance creation" faces: anInteger.

111
00:07:46,560 --> 00:07:49,000
Podría escribirlo de una manera compacta
pero aquí

112
00:07:49,167 --> 00:07:50,530
lo haré de manera tranquila.

113
00:07:51,000 --> 00:07:52,940
Así creo un dado.

114
00:07:53,890 --> 00:07:57,740
Escribo "self new",
self es la clase Die en sí.

115
00:07:58,220 --> 00:08:00,410
Le pido:
crea una instancia.

116
00:08:00,577 --> 00:08:03,620
Y ahora a esta nueva instancia le
proporciono

117
00:08:03,787 --> 00:08:08,410
un acceso para facilitar el valor
pasado como argumento

118
00:08:08,577 --> 00:08:12,130
Obviamente, devuelvo el dado
que acaba de ser creado.

119
00:08:13,860 --> 00:08:16,920
Cuando ejecute el código,
no funcionará porque

120
00:08:17,087 --> 00:08:19,950
faces no existe, 
no se preocupe.

121
00:08:20,117 --> 00:08:22,760
Vemos que mi test no pasa,
en todo caso

122
00:08:22,927 --> 00:08:27,720
es normal si yo
ejecuto esto,

123
00:08:27,887 --> 00:08:29,520
por ejemplo, si hago 
debug (depuración) para ver ...

124
00:08:33,640 --> 00:08:38,360
Y hago clic en Over, aquí
dice "no conozco

125
00:08:38,527 --> 00:08:41,430
el mensaje faces".

126
00:08:41,910 --> 00:08:45,770
Aquí lo haremos con calma, no lo haré
en el débugger (depurador).

127
00:08:46,830 --> 00:08:49,600
Yo digo: es verdad, tengo que
agregar un descriptor de acceso

128
00:08:52,910 --> 00:08:57,390
Entonces escribo
"faces: anInteger"

129
00:08:57,557 --> 00:09:01,520
Y allí escribo: "faces: anInteger"

130
00:09:05,020 --> 00:09:08,110
Y mientras estoy en ello, creo
el acceso de lectura.

131
00:09:09,330 --> 00:09:11,500
Devuelvo esta.

132
00:09:13,250 --> 00:09:14,450
Y aquí mi test es verde.

133
00:09:15,240 --> 00:09:19,180
Entonces guardamos, "save"

134
00:09:19,347 --> 00:09:22,250
mejor die creación
método con test.

135
00:09:22,417 --> 00:09:23,050
Todo bien.

136
00:09:31,610 --> 00:09:33,670
Ahora podemos comenzar a

137
00:09:33,837 --> 00:09:37,650
definir lo que queremos para

138
00:09:38,690 --> 00:09:42,050
diceHandle. Básicamente si
miramos, diceHandle,

139
00:09:42,217 --> 00:09:44,000
¿Cómo nos gustaría escribirlo?

140
00:09:44,167 --> 00:09:45,450
Nos gustaría escribir
"diceHandle new addDie"

141
00:09:49,300 --> 00:09:53,290
Aquí crearemos un nuevo
dado, "Die faces: 6, addDie".

142
00:09:55,210 --> 00:09:59,680
"die faces: 10".

143
00:10:07,260 --> 00:10:12,040
Comenzamos escribiendo

144
00:10:12,207 --> 00:10:13,580
una clase de test, esta vez.

145
00:10:15,250 --> 00:10:19,930
Entonces, una nueva clase que
hereda de TestCase.

146
00:10:20,290 --> 00:10:22,330
Todo bien. Tengo mi nueva
clase de test

147
00:10:24,000 --> 00:10:26,730
Y defino un test.

148
00:10:30,220 --> 00:10:32,850
La idea es crear una
mano y luego

149
00:10:33,017 --> 00:10:35,140
verificar que tengo los.
dados buenos dentro.

150
00:10:35,307 --> 00:10:39,380
Escribo "testAdding",
quiero reutilizar mi

151
00:10:39,547 --> 00:10:43,730
código, no hay otro motivo.

152
00:10:45,530 --> 00:10:48,060
Entonces tengo mi

153
00:10:54,310 --> 00:10:58,940
handle, yourself porque
quiero

154
00:10:59,107 --> 00:11:01,960
obtener el receptor del mensaje,
es decir la mano

155
00:11:02,127 --> 00:11:03,690
y no el argumento que está aquí.

156
00:11:04,500 --> 00:11:08,260
Ahora, ¿qué debo hacer?

157
00:11:08,427 --> 00:11:12,520
Escribo "self
 assert: h diceNumber

158
00:11:13,960 --> 00:11:14,593
 equals: 2".

159
00:11:20,700 --> 00:11:23,380
Compilo. Obviamente el sistema
me dice: "No

160
00:11:23,547 --> 00:11:25,930
conozco la variable DiceHandle, quieres

161
00:11:26,097 --> 00:11:26,730
que sea una clase"

162
00:11:26,897 --> 00:11:27,960
Sí. Debe ser una clase.

163
00:11:28,560 --> 00:11:29,750
Aquí la definirá.

164
00:11:29,917 --> 00:11:31,340
Como se que de todos modos
tengo que parar mis dados,

165
00:11:31,507 --> 00:11:36,440
aprovechare para

166
00:11:36,870 --> 00:11:39,580
poner una variable de instancia

167
00:11:39,747 --> 00:11:40,860
Compilo todo esto

168
00:11:41,790 --> 00:11:45,720
Ahora es rojo porque "AddDie:"
no se ha definido nunca.

169
00:11:47,620 --> 00:11:48,570
Entonces lo haremos.

170
00:11:48,737 --> 00:11:51,620
Antes de hacer esto, estaría bien
de inicializar la mano,

171
00:11:54,240 --> 00:11:56,660
lo hacemos así,
nos evitará

172
00:11:56,827 --> 00:11:57,890
tener un error más tarde

173
00:12:02,890 --> 00:12:04,560
"dice : = OrdereCollection new"

174
00:12:04,727 --> 00:12:05,360
Re-categorizar.

175
00:12:21,880 --> 00:12:24,760
Y ahora, debo ser capaz de
ejecutar mi

176
00:12:24,927 --> 00:12:27,730
test, que se bloqueará.
Ok muy bien.

177
00:12:27,897 --> 00:12:30,200
Crearé AddDie:

178
00:12:30,530 --> 00:12:31,163
Agregando

179
00:12:35,330 --> 00:12:38,030
Aquí, me dice: "Debes implementar
este método."

180
00:12:38,197 --> 00:12:39,080
Sí, tiene sentido.

181
00:12:39,247 --> 00:12:42,430
Escribo "Dice add: aDie".

182
00:12:43,590 --> 00:12:45,920
Ok muy bien.
Mi prueba continua sin funcionar

183
00:12:46,087 --> 00:12:48,150
porque aun no he definido
el método

184
00:12:48,317 --> 00:12:52,120
diceNumber.
Sí, diceNumber,

185
00:12:52,287 --> 00:12:56,780
lo crearemos, en
accessing esta vez

186
00:12:57,350 --> 00:12:58,800
Y diceNumber,
¿que va a hacer?

187
00:12:58,967 --> 00:13:00,330
Debe devolver

188
00:13:06,290 --> 00:13:08,110
dice size. Compilo de nuevo
proceed.

189
00:13:09,940 --> 00:13:12,510
Y mi prueba debe ser verde
Entonces, la prueba

190
00:13:12,677 --> 00:13:14,860
es verde y guardo.

191
00:13:17,250 --> 00:13:18,580
"With addDie and test".

192
00:13:24,560 --> 00:13:28,090
Podríamos mejorar el test porque
aquí

193
00:13:28,257 --> 00:13:31,900
comprueba que agregamos 2 números,
me gustaría

194
00:13:32,067 --> 00:13:35,180
verificar que cuando

195
00:13:35,347 --> 00:13:37,610
agregamos dos veces el mismo dado
no lo perdamos.

196
00:13:38,280 --> 00:13:39,340
Escribo
"TestAddingTwiceTheSameDieIsOK".

197
00:13:49,040 --> 00:13:50,290
Aquí que haré

198
00:13:50,457 --> 00:13:54,530
Agrego 6 y 6 y debo
obtener 2

199
00:13:57,030 --> 00:13:59,940
Hago esto, corro mi prueba,
es verde, súper

200
00:14:01,230 --> 00:14:04,700
Ahora, seria bonito poder

201
00:14:05,880 --> 00:14:08,960
definir como

202
00:14:11,240 --> 00:14:14,900
agregar 2 dados. Pero antes,
hagamos algo.

203
00:14:15,067 --> 00:14:17,210
Si miras, lo que no me gusta,

204
00:14:17,377 --> 00:14:19,030
es que cuando inspecciono esto,
por ejemplo,

205
00:14:23,950 --> 00:14:28,740
si hago "Inspect"
aquí, no veo

206
00:14:28,907 --> 00:14:31,530
los valores de los dados y no es
práctico para depurar.

207
00:14:31,697 --> 00:14:33,030
En el depurador, no vemos esto.

208
00:14:33,370 --> 00:14:36,090
Entonces, antes de continuar, quiero
mejorar

209
00:14:36,257 --> 00:14:38,370
esto. Voy a agregar
un método

210
00:14:38,660 --> 00:14:41,710
en el protocolo printing.
El método "PrintOn"

211
00:14:44,220 --> 00:14:46,840
esta definida en todos los objetos del
sistema y

212
00:14:47,007 --> 00:14:50,380
convertirá un objeto en una

213
00:14:50,547 --> 00:14:53,490
representación textual y

214
00:14:55,380 --> 00:14:58,780
pasa un stream al que incorporaremos

215
00:14:58,947 --> 00:15:00,420
la representación que queramos dentro.

216
00:15:01,890 --> 00:15:03,500
Si hago esto, no he hecho nada.

217
00:15:03,667 --> 00:15:07,630
Si hago super PrintOn,
de hecho tengo, no he hecho nada.

218
00:15:07,797 --> 00:15:09,230
Ahora voy a hacer

219
00:15:09,397 --> 00:15:13,220
"aStream NextPutAll:", entonces pondré
caracteres en el

220
00:15:13,387 --> 00:15:15,220
stream, pero ¿qué voy a
poner primero?

221
00:15:16,090 --> 00:15:18,330
Escribiré un paréntesis con un
espacio tal vez

222
00:15:18,497 --> 00:15:19,880
sea mas bonito, un paréntesis.

223
00:15:20,450 --> 00:15:23,550
Entonces consideraré caras (faces)
y las convertiré

224
00:15:23,717 --> 00:15:27,780
en números, en cadenas y
concatenare todo esto

225
00:15:28,360 --> 00:15:30,760
con un paréntesis de cierre.

226
00:15:31,150 --> 00:15:34,930
Si hago esto ... cerré el depurador,
entonces lo abro de nuevo.

227
00:15:35,850 --> 00:15:38,630
Tengo el depurador. Ahora
Tengo un dado de 6 caras

228
00:15:38,797 --> 00:15:40,480
y un dado de 10 caras. Así es
mucho

229
00:15:40,647 --> 00:15:44,140
más bonito, verá, si
encuentro errores, nos ayudará.

230
00:15:44,850 --> 00:15:48,140
Aqui, no hice nada especial,
mis test funcionan.

231
00:15:49,450 --> 00:15:53,340
Guardo de nuevo, no cuesta
nada, "With printing".

232
00:15:55,220 --> 00:15:56,400
Escribimos "with die printOn".

233
00:16:03,030 --> 00:16:08,000
Muy bien. Ahora creamos
el test,

234
00:16:08,167 --> 00:16:09,580
no lo haremos,
iremos directamente allí

235
00:16:10,080 --> 00:16:12,490
Haremos "add
en el protocolo roll operations".

236
00:16:13,600 --> 00:16:17,890
Aqui,

237
00:16:18,057 --> 00:16:22,530
hay varias formas de definir
esto.

238
00:16:22,820 --> 00:16:25,040
Le propongo una, no es
la mas bonita pero

239
00:16:25,207 --> 00:16:27,160
al menos es la que probablemente
sea mas clara para usted.

240
00:16:27,530 --> 00:16:29,130
Hay maneras muy compactas, lo

241
00:16:29,297 --> 00:16:31,490
podría escribir en una linea, pero
utilizando iteradores

242
00:16:31,657 --> 00:16:33,150
como "Injected to", aquí, estoy
realizaré un bucle

243
00:16:33,550 --> 00:16:34,210
¿Entonces qué hago?

244
00:16:34,377 --> 00:16:36,860
Tomo un valor que
inicializo a cero.

245
00:16:37,390 --> 00:16:42,320
Luego hago un bucle en todos los dados,
y

246
00:16:42,487 --> 00:16:47,120
a cada paso del bucle recupero
un dado y

247
00:16:47,287 --> 00:16:47,920
¿Que voy a hacer con este dado?

248
00:16:48,120 --> 00:16:51,900
Le pido que realice una tirada
y agregue el resultado a

249
00:16:52,067 --> 00:16:53,440
mi variable

250
00:16:55,640 --> 00:17:00,310
Nada muy especial pero al menos
es muy muy explícito

251
00:17:02,000 --> 00:17:05,380
Ahora si hago "Inspect" y luego

252
00:17:05,547 --> 00:17:10,510
hago "Roll", 5, esto no prueba
que funcione.

253
00:17:11,210 --> 00:17:12,140
Intentemos-lo una vez más.

254
00:17:12,307 --> 00:17:13,140
11. Muy bien, funciona.

255
00:17:13,950 --> 00:17:16,120
Intentaremos escribir
un test, no hay motivo,

256
00:17:16,287 --> 00:17:19,920
entonces haremos
"Test", quiero guardarlo

257
00:17:21,590 --> 00:17:22,940
y lo llamo rolling.

258
00:17:26,960 --> 00:17:30,940
Entonces, ¿cómo podríamos
probar esto?

259
00:17:31,107 --> 00:17:35,760
Tendría que ser entre 1 y
el máximo numero de dados.

260
00:17:38,000 --> 00:17:42,100
Entonces haremos esto.

261
00:17:42,267 --> 00:17:42,900
Nosotros

262
00:17:48,280 --> 00:17:49,930
podríamos definir un método
que haga esto.

263
00:17:50,240 --> 00:17:53,040
Hagamos un método
que defina el máximo.

264
00:17:56,720 --> 00:18:00,100
operations "maxValue".

265
00:18:02,480 --> 00:18:03,240
¿Qué es maxValue?

266
00:18:03,407 --> 00:18:05,020
Finalmente. Está muy cerca de esto.

267
00:18:05,780 --> 00:18:10,000
Aquí en lugar de hacer roll,

268
00:18:11,440 --> 00:18:12,430
voy a pedir las caras (faces).

269
00:18:16,560 --> 00:18:20,490
Comprobemos. Si hago
"Inspect", aqui

270
00:18:21,830 --> 00:18:24,820
voy a hacer "maxValue 16".

271
00:18:28,490 --> 00:18:30,480
Sí, es solo 10 y 6.

272
00:18:30,647 --> 00:18:33,090
Entonces escribimos un test para

273
00:18:37,010 --> 00:18:41,600
"maxValue". Lo tengo,
Hago "maxValue equal:

274
00:18:41,767 --> 00:18:42,400
16".

275
00:18:45,320 --> 00:18:48,150
Entonces, puede ver, que podría
haber codificado algo

276
00:18:48,317 --> 00:18:51,320
muy feo en mi test, pero
finalmente es mejor

277
00:18:51,487 --> 00:18:53,690
crear un método en la clase
y utilizarlo.

278
00:18:54,080 --> 00:18:58,370
Entonces, podemos probar
que el método roll

279
00:18:58,820 --> 00:19:02,340
funciona bien. Hagamos
"roll",

280
00:19:05,900 --> 00:19:08,770
y le pido que debe estar comprendido

281
00:19:08,937 --> 00:19:11,000
entre
 ... "Roll between: 1 and:

282
00:19:14,230 --> 00:19:15,690
h maxValue.

283
00:19:24,080 --> 00:19:26,000
Si hago esto, ok, funciona.

284
00:19:28,120 --> 00:19:30,870
No es muy estadístico,
así que aquí podríamos realizar

285
00:19:31,037 --> 00:19:35,800
algo como
1000 timesRepeat.

286
00:19:36,000 --> 00:19:38,560
De acuerdo. Y aquí,

287
00:19:42,220 --> 00:19:46,680
tenemos nuestras 1000 pruebas.

288
00:19:47,740 --> 00:19:49,330
Guardamos. Muy bien.

289
00:19:49,497 --> 00:19:52,440
Guardamos de nuevo.
save, added maxValue

290
00:19:54,610 --> 00:19:56,030
and roll with tests.

291
00:20:03,940 --> 00:20:08,380
Casi hemos terminado,

292
00:20:08,547 --> 00:20:11,070
nos gustaría expresar que

293
00:20:11,237 --> 00:20:13,680
en lugar de tener "die faces: 6",

294
00:20:16,290 --> 00:20:17,670
nos gustaría tener "1 D6".

295
00:20:17,837 --> 00:20:18,470
Y finalmente,

296
00:20:25,510 --> 00:20:27,630
lo que ves
significa "enviar

297
00:20:27,797 --> 00:20:31,050
el mensaje D6 a un entero.

298
00:20:31,770 --> 00:20:34,540
Entonces vamos a la
la clase Integer

299
00:20:34,707 --> 00:20:39,620
Lo que vamos a hacer es

300
00:20:39,787 --> 00:20:43,660
definir una extensión de la clase.

301
00:20:43,827 --> 00:20:45,010
¿Qué es una extensión de la clase?

302
00:20:45,890 --> 00:20:50,350
Voy a empacar mis métodos
con el mismo nombre de mi paquete.

303
00:20:50,800 --> 00:20:53,360
Entonces, ¿vera qué hago?
Agrego un

304
00:20:53,527 --> 00:20:57,420
protocolo, le pongo *, debe
empezar por *dice que es

305
00:20:57,587 --> 00:21:00,780
el nombre de mi paquete, automáticamente
esto se pone gris lo que

306
00:21:00,947 --> 00:21:02,900
significa que el método será
empaquetado

307
00:21:03,067 --> 00:21:04,460
al mismo tiempo que este paquete.
Hagamos-lo.

308
00:21:04,900 --> 00:21:08,950
Imaginemos que hacemos ...
¿Qué es D6?

309
00:21:10,000 --> 00:21:13,570
Un D6 ... tengo que pensar
un poco sobre eso ...

310
00:21:21,050 --> 00:21:24,250
Primero creamos una mano porque
esto podría

311
00:21:24,417 --> 00:21:25,510
ser dos D6 finalmente.

312
00:21:27,210 --> 00:21:31,930
Entonces "handle", hacemos
"DiceHandle

313
00:21:32,097 --> 00:21:32,730
new",

314
00:21:37,120 --> 00:21:38,280
ok, entonces he creado mi truco.

315
00:21:39,380 --> 00:21:42,110
Ahora para cada receptor,
voy a hacer

316
00:21:42,277 --> 00:21:45,430
"self", este es mi entero,
"TimesRepeat".

317
00:21:46,370 --> 00:21:50,140
Habremos utilizado mucho
el timesRepeat, es raro.

318
00:21:51,900 --> 00:21:54,120
"TimesRepeat handle addDie:", ¿de qué?

319
00:21:56,790 --> 00:22:01,150
de "die faces". Y ahí,

320
00:22:02,000 --> 00:22:03,720
lo sabemos, es 6

321
00:22:05,890 --> 00:22:09,830
Y de hecho, tal vez sea
para devolver la mano.

322
00:22:11,220 --> 00:22:12,330
¿Es que funciona?

323
00:22:12,497 --> 00:22:14,950
Lo probamos así y
escribimos un test.

324
00:22:15,470 --> 00:22:20,380
Si hago 2 D6, inspect,
Mira,

325
00:22:20,547 --> 00:22:22,390
tengo 2 D6. Eso es genial.

326
00:22:23,190 --> 00:22:24,290
Pues escribamos un test.

327
00:22:25,640 --> 00:22:27,140
Clasificamos esas pruebas
después de todo.

328
00:22:28,150 --> 00:22:29,330
Escribimos "testNewSyntax".

329
00:22:33,950 --> 00:22:36,420
Aquí por el momento solo tenemos
D6, generalizaremos más tarde.

330
00:22:38,010 --> 00:22:40,000
Queremos hacer exactamente 
lo mismo

331
00:22:40,167 --> 00:22:44,440
que esto, entonces tendremos
una mano, digamos 2 D6.

332
00:22:47,020 --> 00:22:49,620
Y allí haremos
"selfAssert".

333
00:22:53,310 --> 00:22:54,430
¿Qué podemos probar?

334
00:22:54,597 --> 00:22:56,470
Que diceNumber equals: 2,

335
00:23:02,880 --> 00:23:05,420
por ejemplo. Puedes ver
que podria haber usado

336
00:23:05,587 --> 00:23:09,160
diceHandle = 2, aquí.

337
00:23:09,810 --> 00:23:12,080
En general, es mejor usar
"assert: equal:"

338
00:23:12,540 --> 00:23:14,310
porque así, cuando hay
un error, el sistema

339
00:23:14,477 --> 00:23:18,020
te muestra "He recibido esto y
obtuve este valor en lugar de ... "

340
00:23:18,630 --> 00:23:22,910
Si escribo =, dirá:
"Tengo una expresión equivocada".

341
00:23:23,680 --> 00:23:26,480
Aquí para el usuario final, que es
usted,

342
00:23:26,647 --> 00:23:28,850
como desarrollador, es mejor
usar

343
00:23:30,580 --> 00:23:33,340
"assert equals" porque le
 dira: "He recibido 3, cuando

344
00:23:33,560 --> 00:23:34,680
esperaba 2", por ejemplo.

345
00:23:35,860 --> 00:23:37,060
Entonces aquí, si hago esto.

346
00:23:37,510 --> 00:23:38,780
Ok, funciona.

347
00:23:39,320 --> 00:23:41,940
¿Podríamos tener una versión

348
00:23:42,107 --> 00:23:43,090
mas inteligente para este test?

349
00:23:43,257 --> 00:23:44,240
De momento, este nos conviene.

350
00:23:44,860 --> 00:23:46,640
Ahora puede ver que

351
00:23:46,807 --> 00:23:50,200
en el paquete, tengo una extensión
llamada D6.

352
00:23:50,690 --> 00:23:55,480
Generalizaremos esto
con "a number until",

353
00:23:56,120 --> 00:23:57,550
"a number of faces"

354
00:24:01,360 --> 00:24:03,870
Asi "aNumberOfFaces",
lo pondremos aqui.

355
00:24:05,200 --> 00:24:08,000
Y reescribimos D6 porque
es mucho mejor D6

356
00:24:08,137 --> 00:24:12,580
Escribimos D6 de esta manera.

357
00:24:12,747 --> 00:24:16,660
haremos "^ self D: 6".

358
00:24:19,050 --> 00:24:20,750
Haremos todos los demás.

359
00:24:20,917 --> 00:24:24,370
Haremos 4,

360
00:24:26,020 --> 00:24:30,870
2. Es más una moneda que un dado,
pero 2,

361
00:24:31,220 --> 00:24:35,640
10 y 20.

362
00:24:36,440 --> 00:24:37,570
¿Ha entendido el principio?.

363
00:24:41,540 --> 00:24:45,930
Entonces, probamos los test, puesto
que hemos cambiado la implementación.

364
00:24:47,010 --> 00:24:49,370
2 D6 ... 
significa que funciona.

365
00:24:49,830 --> 00:24:50,690
Entonces guardemos.

366
00:24:59,670 --> 00:25:03,320
¿Qué nos queda por hacer?

367
00:25:03,680 --> 00:25:08,030
De hecho, nos falta
poder sumar manos.

368
00:25:09,300 --> 00:25:11,600
¿Qué test me gustaría tener?

369
00:25:11,767 --> 00:25:14,640
Me gustaría que si hago,
por ejemplo,

370
00:25:18,710 --> 00:25:23,240
"AddingHandles", asegurarme que


371
00:25:23,407 --> 00:25:25,590
Puedo utilizar la nueva sintaxis.

372
00:25:25,757 --> 00:25:26,440
Muy bien.

373
00:25:26,960 --> 00:25:28,940
Me gustaría que si

374
00:25:29,107 --> 00:25:33,820
Escribo 2 D20 + 3 D6

375
00:25:34,000 --> 00:25:38,570
no vamos a complicar las cosas

376
00:25:38,737 --> 00:25:42,050
cosas. ¿Cuánto debo obtener?

377
00:25:43,160 --> 00:25:46,770
diceNumber debe ser igual a 5.

378
00:25:48,180 --> 00:25:52,270
Aquí ves que debemos definir
el operador +

379
00:25:52,870 --> 00:25:55,520
En Pharo + no es un operador,
es solo un mensaje.

380
00:25:55,687 --> 00:25:59,230
Entonces definimos un mensaje en la
clase DiceHandle

381
00:26:00,530 --> 00:26:02,850
Escribimos +.

382
00:26:04,650 --> 00:26:05,520
Entonces "aDiceHandle".

383
00:26:07,530 --> 00:26:09,410
Ahora podemos preguntarnos si

384
00:26:09,577 --> 00:26:11,770
modificamos el receptor o
si utilizamos

385
00:26:11,937 --> 00:26:12,840
un enfoque funcional

386
00:26:13,130 --> 00:26:14,740
Prefiero usar un enfoque funcional.

387
00:26:14,907 --> 00:26:17,470
en el que creamos
una nueva mano.

388
00:26:20,180 --> 00:26:23,690
Entonces voy a crear una
nueva mano, escribo

389
00:26:26,060 --> 00:26:27,650
"handle := self class new".

390
00:26:29,540 --> 00:26:34,060
Evité escribir
diceHandle y más tarde

391
00:26:34,227 --> 00:26:36,360
hay una lección que le explicara porque.

392
00:26:36,527 --> 00:26:37,770
Lo prefiero, es mucho mas cercano.

393
00:26:37,937 --> 00:26:39,800
En general, no codifica a palo
el nombre de las clases.

394
00:26:40,430 --> 00:26:42,530
Lo verá en la semana 7,

395
00:26:42,697 --> 00:26:44,040
hay toda una explicación.

396
00:26:44,740 --> 00:26:49,660
Si hago "self
dice do:", lo que haré

397
00:26:49,827 --> 00:26:53,480
es iterar con mis dados y
agregarlos a una mano.

398
00:26:53,647 --> 00:26:55,610
Así que hago
"handle addDie: each",

399
00:26:59,780 --> 00:27:03,660
y hago lo mismo ...
Aquí no

400
00:27:03,827 --> 00:27:05,720
necesito self y de hecho no
conoce

401
00:27:05,887 --> 00:27:07,420
el mensaje, eso es lo que
quería decir y

402
00:27:07,587 --> 00:27:09,370
me hace notar que, de hecho,
no lo he definido

403
00:27:09,820 --> 00:27:12,790
y no ha funcionado para
"diceHandle", pero

404
00:27:15,630 --> 00:27:20,480
no es grave, compilamos y
ya lo solucionaremos más tarde.

405
00:27:21,230 --> 00:27:22,450
Entonces, ¿qué significa?

406
00:27:22,617 --> 00:27:24,790
Significa que le falta un acceso
que es dice.

407
00:27:25,280 --> 00:27:28,770
Entonces agregamos dice aquí,
dice que me devuelve

408
00:27:28,937 --> 00:27:32,060
la colección de mis dados

409
00:27:32,227 --> 00:27:35,280
Ahora voy a probar, a ver si
mi test funciona.

410
00:27:35,700 --> 00:27:38,690
Mi test funciona, es súper
significa que prácticamente

411
00:27:38,857 --> 00:27:43,610
he acabado, guardo,
"with handles

412
00:27:44,810 --> 00:27:46,690
additions". Ok, muy bien.

413
00:27:49,820 --> 00:27:53,770
Significa que ahora podemos escribir

414
00:27:57,300 --> 00:28:02,210
2 D4 y luego

415
00:28:02,377 --> 00:28:06,380
hacer "Roll", lo que nos devolverá
un número.

416
00:28:08,000 --> 00:28:10,400
Ahora está listo para jugar
a "Calabozos y Dragones".

417
00:28:11,200 --> 00:28:15,870
Lo que debe retener, 
hemos definido

418
00:28:17,570 --> 00:28:19,480
nuestro métodos, hemos definido
nuestros test, los hemos hecho

419
00:28:19,647 --> 00:28:23,010
rodar, extendimos una clase
del sistema,

420
00:28:23,177 --> 00:28:27,000
la clase Integer, con extensiones
vinculadas a nuestro

421
00:28:27,167 --> 00:28:30,590
paquete, que solo serán visibles
cuando nuestro paquete se cargue.

422
00:28:32,290 --> 00:28:34,580
También sobrecargamos a los operadores,
pero

423
00:28:34,747 --> 00:28:39,320
de hecho, solo definimos un nuevo
mensaje +, porque

424
00:28:39,487 --> 00:28:43,600
en Pharo la adición es
solo otro mensaje

425
00:28:43,767 --> 00:28:48,160
esto nos permitió
expresar con cierta facilidad un bonito DSL.

426
00:28:49,900 --> 00:28:50,850
¡Ahora os toca a vosotros!
