1 00:00:00,000 --> 00:00:02,960 vale, pues ya está 2 00:00:02,960 --> 00:00:05,179 entonces, no vamos a ponerle 3 00:00:05,179 --> 00:00:07,500 módulos, porque a esta aplicación 4 00:00:07,500 --> 00:00:09,580 se supone que habría que agregarle 5 00:00:09,580 --> 00:00:11,080 que le agregaríais vosotros 6 00:00:11,080 --> 00:00:13,240 una funcionalidad que es 7 00:00:13,240 --> 00:00:15,160 agregar módulo a un alumno 8 00:00:15,160 --> 00:00:16,539 agregar módulo a un alumno 9 00:00:16,539 --> 00:00:19,059 entonces vamos a crearlo sin módulos y sin más 10 00:00:19,059 --> 00:00:21,359 entonces su lista de módulos 11 00:00:21,359 --> 00:00:23,559 que he puesto 12 00:00:23,559 --> 00:00:25,620 setNif, porque he copiado y pegado 13 00:00:25,620 --> 00:00:27,719 vale, entonces 14 00:00:27,719 --> 00:00:30,359 Set nombre 15 00:00:30,359 --> 00:00:32,759 Hay que ver 16 00:00:32,759 --> 00:00:34,560 Que pendientes estamos de todo 17 00:00:34,560 --> 00:00:36,960 Entonces este alumno 18 00:00:36,960 --> 00:00:39,200 Se va a crear con su lista de módulos 19 00:00:39,200 --> 00:00:39,640 Vacío 20 00:00:39,640 --> 00:00:42,979 Esto a mi también me daba ansiedad el año pasado 21 00:00:42,979 --> 00:00:44,359 Vale 22 00:00:44,359 --> 00:00:46,579 Y a vosotros como 23 00:00:46,579 --> 00:00:47,899 Contagio también 24 00:00:47,899 --> 00:00:50,119 Una propiedad colección 25 00:00:50,119 --> 00:00:52,340 Al menos instanciarla 26 00:00:52,340 --> 00:00:54,799 Para no arriesgarnos 27 00:00:54,799 --> 00:00:56,179 A los null pointer exceptions 28 00:00:56,179 --> 00:00:57,960 Si alguien se pone a añadir así por las buenas 29 00:00:57,960 --> 00:00:59,920 Al menos instanciarla 30 00:00:59,920 --> 00:01:02,719 No es una mala costumbre 31 00:01:02,719 --> 00:01:04,959 A ver 32 00:01:04,959 --> 00:01:07,000 Es mala costumbre 33 00:01:07,000 --> 00:01:09,599 En cuanto a que te compromete 34 00:01:09,599 --> 00:01:11,079 Ya un tipo de estructura 35 00:01:11,079 --> 00:01:12,819 Arraylist, linkedlist 36 00:01:12,819 --> 00:01:15,099 Pero bueno, uno siempre podría sobreescribirla más adelante 37 00:01:15,099 --> 00:01:16,859 Pero hombre 38 00:01:16,859 --> 00:01:19,340 Cuanto menos 39 00:01:19,340 --> 00:01:20,620 Nos arriesguemos 40 00:01:20,620 --> 00:01:22,680 A un null pointer exception 41 00:01:22,680 --> 00:01:23,280 Mejor 42 00:01:23,280 --> 00:01:25,659 ¿Vale? 43 00:01:26,180 --> 00:01:32,099 ¡Hala! Pues este es nuestro alumnito que le devolvemos aquí. 44 00:01:34,000 --> 00:01:36,159 Ya hemos solicitado los datos. 45 00:01:39,500 --> 00:01:42,359 Porque el null pointer exception seguramente sea la... 46 00:01:42,359 --> 00:01:46,480 Si uno pudiera contabilizar todas las excepciones que han salido a lo largo de la historia de Java, 47 00:01:46,579 --> 00:01:48,060 todo el mundo que ha programado en Java, 48 00:01:48,299 --> 00:01:49,980 ¿qué pena no poder hacer un histograma? 49 00:01:50,560 --> 00:01:54,519 Seguramente null pointer exception tendría la delantera. 50 00:01:54,519 --> 00:01:57,500 A ver 51 00:01:57,500 --> 00:01:59,140 ¿Dónde estábamos? Aquí 52 00:01:59,140 --> 00:02:00,219 Solicitar datos 53 00:02:00,219 --> 00:02:04,019 Y ahora ya sí que tenemos que insertar 54 00:02:04,019 --> 00:02:06,040 Alumno 55 00:02:06,040 --> 00:02:08,699 En el fichero 56 00:02:08,699 --> 00:02:13,150 Ahora ya tenemos que meter 57 00:02:13,150 --> 00:02:15,250 Al alumno en el fichero 58 00:02:15,250 --> 00:02:22,710 Vale 59 00:02:22,710 --> 00:02:28,219 Ah bueno 60 00:02:28,219 --> 00:02:29,759 Perdona, perdona, perdona 61 00:02:29,759 --> 00:02:31,280 Claro, sí, sí, sí, tienes razón 62 00:02:31,280 --> 00:02:33,199 O sea, la aplicación está trabajando con el map 63 00:02:33,199 --> 00:02:34,560 Perdona, claro, tienes razón 64 00:02:34,560 --> 00:02:36,560 Entonces lo que tengo que instalar es en el map 65 00:02:36,560 --> 00:02:38,800 En el fichero, claro, en el fichero lo mandaré 66 00:02:38,800 --> 00:02:41,319 Claro, insertar alumno es que no me hace falta 67 00:02:41,319 --> 00:02:42,979 Ni hacer un método aparte 68 00:02:42,979 --> 00:02:45,080 Porque directamente pondría 69 00:02:45,080 --> 00:02:46,900 En el map 70 00:02:46,900 --> 00:02:53,080 Alumnos.put 71 00:02:53,080 --> 00:02:58,780 Alumn.getNive 72 00:02:58,780 --> 00:02:59,599 Alumn 73 00:02:59,599 --> 00:03:01,340 Vale, ya está 74 00:03:01,340 --> 00:03:03,860 Entonces efectivamente este método fuera 75 00:03:03,860 --> 00:03:06,300 Ahora no pinta nada 76 00:03:06,300 --> 00:03:08,319 Pintará cuando ya lo hagamos 77 00:03:08,319 --> 00:03:10,120 Con un patrón de diseño un poco más decente 78 00:03:10,120 --> 00:03:12,060 Porque os dais cuenta 79 00:03:12,060 --> 00:03:14,099 De lo mal que estamos programando aquí 80 00:03:14,099 --> 00:03:15,939 Estamos haciendo todos los métodos en el main 81 00:03:15,939 --> 00:03:17,319 Según los vamos necesitando 82 00:03:17,319 --> 00:03:19,340 No hemos hecho un diseño previo 83 00:03:19,340 --> 00:03:22,439 Entonces esta aplicación que luego tenemos que ampliar 84 00:03:22,439 --> 00:03:23,599 La va a ser un desmadre 85 00:03:23,599 --> 00:03:26,379 Luego la vamos a intentar hacer con un diseño previo 86 00:03:26,379 --> 00:03:26,800 Dime 87 00:03:26,800 --> 00:03:30,080 Bajar hasta donde 88 00:03:30,080 --> 00:03:33,060 Solicita datos, nada 89 00:03:33,060 --> 00:03:35,360 Tiene el scan y devolver el alumno 90 00:03:35,360 --> 00:03:35,879 Y ya está 91 00:03:35,879 --> 00:03:38,300 No tiene nada 92 00:03:38,300 --> 00:03:39,139 ¿Vale? 93 00:03:40,439 --> 00:03:41,599 Entonces efectivamente 94 00:03:41,599 --> 00:03:43,520 Como bien has apuntado 95 00:03:43,520 --> 00:03:46,379 Esta aplicación una vez que ha recuperado 96 00:03:46,379 --> 00:03:47,560 A los alumnos en el map 97 00:03:47,560 --> 00:03:51,000 Tendrá que preocuparse de cuando la aplicación 98 00:03:51,000 --> 00:03:52,300 Termina, que es aquí 99 00:03:52,300 --> 00:03:54,020 Guardarlos otra vez 100 00:03:54,020 --> 00:03:56,219 ¿Vale? En ese punto tendrá que guardarlos 101 00:03:56,219 --> 00:03:57,560 Entonces 102 00:03:57,560 --> 00:03:59,719 Uy 103 00:03:59,719 --> 00:04:04,580 Aquí tendremos que 104 00:04:04,580 --> 00:04:06,680 Guardar 105 00:04:06,680 --> 00:04:09,500 Alumnos 106 00:04:09,500 --> 00:04:10,539 Vale 107 00:04:10,539 --> 00:04:12,500 Y ahora ya este método 108 00:04:12,500 --> 00:04:16,579 Implica de nuevo 109 00:04:16,579 --> 00:04:18,560 Que cojamos las clases de serialización 110 00:04:18,560 --> 00:04:23,680 Guardar alumnos 111 00:04:23,680 --> 00:04:25,500 Object output stream 112 00:04:25,500 --> 00:04:44,110 Vale 113 00:04:44,110 --> 00:04:45,649 Asociado a un flujo 114 00:04:45,649 --> 00:04:47,389 New file output 115 00:04:47,389 --> 00:04:49,209 stream 116 00:04:49,209 --> 00:04:51,889 con el nombre del objeto 117 00:04:51,889 --> 00:04:53,670 file, que era 118 00:04:53,670 --> 00:04:55,410 fichero alumnos 119 00:04:55,410 --> 00:04:57,230 y luego 120 00:04:57,230 --> 00:05:00,189 podíamos poner opcionalmente 121 00:05:00,189 --> 00:05:01,389 en el file output stream 122 00:05:01,389 --> 00:05:03,889 un parámetro para 123 00:05:03,889 --> 00:05:05,709 poner si queremos añadir 124 00:05:05,709 --> 00:05:07,769 o sobreescribir enterores del principio 125 00:05:07,769 --> 00:05:08,990 en este caso vamos a escribir 126 00:05:08,990 --> 00:05:11,889 claro, pero en este caso tenemos 127 00:05:11,889 --> 00:05:13,790 suerte, porque si no, tenemos 128 00:05:13,790 --> 00:05:15,389 una movida, no queremos añadir 129 00:05:15,389 --> 00:05:17,790 en este caso queremos todo el map entero 130 00:05:17,790 --> 00:05:19,410 que tiene todos los alumnos, los nuevos 131 00:05:19,410 --> 00:05:21,470 los que he quitado, todo el map entero, volcarlo 132 00:05:21,470 --> 00:05:23,449 con lo cual podemos dejar 133 00:05:23,449 --> 00:05:25,870 la variante 134 00:05:25,870 --> 00:05:28,170 de format.string que no tiene ese parámetro 135 00:05:28,170 --> 00:05:29,930 que es igual a tenerlo falso 136 00:05:29,930 --> 00:05:30,970 es decir, no añadas 137 00:05:30,970 --> 00:05:34,009 sobreescribe el fichero con todo este map entero 138 00:05:34,009 --> 00:05:37,529 pero lo que si que tenemos que hacer es 139 00:05:37,529 --> 00:05:39,370 los import y los 140 00:05:39,370 --> 00:05:40,430 throws 141 00:05:40,430 --> 00:05:51,379 y ahora ya si que si 142 00:05:51,379 --> 00:05:53,439 Pues recorrer el map 143 00:05:53,439 --> 00:05:54,800 De nuevo para irlos guardando 144 00:05:54,800 --> 00:05:57,839 Pues venga, lo recorremos así a lo patatero 145 00:05:57,839 --> 00:05:58,420 Otra vez 146 00:05:58,420 --> 00:06:01,500 Para cada clave 147 00:06:01,500 --> 00:06:03,500 En 148 00:06:03,500 --> 00:06:05,519 Nuestros alumnos 149 00:06:05,519 --> 00:06:07,220 Vamos 150 00:06:07,220 --> 00:06:09,139 A escribir el objeto 151 00:06:09,139 --> 00:06:13,370 Vamos a escribir 152 00:06:13,370 --> 00:06:14,870 Eh 153 00:06:14,870 --> 00:06:17,850 Alumnos.get 154 00:06:17,850 --> 00:06:19,470 Nif 155 00:06:19,470 --> 00:06:20,689 Lo próximo que pasa 156 00:06:20,689 --> 00:06:25,149 sí, hace falta 157 00:06:25,149 --> 00:06:26,670 un quesed 158 00:06:26,670 --> 00:06:32,209 ala, los estamos escribiendo 159 00:06:32,209 --> 00:06:34,410 uno por uno y cuando ya hemos terminado 160 00:06:34,410 --> 00:06:35,230 fuera 161 00:06:35,230 --> 00:06:41,680 guardar alumnos está 162 00:06:41,680 --> 00:06:44,420 que lo haríamos 163 00:06:44,420 --> 00:06:49,519 cuando salimos 164 00:06:49,519 --> 00:06:53,899 si, eso 165 00:06:53,899 --> 00:06:55,879 cuando lo hagamos con el patrón 166 00:06:55,879 --> 00:06:57,860 lo vamos a ir haciendo añadiendo poco a poco 167 00:06:57,860 --> 00:06:59,459 y ahí ya sí que tendremos que ver 168 00:06:59,459 --> 00:07:00,639 que tenemos un problema con la cabecera 169 00:07:00,639 --> 00:07:02,879 claro, y ese lo tendremos que arreglar 170 00:07:02,879 --> 00:07:04,939 Aquí como lo sobre escribimos enterito 171 00:07:04,939 --> 00:07:05,959 Ese problema no lo tenemos 172 00:07:05,959 --> 00:07:09,040 Vale, entonces 173 00:07:09,040 --> 00:07:09,639 Dime 174 00:07:09,639 --> 00:07:16,870 Si, podríamos guardar el map entero 175 00:07:16,870 --> 00:07:17,490 ¿Vale? 176 00:07:18,350 --> 00:07:20,129 Pero aquí lo quiero guardar uno por uno 177 00:07:20,129 --> 00:07:22,769 Pues para que veamos 178 00:07:22,769 --> 00:07:24,410 Que empecemos a intuir 179 00:07:24,410 --> 00:07:25,910 Que habría una diferencia entre 180 00:07:25,910 --> 00:07:27,649 Añadir, guardarlos todos 181 00:07:27,649 --> 00:07:29,470 Y que esa diferencia tiene implicaciones 182 00:07:29,470 --> 00:07:31,029 Lo veremos luego 183 00:07:31,029 --> 00:07:33,410 Pero si, podría guardar el map 184 00:07:33,410 --> 00:07:35,990 Un único great object 185 00:07:35,990 --> 00:07:38,470 y luego cuando recuperara 186 00:07:38,470 --> 00:07:39,970 haría un único read object 187 00:07:39,970 --> 00:07:42,290 pero no habríamos tenido que hacer el buque de lectura 188 00:07:42,290 --> 00:07:44,569 que yo si quería que hiciéramos el buque de lectura 189 00:07:44,569 --> 00:07:45,350 para leer uno por uno 190 00:07:45,350 --> 00:07:47,610 entonces 191 00:07:47,610 --> 00:07:49,970 eso te vale 192 00:07:49,970 --> 00:07:52,509 cuando tu aplicación usa un map 193 00:07:52,509 --> 00:07:54,810 pero claro, puede ser que tu aplicación 194 00:07:54,810 --> 00:07:56,930 guarde los alumnos 195 00:07:56,930 --> 00:07:58,509 cada vez en una estructura 196 00:07:58,509 --> 00:08:00,449 distinta, entonces si la aplicación 197 00:08:00,449 --> 00:08:01,709 lo guarda cada vez en una estructura distinta 198 00:08:01,709 --> 00:08:03,910 pues la idea es que tú los vayas añadiendo 199 00:08:03,910 --> 00:08:09,870 Bueno, pues entonces antes de probarla para ver si esto funciona 200 00:08:09,870 --> 00:08:12,870 Vamos a recuperar un alumno 201 00:08:12,870 --> 00:08:15,629 Que recuperar un alumno pues no tiene nada 202 00:08:15,629 --> 00:08:20,129 Porque aquí le pedimos el NIF del alumno 203 00:08:20,129 --> 00:08:23,810 Leemos el NIF 204 00:08:23,810 --> 00:08:27,319 Bueno, es que ni siquiera 205 00:08:27,319 --> 00:08:30,660 Vamos a mostrar directamente al alumno 206 00:08:30,660 --> 00:08:34,559 Alumnos.get 207 00:08:34,559 --> 00:08:39,159 De scan.nextint 208 00:08:39,159 --> 00:08:41,220 Nextline, perdón 209 00:08:41,220 --> 00:08:49,600 Vale, pedimos el nif 210 00:08:49,600 --> 00:08:51,120 Y con este nif 211 00:08:51,120 --> 00:08:53,500 Indexamos en el map 212 00:08:53,500 --> 00:08:54,620 Para sacar el alumno 213 00:08:54,620 --> 00:08:56,940 Y con el system out 214 00:08:56,940 --> 00:08:57,980 Pues nos lo muestra 215 00:08:57,980 --> 00:09:01,340 Aquí no tenemos 216 00:09:01,340 --> 00:09:03,580 Añadido nada de añadir un módulo 217 00:09:03,580 --> 00:09:04,740 Para un módulo, pero bueno 218 00:09:04,740 --> 00:09:07,620 Bueno, pues podríamos probar 219 00:09:07,620 --> 00:09:08,480 Esta 220 00:09:08,480 --> 00:09:13,039 Esta versión de la aplicación 221 00:09:13,039 --> 00:09:14,720 A ver si funciona todo 222 00:09:14,720 --> 00:09:18,620 Vale 223 00:09:18,620 --> 00:09:21,559 A ver 224 00:09:21,559 --> 00:09:22,940 Venga 225 00:09:22,940 --> 00:09:25,940 Nombre de fichero alumnos 226 00:09:25,940 --> 00:09:28,399 Alumnos.txt 227 00:09:28,399 --> 00:09:29,919 Uy txt, bueno da igual 228 00:09:29,919 --> 00:09:32,279 Venga 229 00:09:32,279 --> 00:09:34,460 Vamos a insertar un primer alumno 230 00:09:34,460 --> 00:09:35,879 Su nombre 231 00:09:35,879 --> 00:09:36,860 Digo su nif 232 00:09:36,860 --> 00:09:38,919 Su nombre 233 00:09:38,919 --> 00:09:44,259 lo habrá insertado 234 00:09:44,259 --> 00:09:46,480 va a un map, tampoco es que sea tan complicado 235 00:09:46,480 --> 00:09:48,240 insertar, vamos a 236 00:09:48,240 --> 00:09:50,519 mostrar el listado de alumnos 237 00:09:50,519 --> 00:09:52,480 pues si, tenemos 238 00:09:52,480 --> 00:09:53,240 este alumno 239 00:09:53,240 --> 00:09:56,100 vamos a recuperarlo 240 00:09:56,100 --> 00:09:58,120 por nif, 1, 2, 3, 4 241 00:09:58,120 --> 00:10:00,340 está trabajando con el map, no tiene nada que hacer 242 00:10:00,340 --> 00:10:01,840 vale 243 00:10:01,840 --> 00:10:04,539 y vamos a insertar un segundo 244 00:10:04,539 --> 00:10:05,860 para al menos tener 2 245 00:10:05,860 --> 00:10:08,399 5, 6, 7, 8 246 00:10:08,399 --> 00:10:10,179 nombre 247 00:10:10,179 --> 00:10:12,899 Y ya está 248 00:10:12,899 --> 00:10:14,679 Y aquí tenemos a los dos en el mar 249 00:10:14,679 --> 00:10:16,240 Vale, aquí 250 00:10:16,240 --> 00:10:18,960 Todavía no hemos guardado nada en el fichero 251 00:10:18,960 --> 00:10:20,580 ¿Cuándo vamos a guardar en el fichero? 252 00:10:21,220 --> 00:10:22,580 Cuando demos a la opción 253 00:10:22,580 --> 00:10:23,500 Salir 254 00:10:23,500 --> 00:10:27,159 Aquí se supone que es la poca persistencia 255 00:10:27,159 --> 00:10:28,059 Que tiene la aplicación 256 00:10:28,059 --> 00:10:30,500 La hace aquí, la poca que tiene 257 00:10:30,500 --> 00:10:31,480 Le damos a salir 258 00:10:31,480 --> 00:10:34,639 Y esto ya lo sabíamos 259 00:10:34,639 --> 00:10:35,019 ¿Verdad? 260 00:10:36,220 --> 00:10:39,299 Ya lo sabíamos porque se nos había olvidado 261 00:10:39,299 --> 00:10:41,779 hacer a alumno 262 00:10:41,779 --> 00:10:43,440 serializable 263 00:10:43,440 --> 00:10:45,879 elements 264 00:10:45,879 --> 00:10:49,360 serializable 265 00:10:49,360 --> 00:11:02,929 vale, aquí 266 00:11:02,929 --> 00:11:06,970 puede que haya llegado a hacer 267 00:11:06,970 --> 00:11:08,970 el fichero 268 00:11:08,970 --> 00:11:11,309 el object output string 269 00:11:11,309 --> 00:11:12,490 puede que haya llegado a hacerlo 270 00:11:12,490 --> 00:11:15,490 pero luego cuando ha intentado 271 00:11:15,490 --> 00:11:17,350 hacer el great object es cuando le ha salido 272 00:11:17,350 --> 00:11:19,370 el error, entonces ha llegado a hacerlo 273 00:11:19,370 --> 00:11:21,509 y ya ha metido cosas 274 00:11:21,509 --> 00:11:23,210 relacionadas con la cabecera 275 00:11:23,210 --> 00:11:25,450 entonces este fichero ya se ha quedado 276 00:11:25,450 --> 00:11:26,850 corrupto, porque no ha 277 00:11:26,850 --> 00:11:29,549 entonces cuando trate de recuperarse 278 00:11:29,549 --> 00:11:31,009 volvemos a arrancar la aplicación 279 00:11:31,009 --> 00:11:33,610 él verá, existe y no es cero 280 00:11:33,610 --> 00:11:35,750 pues intentará 281 00:11:35,750 --> 00:11:37,789 leer de él y va a ser un desastre 282 00:11:37,789 --> 00:11:39,029 claro 283 00:11:39,029 --> 00:11:41,990 o sea, ahora si volvemos a arrancar la aplicación 284 00:11:41,990 --> 00:11:43,730 ya al arrancarla 285 00:11:43,730 --> 00:11:45,490 esto debería dar un error de partida 286 00:11:45,490 --> 00:11:50,419 en cuanto le demos este 287 00:11:50,419 --> 00:11:52,460 nombrecito, alumnos.txt 288 00:11:52,460 --> 00:11:54,480 porque esto 289 00:11:54,480 --> 00:11:55,500 ya es, pero que 290 00:11:55,500 --> 00:11:57,779 basura me has 291 00:11:57,779 --> 00:12:00,320 pasado aquí, esto que es 292 00:12:00,320 --> 00:12:02,360 entonces, vamos 293 00:12:02,360 --> 00:12:03,860 a eliminar este fichero 294 00:12:03,860 --> 00:12:10,190 ok, vale 295 00:12:10,190 --> 00:12:17,039 entonces, esto 296 00:12:17,039 --> 00:12:18,940 funcionaría, alumnos 297 00:12:18,940 --> 00:12:21,299 ahora, vale, insertamos 298 00:12:21,299 --> 00:12:23,179 uno cualquiera, nif1 299 00:12:23,179 --> 00:12:25,100 nombre1 y nos 300 00:12:25,100 --> 00:12:26,919 vamos, vale 301 00:12:26,919 --> 00:12:27,620 adiós 302 00:12:27,620 --> 00:12:30,500 Vamos a recuperar ahora 303 00:12:30,500 --> 00:12:32,720 Vamos a arrancar la aplicación 304 00:12:32,720 --> 00:12:33,179 Otra vez 305 00:12:33,179 --> 00:12:36,220 Arrancamos la aplicación 306 00:12:36,220 --> 00:12:38,259 Venga, nombre del fichero 307 00:12:38,259 --> 00:12:39,340 Alumnos 308 00:12:39,340 --> 00:12:43,570 Vamos a ver si el alumno está 309 00:12:43,570 --> 00:12:45,429 O sea, si esta aplicación realmente tiene 310 00:12:45,429 --> 00:12:47,330 Esa pequeña persistencia 311 00:12:47,330 --> 00:12:48,970 MIF 1.1 312 00:12:48,970 --> 00:12:50,090 Pues sí 313 00:12:50,090 --> 00:12:52,110 El alumno está 314 00:12:52,110 --> 00:12:55,110 Vale, vamos a añadir otro nuevo 315 00:12:55,110 --> 00:12:57,490 1 316 00:12:57,490 --> 00:12:59,289 Alumno 2.2 317 00:12:59,289 --> 00:13:01,570 Nombre 2-2 318 00:13:01,570 --> 00:13:04,769 En el map está 319 00:13:04,769 --> 00:13:08,009 Vamos a salir ya de la aplicación 320 00:13:08,009 --> 00:13:10,590 Ahí está 321 00:13:10,590 --> 00:13:11,529 Vale 322 00:13:11,529 --> 00:13:14,269 La arrancamos otra vez 323 00:13:14,269 --> 00:13:17,750 Nombre del fichero 324 00:13:17,750 --> 00:13:18,710 Alumnos 325 00:13:18,710 --> 00:13:20,850 A ver cuántos alumnos tengo 326 00:13:20,850 --> 00:13:22,889 Ahí están 327 00:13:22,889 --> 00:13:23,509 Vale 328 00:13:23,509 --> 00:13:25,409 Con estas pruebas 329 00:13:25,409 --> 00:13:26,750 Parece que más o menos 330 00:13:26,750 --> 00:13:28,230 Funciona 331 00:13:28,230 --> 00:13:31,149 ¿significa eso que hayamos contemplado 332 00:13:31,149 --> 00:13:32,409 todos los errores? seguro que no 333 00:13:32,409 --> 00:13:35,049 si empezamos a hacer pruebas un poquito más 334 00:13:35,049 --> 00:13:36,929 la tiramos seguro 335 00:13:36,929 --> 00:13:38,470 aunque sea una aplicación de dos líneas 336 00:13:38,470 --> 00:13:40,250 la tiramos fijo 337 00:13:40,250 --> 00:13:42,809 por eso una fase de pruebas tiene que ser 338 00:13:42,809 --> 00:13:44,789 larga y concienzuda 339 00:13:44,789 --> 00:13:46,529 porque esto podrá tener 340 00:13:46,529 --> 00:13:49,370 mil casos de prueba no contemplados 341 00:13:49,370 --> 00:13:49,929 ¿vale? 342 00:13:50,590 --> 00:13:52,889 pero bueno, los arreglaríamos porque son muy listos 343 00:13:52,889 --> 00:13:53,590 y no pasa nada 344 00:13:53,590 --> 00:13:56,750 y esta aplicación nos ha metido 345 00:13:56,750 --> 00:14:03,049 Que sería lo ideal que para practicar programación a vosotros y esas cosas 346 00:14:03,049 --> 00:14:09,129 Pues hicierais por ejemplo esta funcionalidad 347 00:14:09,129 --> 00:14:14,590 Porque seguramente luego cuando lo probéis ahí si que os vais a encontrar errores 348 00:14:14,590 --> 00:14:16,250 Etcétera 349 00:14:16,250 --> 00:14:24,080 Vale, pues la funcionalidad 4 350 00:14:24,080 --> 00:14:28,179 ¿Qué haría esta funcionalidad? 351 00:14:28,179 --> 00:14:39,059 Pues esta funcionalidad tendría que solicitar un if y unos datos de módulo 352 00:14:39,059 --> 00:14:41,620 Que los datos de módulo son nombre y nota solamente 353 00:14:41,620 --> 00:14:50,230 Incorpora módulo a alumno 354 00:14:50,230 --> 00:15:02,000 Y sería lo ideal que hicierais también el 5 que es listado de módulos de un alumno 355 00:15:02,000 --> 00:15:15,320 Vale, aquí tendríamos 356 00:15:15,320 --> 00:15:18,139 El 357 00:15:18,139 --> 00:15:20,919 Caso 5 358 00:15:20,919 --> 00:15:26,019 Que es dado nif 359 00:15:26,019 --> 00:15:27,600 Listado módulos, pero vamos 360 00:15:27,600 --> 00:15:28,620 Que esto 361 00:15:28,620 --> 00:15:33,580 Esto no sería nada 362 00:15:33,580 --> 00:15:36,399 Porque esto sería 363 00:15:36,399 --> 00:15:38,480 Coger los datos y hacer 364 00:15:38,480 --> 00:15:40,659 Al get un set 365 00:15:40,659 --> 00:15:41,679 ¿Verdad? 366 00:15:42,120 --> 00:15:43,620 Al get por nif 367 00:15:43,620 --> 00:15:46,980 Eh, sacar el get 368 00:15:46,980 --> 00:15:49,220 De los módulos y hacerle el add 369 00:15:49,220 --> 00:15:50,700 De los datos 370 00:15:50,700 --> 00:16:29,139 Entonces esto lo podríamos hacer en una única línea, que fuera alumnos.get el nif que me han pasado y a este alumno yo le saco los módulos y le añado solicita datos. 371 00:16:30,139 --> 00:16:32,279 Módulo 372 00:16:32,279 --> 00:16:38,570 Método que haríais 373 00:16:38,570 --> 00:16:39,409 Aquí fuera 374 00:16:39,409 --> 00:16:45,419 Vale 375 00:16:45,419 --> 00:16:47,539 Entonces 376 00:16:47,539 --> 00:16:52,759 Se daría un NIF 377 00:16:52,759 --> 00:16:54,659 Al alumno con ese NIF 378 00:16:54,659 --> 00:16:57,200 Cogería su lista de módulos 379 00:16:57,200 --> 00:16:59,899 Y le añadiría 380 00:16:59,899 --> 00:17:01,179 El módulo 381 00:17:01,179 --> 00:17:03,100 Que devuelve el método este 382 00:17:03,100 --> 00:17:04,220 Solita datos de módulo 383 00:17:04,220 --> 00:17:06,420 que no haría nada, nada más que pido los datos 384 00:17:06,420 --> 00:17:07,000 y ya está 385 00:17:07,000 --> 00:17:09,980 aquí claro 386 00:17:09,980 --> 00:17:12,279 de nuevo forma de 387 00:17:12,279 --> 00:17:13,660 aplicación 388 00:17:13,660 --> 00:17:16,160 robustez cero 389 00:17:16,160 --> 00:17:18,380 porque si el tío me metió un 390 00:17:18,380 --> 00:17:19,400 if que no existe 391 00:17:19,400 --> 00:17:22,519 aquí me sale un pedazo de null 392 00:17:22,519 --> 00:17:24,299 entonces me sale 393 00:17:24,299 --> 00:17:25,480 un pedazo de null 394 00:17:25,480 --> 00:17:28,180 pointer exception cuando tenga 395 00:17:28,180 --> 00:17:28,940 un red módulo 396 00:17:28,940 --> 00:17:31,500 entonces aquí pues efectivamente 397 00:17:31,500 --> 00:17:33,759 si esto no es null y si es null 398 00:17:33,759 --> 00:17:35,380 Puede decir el NIF no existe 399 00:17:35,380 --> 00:17:36,900 ¿Vale? 400 00:17:37,359 --> 00:17:39,480 Aplicación, acortamos código y hacemos algo 401 00:17:39,480 --> 00:17:40,480 Lo menos robusto del mundo 402 00:17:40,480 --> 00:17:43,339 Aquí hay un pedazo de null pointer de excepción ahí metido 403 00:17:43,339 --> 00:17:44,519 Enorme 404 00:17:44,519 --> 00:17:47,500 En cuanto el usuario meta un NIF 405 00:17:47,500 --> 00:17:48,099 Que no existe 406 00:17:48,099 --> 00:17:51,539 Bueno, pues entonces 407 00:17:51,539 --> 00:17:53,819 Con esto 408 00:17:53,819 --> 00:17:55,819 Tenemos una pequeña aplicación 409 00:17:55,819 --> 00:17:58,299 Persistente que se cae por todas partes 410 00:17:58,299 --> 00:18:00,099 Primero 411 00:18:00,099 --> 00:18:02,000 La hemos hecho 412 00:18:02,000 --> 00:18:03,460 Más cómoda imposible 413 00:18:03,460 --> 00:18:06,619 todos los objetos, pum, todos al map 414 00:18:06,619 --> 00:18:08,980 al arrancar, y si tengo un instituto 415 00:18:08,980 --> 00:18:10,400 de 100.000 alumnos 416 00:18:10,400 --> 00:18:12,740 pues un map de 100.000 417 00:18:12,740 --> 00:18:13,859 pues no 418 00:18:13,859 --> 00:18:16,900 muy mal eso, eso para empezar 419 00:18:16,900 --> 00:18:18,859 y luego ya 420 00:18:18,859 --> 00:18:19,920 salvando eso 421 00:18:19,920 --> 00:18:21,900 ¿qué diseño es este? 422 00:18:22,400 --> 00:18:23,859 estamos mezclando vista 423 00:18:23,859 --> 00:18:26,700 la vista es el menú con el switch 424 00:18:26,700 --> 00:18:28,720 con la lógica 425 00:18:28,720 --> 00:18:30,500 tenemos ahí los métodos 426 00:18:30,500 --> 00:18:32,380 que por lo menos nos hemos dignado 427 00:18:32,380 --> 00:18:34,740 a sacarlos fuera del main 428 00:18:34,740 --> 00:18:36,180 pero es lo más a lo que hemos llegado 429 00:18:36,180 --> 00:18:38,680 a sacarlos fuera del main, pero es que están aquí mismo 430 00:18:38,680 --> 00:18:40,680 que es un desastre 431 00:18:40,680 --> 00:18:42,140 es que de hecho 432 00:18:42,140 --> 00:18:44,119 algunos ni los hemos sacado, o sea, aquí estamos 433 00:18:44,119 --> 00:18:46,440 con la lógica de la aplicación 434 00:18:46,440 --> 00:18:48,519 no la lógica de negocio, la lógica de la aplicación 435 00:18:48,519 --> 00:18:50,359 aquí metida, y menos mal 436 00:18:50,359 --> 00:18:52,099 que al menos hemos sacado una entidad fuera 437 00:18:52,099 --> 00:18:54,720 pero vamos, que esta es una aplicación 438 00:18:54,720 --> 00:18:55,720 que se cae por todos lados 439 00:18:55,720 --> 00:18:57,019 entonces 440 00:18:57,019 --> 00:18:59,259 aún así 441 00:18:59,259 --> 00:19:02,319 podría ser una aplicación que tú se la das 442 00:19:02,319 --> 00:19:04,359 un usuario y el usuario la usa 443 00:19:04,359 --> 00:19:06,579 durante los 25 años restantes 444 00:19:06,579 --> 00:19:08,440 de su vida sin tener ningún 445 00:19:08,440 --> 00:19:09,859 problema y sin que le pase nada 446 00:19:09,859 --> 00:19:11,460 pero ¿qué pasa? 447 00:19:11,880 --> 00:19:13,759 si en algún momento de esos 25 años 448 00:19:13,759 --> 00:19:15,720 ese cliente 449 00:19:15,720 --> 00:19:18,599 necesita añadirle una funcionalidad 450 00:19:18,599 --> 00:19:19,880 a esa aplicación 451 00:19:19,880 --> 00:19:22,119 y te la devuelve 452 00:19:22,119 --> 00:19:24,359 a los 10 años, oye añádenme esta pequeña 453 00:19:24,359 --> 00:19:25,779 funcionalidad, ah sí, sí, sí 454 00:19:25,779 --> 00:19:28,519 tú la abres 10 años después 455 00:19:28,519 --> 00:19:32,119 no entiendes nada, eso es un desastre 456 00:19:32,119 --> 00:19:34,420 el trabajador que te la hizo 457 00:19:34,420 --> 00:19:36,259 ya lo has echado, lógicamente 458 00:19:36,259 --> 00:19:38,240 porque si no hubieras tenido que subir 459 00:19:38,240 --> 00:19:40,119 el sueldo demasiado en 10 años, lo has echado 460 00:19:40,119 --> 00:19:42,720 y has cogido a uno de prácticas 461 00:19:42,720 --> 00:19:44,359 que le estás pagando 462 00:19:44,359 --> 00:19:46,240 una mierda y le sueltas esto 463 00:19:46,240 --> 00:19:48,299 que está fatal hecho 10 años después 464 00:19:48,299 --> 00:19:50,200 se vuelve loco 465 00:19:50,200 --> 00:19:52,440 y dice, pero cómo voy a añadir yo una funcionalidad 466 00:19:52,440 --> 00:19:54,079 nueva en esto que está hecho un desastre 467 00:19:54,079 --> 00:19:56,440 la tiro a la basura y la hago de nuevas 468 00:19:56,440 --> 00:19:58,339 con lo cual va a tardar 469 00:19:58,339 --> 00:20:00,240 mucho tiempo, al jefe 470 00:20:00,240 --> 00:20:01,980 tampoco le va a gustar que tarde tanto 471 00:20:01,980 --> 00:20:03,519 y también le va a echar. 472 00:20:04,880 --> 00:20:05,660 Entonces, ¿cómo? 473 00:20:07,759 --> 00:20:09,519 Sí, ahora las cosas han cambiado 474 00:20:09,519 --> 00:20:11,200 porque ahora tienes al esclavo. 475 00:20:11,880 --> 00:20:14,920 Pero claro, el jefe sabe que tienes al char GPT 476 00:20:14,920 --> 00:20:17,099 con lo cual va a esperar que lo hagas todo 477 00:20:17,099 --> 00:20:18,339 muchísimo más rápido. 478 00:20:19,079 --> 00:20:21,839 En cualquier caso, si partes de una aplicación de partida 479 00:20:21,839 --> 00:20:23,859 bien diseñada y estructurada 480 00:20:23,859 --> 00:20:25,319 lo vas a tener más fácil 481 00:20:25,319 --> 00:20:27,880 para incorporar cualquier cosa nueva. 482 00:20:27,880 --> 00:20:45,740 Bueno, pues en una aplicación que usa persistencia de datos, lo natural es que usemos un patrón de diseño de datos, perdón, un patrón de diseño, que es este patrón de aquí, ¿vale? 483 00:20:45,740 --> 00:20:48,339 sería lo natural 484 00:20:48,339 --> 00:20:51,119 que ya de partida incorporáramos esto 485 00:20:51,119 --> 00:20:53,200 que es el patrón 486 00:20:53,200 --> 00:20:54,079 de data 487 00:20:54,079 --> 00:20:56,980 access 488 00:20:56,980 --> 00:21:03,710 de 489 00:21:03,710 --> 00:21:05,630 llegamos al object 490 00:21:05,630 --> 00:21:07,170 que lo juro 491 00:21:07,170 --> 00:21:09,390 menos que la O sea 492 00:21:09,390 --> 00:21:13,759 sí, no, es que de repente 493 00:21:13,759 --> 00:21:15,859 como que me ha venido un vacío a la mente 494 00:21:15,859 --> 00:21:17,700 y me sonaba fatal 495 00:21:17,700 --> 00:21:20,119 me sonaba fatal 496 00:21:20,119 --> 00:21:21,000 pero no, es eso 497 00:21:21,000 --> 00:21:22,759 Pero me ha venido como una laguna 498 00:21:22,759 --> 00:21:24,359 Y yo, mal me suena 499 00:21:24,359 --> 00:21:25,400 Pero no, no, es así 500 00:21:25,400 --> 00:21:28,200 Vale, como nunca jamás 501 00:21:28,200 --> 00:21:29,880 Uno lo deletrea, siempre dice 502 00:21:29,880 --> 00:21:30,900 Sin más 503 00:21:30,900 --> 00:21:33,539 Vale, entonces 504 00:21:33,539 --> 00:21:35,700 Esto es un patroncito chorra, sin más 505 00:21:35,700 --> 00:21:37,440 Es una forma de organizar las cosas 506 00:21:37,440 --> 00:21:39,359 En una aplicación que usa persistencia 507 00:21:39,359 --> 00:21:42,200 ¿Significa eso que si una aplicación 508 00:21:42,200 --> 00:21:44,440 Sigue el patrón, ya no pueda seguir ningún otro? 509 00:21:44,559 --> 00:21:45,759 No, cada patrón 510 00:21:45,759 --> 00:21:48,359 Se ocupa de organizar 511 00:21:48,359 --> 00:21:50,220 Cuestiones diferentes 512 00:21:50,220 --> 00:21:58,319 desde la aplicación. Este patrón se ocupa de organizar la parte de hacer persistencia 513 00:21:58,319 --> 00:22:09,049 de los datos. Es decir, el CRUD, de esto se ocupa. ¿Y qué es el CRUD? Pues ya sabemos 514 00:22:09,049 --> 00:22:20,289 que es crear datos, consultar datos, actualizar datos y borrar datos. Porque esto es lo que 515 00:22:20,289 --> 00:22:22,549 con los datos. Eso es lo que 516 00:22:22,549 --> 00:22:24,430 hacemos con los datos. No hacemos más que esto. 517 00:22:25,890 --> 00:22:26,970 Pues este patrón 518 00:22:26,970 --> 00:22:28,670 trata de 519 00:22:28,670 --> 00:22:30,349 separar 520 00:22:30,349 --> 00:22:32,170 estas funciones, 521 00:22:32,970 --> 00:22:34,710 separarlas, y luego 522 00:22:34,710 --> 00:22:36,769 tú ya las usas desde tu aplicación, 523 00:22:37,029 --> 00:22:38,829 pero estás absolutamente abstraído 524 00:22:38,829 --> 00:22:40,730 de la parte de la 525 00:22:40,730 --> 00:22:41,849 persistencia que es esa. 526 00:22:42,490 --> 00:22:43,910 Estás absolutamente abstraído. 527 00:22:43,910 --> 00:22:45,970 En esta aplicación no lo estábamos. 528 00:22:46,710 --> 00:22:47,470 Tenemos... 529 00:22:47,470 --> 00:22:54,509 En esta aplicación no estamos 530 00:22:54,509 --> 00:22:56,450 abstraídos porque 531 00:22:56,450 --> 00:22:58,109 tenemos aquí metido el fichero 532 00:22:58,109 --> 00:23:00,190 que yo de repente 533 00:23:00,190 --> 00:23:02,210 cambio y ya esta aplicación 534 00:23:02,210 --> 00:23:04,269 el usuario me ha dicho, el cliente 535 00:23:04,269 --> 00:23:06,670 es que ya no son 20 alumnos 536 00:23:06,670 --> 00:23:08,230 de repente he pasado a 20.000 537 00:23:08,230 --> 00:23:10,410 por favor, cámbiame 538 00:23:10,410 --> 00:23:12,349 la aplicación, tú tienes que moverla a una base 539 00:23:12,349 --> 00:23:14,630 de datos, con la aplicación 540 00:23:14,630 --> 00:23:16,430 hecha así, mover a una base de datos 541 00:23:16,430 --> 00:23:17,849 implica hacer mil cambios 542 00:23:17,849 --> 00:23:20,630 Con una aplicación hecha con un patrón DAO 543 00:23:20,630 --> 00:23:22,470 Mover a una base de datos 544 00:23:22,470 --> 00:23:23,930 Todo esto significa 545 00:23:23,930 --> 00:23:25,569 No tocar la aplicación 546 00:23:25,569 --> 00:23:27,089 Solamente tocar 547 00:23:27,089 --> 00:23:29,609 Unas clasecitas que están ahí aparcadas 548 00:23:29,609 --> 00:23:30,609 Solo tocar esas 549 00:23:30,609 --> 00:23:32,509 Tu aplicación no se entera 550 00:23:32,509 --> 00:23:34,849 Aquí esta aplicación se entera de principio a fin 551 00:23:34,849 --> 00:23:36,529 Si yo tengo que cambiar una base de datos 552 00:23:36,529 --> 00:23:37,670 ¿Vale? 553 00:23:39,670 --> 00:23:41,029 Bueno, pues entonces 554 00:23:41,029 --> 00:23:43,589 Versión 2 555 00:23:50,380 --> 00:23:55,880 que sí, que sí, tranquilos 556 00:23:55,880 --> 00:23:58,000 pero bueno, podemos escribir la clase 557 00:23:58,000 --> 00:23:59,200 ¿no? bueno, espera, espera 558 00:23:59,200 --> 00:24:01,900 versión, bueno, voy a hacer la clase 559 00:24:01,900 --> 00:24:03,220 la aplicación 560 00:24:03,220 --> 00:24:06,000 a ver, gestión alumnos 561 00:24:06,000 --> 00:24:07,420 versión 2 562 00:24:07,420 --> 00:24:09,200 esta sería la main 563 00:24:09,200 --> 00:24:11,400 pero la main se va a apoyar en otras 564 00:24:11,400 --> 00:24:12,259 ¿vale? 565 00:24:13,819 --> 00:24:15,980 vale, aquí vamos a 566 00:24:15,980 --> 00:24:17,660 hacer nuestra nueva aplicación 567 00:24:17,660 --> 00:24:19,839 esta aplicación 568 00:24:19,839 --> 00:24:22,519 ya no lo va a tener aquí todo dentro 569 00:24:22,519 --> 00:24:24,680 tendrá aquí 570 00:24:24,680 --> 00:24:26,720 idealmente 571 00:24:26,720 --> 00:24:28,079 la parte de la vista 572 00:24:28,079 --> 00:24:29,759 ¿vale? 573 00:24:30,140 --> 00:24:32,819 pero la parte de acceso a datos 574 00:24:32,819 --> 00:24:34,160 la sacamos fuera 575 00:24:34,160 --> 00:24:38,190 ¿vale? venga pues vamos a 576 00:24:38,190 --> 00:24:42,200 a dejarlo aquí 577 00:24:42,200 --> 00:24:43,559 vale