/
ES_C019SD-W7-S7.vtt
429 lines (311 loc) · 11 KB
/
ES_C019SD-W7-S7.vtt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
WEBVTT
00:00:00.720 --> 00:00:06.000 align:middle
Hola a todos, en este video
hablaremos sobre la campaña Anti-IF.
00:00:06.480 --> 00:00:09.480 align:middle
En particular,
Explicaremos los motivos por los que
00:00:09.920 --> 00:00:13.720 align:middle
el retorno cero y el control nulo
Las funciones no son geniales.
00:00:13.920 --> 00:00:18.520 align:middle
Aquí hay un ejemplo de un código,
que no es un objeto
00:00:19.040 --> 00:00:21.680 align:middle
Su parámetro de método es un animal.
00:00:21.880 --> 00:00:24.680 align:middle
Sus acciones varían
de acuerdo con el animal.
00:00:24.880 --> 00:00:30.560 align:middle
Por ejemplo, podemos preguntar a un perro
para mover su cola o un pato al curandero.
00:00:31.000 --> 00:00:33.440 align:middle
Para un gato, solicitamos otras acciones.
00:00:34.040 --> 00:00:38.080 align:middle
Entonces, ¿por qué es problemático?
para usar declaraciones de If?
00:00:39.120 --> 00:00:43.800 align:middle
Particularmente cuando se usan
para verificar el tipo de receptor.
00:00:45.080 --> 00:00:49.200 align:middle
Por ejemplo, si queremos agregar
un nuevo animal aquí,
00:00:49.360 --> 00:00:53.400 align:middle
tendríamos que verificar
todo el código del proyecto
00:00:53.680 --> 00:00:56.880 align:middle
para buscar declaraciones If.
eso puede aplicarse.
00:00:57.040 --> 00:01:01.280 align:middle
Tendríamos que modificar
Numerosos códigos en todo el proyecto.
00:01:01.640 --> 00:01:06.560 align:middle
Además, agregando casos a métodos
los hace engorrosos,
00:01:06.840 --> 00:01:10.440 align:middle
y se pierden
en demasiados detalles.
00:01:10.720 --> 00:01:13.760 align:middle
Agregar animales
hace que este método sea muy largo,
00:01:13.920 --> 00:01:17.160 align:middle
y cada tipo de animal
puede tener muchos detalles
00:01:17.320 --> 00:01:21.760 align:middle
Incluso por una característica simple,
como que no todos los perros tienen colas,
00:01:21.920 --> 00:01:25.920 align:middle
tendríamos que crear
Casos separados para cada opción.
00:01:26.120 --> 00:01:31.640 align:middle
El código se convertiría
complicado y más difícil de entender.
00:01:32.240 --> 00:01:35.760 align:middle
Entonces, para reemplazar estas acciones,
nosotros enviamos mensajes
00:01:36.080 --> 00:01:38.480 align:middle
Este es un punto que seguimos reiterando.
00:01:38.640 --> 00:01:42.240 align:middle
El punto clave para recordar
es el envío de mensajes.
00:01:42.880 --> 00:01:46.280 align:middle
Podemos reemplazar
el código anterior con este.
00:01:47.040 --> 00:01:51.160 align:middle
Aplica el método showHappiness
en cada clase relevante.
00:01:51.320 --> 00:01:56.480 align:middle
Cada clase decidirá cómo cada animal
mostrará su "felicidad".
00:01:56.760 --> 00:02:02.720 align:middle
Para cada animal, todo lo que necesitamos hacer
es enviar el mensaje
00:02:05.560 --> 00:02:07.560 align:middle
showHappiness al animal,
00:02:08.600 --> 00:02:11.360 align:middle
y uno de sus métodos se ejecutará.
00:02:11.520 --> 00:02:15.040 align:middle
Vemos aquí que Pharo
está siguiendo la función If.
00:02:15.200 --> 00:02:19.960 align:middle
Pharo decide qué método aplicar
a un tipo particular de animal.
00:02:20.120 --> 00:02:22.920 align:middle
Esto se ejecuta automáticamente.
00:02:23.120 --> 00:02:27.480 align:middle
No hay necesidad para nosotros
para especificar Ifs para tipos de objetos.
00:02:28.040 --> 00:02:31.200 align:middle
Solo hace códigos
menos coherente y dinámica.
00:02:32.560 --> 00:02:36.040 align:middle
Ahora hablaremos
el caso específico de Nil.
00:02:36.440 --> 00:02:39.160 align:middle
Si un método devuelve cero,
00:02:39.320 --> 00:02:43.120 align:middle
usted obligará a sus clientes
para usar sentencias If.
00:02:43.280 --> 00:02:46.200 align:middle
Considerando que raramente se recomienda usar If.
00:02:47.520 --> 00:02:50.520 align:middle
Aquí utilizamos un ejemplo de un código
00:02:50.760 --> 00:02:55.440 align:middle
basado en un parámetro y un inferencia.
00:02:55.600 --> 00:02:57.880 align:middle
El tipo de código no es importante.
00:02:58.160 --> 00:03:01.440 align:middle
Aquí vemos que en algunos casos,
nada se devuelve
00:03:01.840 --> 00:03:04.480 align:middle
Esto significa que cuando usamos este código,
00:03:04.760 --> 00:03:08.600 align:middle
tenemos que probar
el mensaje rulesForFact.
00:03:08.800 --> 00:03:11.480 align:middle
¿Las reglasForFact regresaron nulas?
00:03:11.680 --> 00:03:14.560 align:middle
Actuamos de manera diferente
dependiendo de la respuesta.
00:03:14.720 --> 00:03:17.280 align:middle
Vemos que en este caso,
00:03:17.880 --> 00:03:20.280 align:middle
ya que estamos usando un término plural,
00:03:20.440 --> 00:03:23.960 align:middle
el método probablemente
Devuelve una colección.
00:03:24.200 --> 00:03:26.880 align:middle
Una solución efectiva para evitar nada
00:03:27.080 --> 00:03:31.000 align:middle
en esta situación
es devolver una colección vacía.
00:03:31.200 --> 00:03:33.080 align:middle
Esto funciona en muchos casos.
00:03:33.400 --> 00:03:38.520 align:middle
Devolviendo una colección vacía
en lugar de cero, simplifica el código.
00:03:38.880 --> 00:03:42.400 align:middle
Porque los clientes simplemente pueden
iterar la colección,
00:03:42.560 --> 00:03:45.360 align:middle
y si está vacío, no sucederá nada.
00:03:46.480 --> 00:03:48.400 align:middle
Para casos excepcionales,
00:03:48.840 --> 00:03:52.360 align:middle
como cuando tienes una transmisión de archivo
00:03:52.520 --> 00:03:56.320 align:middle
que no se ha abierto para escribir
y muestra un error,
00:03:56.560 --> 00:04:01.640 align:middle
En lugar de regresar nada, informamos
El sistema al levantar una excepción.
00:04:01.920 --> 00:04:05.600 align:middle
En Pharo,
llamamos a esta presentación una excepción.
00:04:05.760 --> 00:04:09.560 align:middle
Creamos una instancia
de la clase o subclase de excepción
00:04:09.720 --> 00:04:11.960 align:middle
y envíe el mensaje o señal.
00:04:13.680 --> 00:04:19.640 align:middle
Esto evita obligar
el cliente del método nextPutAll
00:04:19.800 --> 00:04:23.960 align:middle
para probar si es nulo,
cuando es probable que haya ocurrido un problema
00:04:24.200 --> 00:04:26.800 align:middle
El cliente maneja la excepción
00:04:26.960 --> 00:04:31.680 align:middle
o se maneja
por el cliente del cliente, y así sucesivamente.
00:04:31.880 --> 00:04:37.840 align:middle
Podemos centrarnos en un nivel específico
para capturar la excepción.
00:04:38.560 --> 00:04:40.240 align:middle
Evita el uso excesivo de Ifs.
00:04:40.880 --> 00:04:45.720 align:middle
Otro caso en el que encontramos cheques
por el valor nulo
00:04:45.880 --> 00:04:49.280 align:middle
es en variables de instancia
que no se inicializan
00:04:49.600 --> 00:04:54.800 align:middle
Si un código dice que si la variable
es todavía nula, debe reaccionar de cierta manera,
00:04:54.960 --> 00:04:59.200 align:middle
es mejor inicializar la variable
inmediatamente,
00:04:59.360 --> 00:05:01.960 align:middle
con un valor que funciona para todos los casos.
00:05:02.120 --> 00:05:03.120 align:middle
Por lo tanto, aquí,
00:05:03.600 --> 00:05:06.680 align:middle
para "miembros"
que contiene una colección,
00:05:06.840 --> 00:05:10.600 align:middle
inicializamos una colección vacía
en lugar de usar nada.
00:05:10.920 --> 00:05:13.520 align:middle
Una vez más, esto a menudo funciona bien.
00:05:13.960 --> 00:05:18.000 align:middle
Si quieres dar un valor
a una variable,
00:05:18.400 --> 00:05:22.680 align:middle
y si es costoso
para calcular su valor,
00:05:22.840 --> 00:05:26.560 align:middle
puedes esperar hasta el último momento
para calcularlo
00:05:26.720 --> 00:05:30.520 align:middle
Puede que nunca se calcule,
por lo que ahorra tiempo de ejecución.
00:05:31.320 --> 00:05:35.040 align:middle
En esos casos,
Usamos la inicialización perezosa.
00:05:35.200 --> 00:05:38.280 align:middle
Esto se usa cuando se requiere un valor.
00:05:38.680 --> 00:05:42.400 align:middle
Si el valor sigue siendo nulo,
le asignamos un valor.
00:05:42.560 --> 00:05:47.240 align:middle
Si ya no es nil,
devolvemos su valor de inmediato.
00:05:48.000 --> 00:05:52.600 align:middle
Aquí tenemos un If asociado con nil,
pero solo tenemos uno.
00:05:53.160 --> 00:05:57.920 align:middle
Todos los demás usuarios de la variable
utilizar el método de descenso,
00:05:58.520 --> 00:06:00.720 align:middle
y no he probado si es nulo.
00:06:01.320 --> 00:06:03.960 align:middle
A veces encontramos casos
00:06:04.520 --> 00:06:09.840 align:middle
en el que es necesario verificar
si tenemos que responder o no.
00:06:10.320 --> 00:06:12.160 align:middle
Como vemos en este ejemplo.
00:06:12.800 --> 00:06:15.840 align:middle
Aquí tenemos una paleta de herramientas.
00:06:16.120 --> 00:06:19.440 align:middle
Si se selecciona una herramienta, podemos responder,
00:06:19.600 --> 00:06:22.960 align:middle
pero si no se selecciona ninguno,
preferimos no actuar
00:06:23.640 --> 00:06:26.480 align:middle
Mire la función selectedTool.
00:06:26.720 --> 00:06:31.600 align:middle
Si devuelve nil, no se seleccionan herramientas,
por lo que no se requiere ninguna acción.
00:06:31.800 --> 00:06:35.760 align:middle
Si selectedTool devuelve algo,
00:06:36.000 --> 00:06:40.080 align:middle
le pediremos que realice una acción.
00:06:41.040 --> 00:06:42.920 align:middle
Una buena forma de reemplazar esto
00:06:43.360 --> 00:06:45.720 align:middle
es usar el patrón NullObject.
00:06:45.880 --> 00:06:50.400 align:middle
En lugar de tener dos casos,
uno con herramientas y otro sin herramientas,
00:06:50.600 --> 00:06:54.440 align:middle
tenemos un caso
en el que una de nuestras herramientas no hace nada.
00:06:54.600 --> 00:06:57.120 align:middle
Esta herramienta se seleccionará de manera predeterminada.
00:06:57.360 --> 00:07:01.840 align:middle
Creamos una herramienta que no hace nada
Cuando se le pide que realice acciones.
00:07:03.120 --> 00:07:09.000 align:middle
En lugar de no seleccionar nada,
habilitamos una herramienta que no hace nada.
00:07:10.360 --> 00:07:14.800 align:middle
Para obtener más información sobre NullObject,
mira estas referencias
00:07:15.680 --> 00:07:16.840 align:middle
En conclusión,
00:07:17.000 --> 00:07:19.640 align:middle
Los mensajes son más efectivos que Ifs.
00:07:19.840 --> 00:07:22.520 align:middle
Utilizará Ifs en ciertos casos,
00:07:22.680 --> 00:07:27.680 align:middle
pero a menudo puede evitar usarlo
y envíe mensajes en su lugar.
00:07:28.840 --> 00:07:34.160 align:middle
Evita regresar nada porque
Te obliga a insertar Si cheques
00:07:34.360 --> 00:07:38.280 align:middle
para saber si es o no
el valor es nulo
00:07:39.440 --> 00:07:44.720 align:middle
Inicializa variables ya sea en la creación
o usando la inicialización perezosa.
00:07:45.680 --> 00:07:50.760 align:middle
Crea objetos que representan el valor predeterminado.
Comportamiento o ausencia de comportamiento.
00:07:50.960 --> 00:07:54.960 align:middle
Esto se aplica no solo a Pharo
pero a todos los idiomas de objeto.
00:07:55.200 --> 00:08:00.840 align:middle
Es importante recordar estos puntos.
sea cual sea el idioma que use.