1 00:00:00,050 --> 00:00:05,469 vale, pues vamos a hacer 2 00:00:05,469 --> 00:00:07,349 una pequeña aplicacioncilla 3 00:00:07,349 --> 00:00:08,029 hoy para 4 00:00:08,029 --> 00:00:10,730 cerrar ya este tema de 5 00:00:10,730 --> 00:00:13,210 persistencia de objetos 6 00:00:13,210 --> 00:00:14,810 con object output stream 7 00:00:14,810 --> 00:00:18,070 y object input stream 8 00:00:18,070 --> 00:00:19,410 vale, pues haciendo 9 00:00:19,410 --> 00:00:21,269 otra aplicación más, dándole otra 10 00:00:21,269 --> 00:00:23,129 estructura, otro diseño 11 00:00:23,129 --> 00:00:24,850 un diseño un poquito más 12 00:00:24,850 --> 00:00:26,609 más profesional 13 00:00:26,609 --> 00:00:29,309 vale, y usando 14 00:00:29,309 --> 00:00:31,309 los ficheros de objetos 15 00:00:31,309 --> 00:00:33,549 como si fueran tablas 16 00:00:33,549 --> 00:00:34,590 de bases de datos 17 00:00:34,590 --> 00:00:39,820 ¿vale? es decir 18 00:00:39,820 --> 00:00:41,079 nosotros normalmente 19 00:00:41,079 --> 00:00:44,100 nuestras aplicaciones 20 00:00:44,100 --> 00:00:46,039 cuando sean persistentes que este año 21 00:00:46,039 --> 00:00:47,719 pues no lo son salvo por esto de 22 00:00:47,719 --> 00:00:49,899 de los ficheros 23 00:00:49,899 --> 00:00:55,420 vale pues 24 00:00:55,420 --> 00:01:04,079 vale pues nosotros 25 00:01:04,079 --> 00:01:16,290 vale pues 26 00:01:16,290 --> 00:01:17,909 normalmente una aplicación 27 00:01:17,909 --> 00:01:33,819 vale esto 28 00:01:33,819 --> 00:01:35,980 es mi aplicación Java que hace las cosas 29 00:01:35,980 --> 00:01:37,840 ¿vale? aquí está 30 00:01:37,840 --> 00:01:39,079 el usuario 31 00:01:39,079 --> 00:01:45,599 aquí está la vista de la aplicación 32 00:01:45,599 --> 00:01:47,200 ¿vale? nosotros 33 00:01:47,200 --> 00:01:48,239 estamos haciendo 34 00:01:48,239 --> 00:01:52,939 la vista de la aplicación, lo que el 35 00:01:52,939 --> 00:01:54,579 usuario ve cuando accede a ella 36 00:01:54,579 --> 00:01:57,000 nosotros la estamos haciendo ahora mismo 37 00:01:57,000 --> 00:01:58,280 con consola 38 00:01:58,280 --> 00:02:00,959 System.out para mostrarle mensajes 39 00:02:00,959 --> 00:02:01,739 al usuario 40 00:02:01,739 --> 00:02:05,060 y leyendo lo que él nos 41 00:02:05,060 --> 00:02:07,040 diga, leyéndolo con el escáner 42 00:02:07,040 --> 00:02:08,379 ¿vale? esa es nuestra vista 43 00:02:08,379 --> 00:02:12,159 ¿Vale? Pero esta vista podría estar programada de otra manera 44 00:02:12,159 --> 00:02:14,560 Podría ser un HTML con Javascript 45 00:02:14,560 --> 00:02:18,860 Bueno, podría ser con JavaFX, con Swin 46 00:02:18,860 --> 00:02:21,680 Es decir, esta vista podría estar programada de otra manera 47 00:02:21,680 --> 00:02:24,479 Para nosotros es simplemente System.out 48 00:02:24,479 --> 00:02:25,659 Para mostrarle mensajes 49 00:02:25,659 --> 00:02:27,759 Y el escáner para ver la información 50 00:02:27,759 --> 00:02:29,159 ¿Vale? 51 00:02:29,680 --> 00:02:32,479 Esta vista, que es la parte de la aplicación 52 00:02:32,479 --> 00:02:36,039 Que se ocupa de comunicarse con el usuario 53 00:02:36,039 --> 00:02:38,460 esta vista lógicamente llamará 54 00:02:38,460 --> 00:02:39,939 métodos de mi aplicación 55 00:02:39,939 --> 00:02:42,620 esos métodos de mi aplicación 56 00:02:42,620 --> 00:02:44,080 pues ya son los que hacen las cosas 57 00:02:44,080 --> 00:02:46,199 esta es 58 00:02:46,199 --> 00:02:48,139 la lógica de mi aplicación 59 00:02:48,139 --> 00:02:50,620 y esto ya se puede organizar de muchas maneras 60 00:02:50,620 --> 00:02:52,520 aquí ya es donde viene un diseño de clases 61 00:02:52,520 --> 00:02:54,199 con las entidades del modelo 62 00:02:54,199 --> 00:02:56,659 donde meto los métodos 63 00:02:56,659 --> 00:02:57,840 pues bueno, pues depende 64 00:02:57,840 --> 00:03:00,419 las propias clases o métodos estáticos 65 00:03:00,419 --> 00:03:01,580 en un método aparte 66 00:03:01,580 --> 00:03:04,939 aquí ya mi diseño de clases ya será el que sea 67 00:03:04,939 --> 00:03:05,740 ¿vale? 68 00:03:06,039 --> 00:03:23,219 Lo mejor estudiado posible para que la aplicación se pueda luego ir ampliando, lógicamente. Si mi diseño fuera un programa enorme, pues esa aplicación no se podría ir ampliando, no se le podrían ir corrigiendo posibles errores que salieran a posteriori, sería un desastre. 69 00:03:23,219 --> 00:03:45,439 Entonces, este diseño de clases tiene que estar lo más estudiado posible, ¿vale? Como mínimo, siempre tendrá que haber un buen modelo, un buen modelo de alumno, matrícula, no sé qué, y luego ya, ¿dónde meto yo las operaciones? Bueno, una clase aparte, en las propias entidades, depende. 70 00:03:45,439 --> 00:03:47,500 En cualquier caso 71 00:03:47,500 --> 00:03:49,740 Estos métodos y todo esto 72 00:03:49,740 --> 00:03:51,539 Lo que haga, lógicamente 73 00:03:51,539 --> 00:03:53,840 Trabajará con datos y como hemos 74 00:03:53,840 --> 00:03:55,039 Dicho estos días 75 00:03:55,039 --> 00:03:56,860 Nuestros datos hasta ahora 76 00:03:56,860 --> 00:03:59,719 Los cargábamos de nuevas 77 00:03:59,719 --> 00:04:01,680 Limpios cada vez que los íbamos pidiendo 78 00:04:01,680 --> 00:04:03,360 Al usuario y esos datos 79 00:04:03,360 --> 00:04:05,340 Lógicamente están aquí en la memoria RAM 80 00:04:05,340 --> 00:04:08,039 ¿Vale? En la memoria RAM 81 00:04:08,039 --> 00:04:09,439 Pues están 82 00:04:09,439 --> 00:04:11,680 Los datos en los que la aplicación 83 00:04:11,680 --> 00:04:13,599 Trabaja y en donde va a estar 84 00:04:13,599 --> 00:04:15,120 Pues en colecciones, en variables 85 00:04:15,120 --> 00:04:17,980 ¿Vale? Aquí están nuestras variables 86 00:04:17,980 --> 00:04:19,439 Nuestras colecciones de datos 87 00:04:19,439 --> 00:04:28,649 ¿Vale? Entonces 88 00:04:28,649 --> 00:04:30,970 Cuando esta aplicación 89 00:04:30,970 --> 00:04:33,509 Se cierra, estos datos se van 90 00:04:33,509 --> 00:04:35,810 Que es lo que hemos estado diciendo estos días 91 00:04:35,810 --> 00:04:37,550 Y ese sería el funcionamiento 92 00:04:37,550 --> 00:04:39,329 De una aplicación no persistente 93 00:04:39,329 --> 00:04:41,290 ¿Vale? 94 00:04:41,329 --> 00:04:43,350 Entonces si queremos que la aplicación 95 00:04:43,350 --> 00:04:45,750 Ahora se convierta en una aplicación 96 00:04:45,750 --> 00:04:46,870 Con persistencia 97 00:04:46,870 --> 00:04:49,509 Este esquema pues se tiene 98 00:04:49,509 --> 00:04:50,129 Que ampliar 99 00:04:50,129 --> 00:04:53,769 si queremos que la aplicación se convierta 100 00:04:53,769 --> 00:04:55,850 en una aplicación persistente 101 00:04:55,850 --> 00:04:57,269 con datos persistentes 102 00:04:57,269 --> 00:04:58,850 este esquema se tiene que ampliar 103 00:04:58,850 --> 00:05:01,089 se tiene que ampliar porque aparece 104 00:05:01,089 --> 00:05:03,250 pues un almacén de datos 105 00:05:03,250 --> 00:05:05,529 persistentes que normalmente 106 00:05:05,529 --> 00:05:07,629 es una base 107 00:05:07,629 --> 00:05:09,389 de datos con sus tablitas 108 00:05:09,389 --> 00:05:11,949 ¿vale? normalmente sus tablitas 109 00:05:11,949 --> 00:05:13,269 etcétera ¿vale? 110 00:05:13,370 --> 00:05:15,410 estoy un poco recopilando 111 00:05:15,410 --> 00:05:16,290 lo que me he hecho estos días 112 00:05:16,290 --> 00:05:19,750 entonces mi aplicación 113 00:05:19,750 --> 00:05:21,649 tiene que comunicarse con esta base 114 00:05:21,649 --> 00:05:23,470 de datos, no hay otra, los métodos de esta 115 00:05:23,470 --> 00:05:25,470 aplicación tienen que 116 00:05:25,470 --> 00:05:26,889 comunicarse con la base de datos 117 00:05:26,889 --> 00:05:29,310 entonces pues para eso 118 00:05:29,310 --> 00:05:31,430 hay toda una serie de historias 119 00:05:31,430 --> 00:05:33,550 que ya veremos en particular el año 120 00:05:33,550 --> 00:05:35,430 que viene, lo que nos importa a nosotros 121 00:05:35,430 --> 00:05:37,029 ahora mismo es que esta parte 122 00:05:37,029 --> 00:05:39,389 esta parte hay que programarla 123 00:05:39,389 --> 00:05:41,550 también, esta parte 124 00:05:41,550 --> 00:05:42,509 hay que programarla 125 00:05:42,509 --> 00:05:47,680 entonces eso serán 126 00:05:47,680 --> 00:05:48,879 unas clases entre 127 00:05:48,879 --> 00:05:50,779 si hacemos un buen diseño 128 00:05:50,779 --> 00:06:19,379 Eso serán unas clases aparte aquí, unas clases aparte que se ocupan exclusivamente del acceso a datos. Entonces, esas clases se ocupan exclusivamente de comunicarse con la base de datos. Y ya digo, comunicarse con la base de datos no es trivial, ¿vale? No es trivial comunicarse con la base de datos. Ya lo resolveremos, ¿vale? 129 00:06:19,379 --> 00:06:33,120 Entonces, estas clases se comunican con la base de datos de esa manera, no trivial, que hay que programar bien y ofrecen su comportamiento, ofrecen sus métodos a la lógica de mi aplicación. 130 00:06:33,459 --> 00:06:43,980 Y este ya que quiere insertar un objeto, pues llama a este y este ya lo inserta. Que quiere recuperar un objeto, pues llama a este y este ya lo recupera. 131 00:06:43,980 --> 00:07:01,939 ¿Vale? Y a través de estas clases que están ahí en medio, a través de estas clases, la información de esta base de datos, pues va llegando a estas colecciones. Va llegando y va saliendo. ¿Vale? A través de estas clases intermedias. Va llegando y saliendo. ¿Vale? 132 00:07:01,939 --> 00:07:05,139 entonces en nuestro caso 133 00:07:05,139 --> 00:07:07,240 podemos hacer esto mismo 134 00:07:07,240 --> 00:07:08,759 podemos simular esto 135 00:07:08,759 --> 00:07:11,180 quitando la base de datos y poniendo 136 00:07:11,180 --> 00:07:12,339 ficheros, ya está 137 00:07:12,339 --> 00:07:15,680 podemos simular este comportamiento 138 00:07:15,680 --> 00:07:17,319 en lugar de con base 139 00:07:17,319 --> 00:07:17,980 de datos 140 00:07:17,980 --> 00:07:20,819 pues cambiando esto 141 00:07:20,819 --> 00:07:22,680 por ficheros 142 00:07:22,680 --> 00:07:25,199 y ya está, entonces nosotros 143 00:07:25,199 --> 00:07:26,759 tenemos ahí nuestros ficheros 144 00:07:26,759 --> 00:07:34,079 donde están los datos, a lo mejor en alguno 145 00:07:34,079 --> 00:07:35,220 tengo los alumnos 146 00:07:35,220 --> 00:07:37,420 en otro tengo las matrículas 147 00:07:37,420 --> 00:07:38,720 en otro tengo pues lo que sea 148 00:07:38,720 --> 00:07:41,139 lo podemos simular con ficheros 149 00:07:41,139 --> 00:07:43,300 entonces mi aplicación 150 00:07:43,300 --> 00:07:45,139 va a trabajar con objetos como siempre 151 00:07:45,139 --> 00:07:47,079 bueno pues entonces 152 00:07:47,079 --> 00:07:48,839 estas clases de aquí 153 00:07:48,839 --> 00:07:51,379 lo que tendrán es que acceder a los ficheros 154 00:07:51,379 --> 00:07:53,500 para guardar los objetos, recuperarlos 155 00:07:53,500 --> 00:07:55,139 bueno y que clases son 156 00:07:55,139 --> 00:07:56,800 las que usamos para eso 157 00:07:56,800 --> 00:07:58,339 pues las que vimos ayer 158 00:07:58,339 --> 00:08:00,620 object input stream 159 00:08:00,620 --> 00:08:03,300 para leer objetos 160 00:08:03,300 --> 00:08:10,360 y object output string para escribirlos. 161 00:08:10,819 --> 00:08:13,800 Ya está, podemos simular el acceso a la base de datos 162 00:08:13,800 --> 00:08:15,579 como si fuera una base de datos con estas clases. 163 00:08:17,160 --> 00:08:17,339 ¿Vale? 164 00:08:20,680 --> 00:08:23,720 Bueno, asumido este esquema, 165 00:08:24,459 --> 00:08:27,339 tendríamos en realidad dos formas de plantear la aplicación. 166 00:08:28,839 --> 00:08:32,440 Una, voy a estar yo cada vez que tenga que recuperar 167 00:08:32,440 --> 00:08:36,179 un alumno por DNI o insertar una matrícula, 168 00:08:36,240 --> 00:08:38,539 voy a estar yo todo el rato teniendo que llamar 169 00:08:38,539 --> 00:08:40,419 a los métodos de esta clase 170 00:08:40,419 --> 00:08:42,340 y esta clase accediendo 171 00:08:42,340 --> 00:08:42,960 al fichero? 172 00:08:44,000 --> 00:08:46,340 No tengo por qué. A ver, eso es pesado, 173 00:08:46,480 --> 00:08:48,419 es costoso. Es lo que haríamos si esto 174 00:08:48,419 --> 00:08:50,340 fuera una base de datos. Es lo que 175 00:08:50,340 --> 00:08:52,279 haríamos. Cada vez que yo quiera algo en la base de datos, 176 00:08:53,039 --> 00:08:54,500 lo recupero. Cuando quiera guardar 177 00:08:54,500 --> 00:08:55,360 algo, lo mando. 178 00:08:56,460 --> 00:08:58,080 Pues aquí, cada vez que yo quiera 179 00:08:58,080 --> 00:09:00,179 recuperar un alumno o 180 00:09:00,179 --> 00:09:01,919 modificar un alumno dado su DNI, 181 00:09:02,759 --> 00:09:04,240 voy a tener que estar todo el rato 182 00:09:04,240 --> 00:09:06,279 para cada una de esas acciones, llamando 183 00:09:06,279 --> 00:09:08,179 a esta clase y esta clase comunicándose. 184 00:09:08,539 --> 00:09:10,860 no tendría por qué 185 00:09:10,860 --> 00:09:12,820 si lo que hago es 186 00:09:12,820 --> 00:09:15,019 lo que hicimos ayer 187 00:09:15,019 --> 00:09:16,799 en la aplicación de ayer que es 188 00:09:16,799 --> 00:09:18,740 cuando la aplicación arranca 189 00:09:18,740 --> 00:09:21,080 lo primero que hace la aplicación es mover 190 00:09:21,080 --> 00:09:22,019 todo esto 191 00:09:22,019 --> 00:09:25,700 a las colecciones que se adapten 192 00:09:25,700 --> 00:09:27,220 lo mueve todo 193 00:09:27,220 --> 00:09:29,399 y ahí está ya la colección 194 00:09:29,399 --> 00:09:31,500 con los datos, con lo cual a partir de ahí 195 00:09:31,500 --> 00:09:34,240 esto ya no pinta nada 196 00:09:34,240 --> 00:09:36,179 toda la lógica 197 00:09:36,179 --> 00:09:37,179 de la aplicación 198 00:09:37,179 --> 00:09:39,320 de recuperar alumnos 199 00:09:39,320 --> 00:09:41,460 insertar, modificar, toda la lógica 200 00:09:41,460 --> 00:09:43,299 se hace con la colección 201 00:09:43,299 --> 00:09:45,779 ahí ya me da igual que haya fichero o no 202 00:09:45,779 --> 00:09:47,440 cuando la aplicación 203 00:09:47,440 --> 00:09:48,899 termine, antes de terminar 204 00:09:48,899 --> 00:09:51,279 o cuando yo le dé a la acción 205 00:09:51,279 --> 00:09:53,059 correspondiente de guardar, si tengo 206 00:09:53,059 --> 00:09:54,600 habilitado el botón de guardar 207 00:09:54,600 --> 00:09:57,059 pues todo esto, pum, se va aquí 208 00:09:57,059 --> 00:09:59,259 ¿vale? luego el acceso 209 00:09:59,259 --> 00:10:01,240 al fichero se va a reducir a dos momentos 210 00:10:01,240 --> 00:10:02,620 cuando la aplicación arranca 211 00:10:02,620 --> 00:10:04,519 todo esto se vuelca aquí 212 00:10:04,519 --> 00:10:06,419 y a partir de ahí ya no hay ficheros 213 00:10:06,419 --> 00:10:09,100 hay acciones lógicas con las colecciones 214 00:10:09,100 --> 00:10:10,539 y al momento de terminar 215 00:10:10,539 --> 00:10:11,620 de todo lo que hay aquí 216 00:10:11,620 --> 00:10:14,919 se vuelca los ficheros y ya está 217 00:10:14,919 --> 00:10:16,679 entonces 218 00:10:16,679 --> 00:10:19,200 con ficheros es el planteamiento más sencillo 219 00:10:19,200 --> 00:10:19,720 en realidad 220 00:10:19,720 --> 00:10:23,320 solo tiene una pega 221 00:10:23,320 --> 00:10:24,500 que es 222 00:10:24,500 --> 00:10:27,279 si la información es gigantesca 223 00:10:27,279 --> 00:10:29,440 si la información es gigantesca 224 00:10:29,440 --> 00:10:31,399 no la volcamos en una RAM 225 00:10:31,399 --> 00:10:33,279 lo que pasa es que cuando la información 226 00:10:33,279 --> 00:10:34,240 es gigantesca 227 00:10:34,240 --> 00:10:36,860 está en bases de datos, no está en ficheros. 228 00:10:40,159 --> 00:10:43,639 Todo lo demás, salvo que la información gigantesca 229 00:10:43,639 --> 00:10:44,919 se queda ahí en RAM ocupando, 230 00:10:45,019 --> 00:10:46,200 todo lo demás son ventajas. 231 00:10:46,620 --> 00:10:49,700 Es mucho más rápido operar directamente con la RAM 232 00:10:49,700 --> 00:10:51,220 para insertar, para hacer lo que sea, 233 00:10:51,320 --> 00:10:53,279 mucho más rápido que cada vez que tenemos que hacer algo 234 00:10:53,279 --> 00:10:54,980 ir al fichero, lógicamente. 235 00:10:55,480 --> 00:10:56,980 Mucho más rápido directamente aquí. 236 00:11:04,700 --> 00:11:07,740 Entonces, nosotros, aunque nuestras situaciones, 237 00:11:07,740 --> 00:11:10,019 que no son millones de millones de datos, 238 00:11:10,019 --> 00:11:13,159 nuestras situaciones se prestarían 239 00:11:13,159 --> 00:11:15,080 a que trabajáramos como ayer 240 00:11:15,080 --> 00:11:17,279 que es cuando la aplicación arranca 241 00:11:17,279 --> 00:11:19,240 leo todos mis alumnos 242 00:11:19,240 --> 00:11:21,019 o lo que fuera que teníamos en el fichero que no me acuerdo 243 00:11:21,019 --> 00:11:23,039 los leo, ya en la colección 244 00:11:23,039 --> 00:11:25,259 hago lo que sea 245 00:11:25,259 --> 00:11:27,220 y luego antes de irme los guardo 246 00:11:27,220 --> 00:11:29,019 aunque en nuestras situaciones reales 247 00:11:29,019 --> 00:11:31,419 se prestarían así, porque tenemos millones de datos 248 00:11:31,419 --> 00:11:33,340 vamos a hacer 249 00:11:33,340 --> 00:11:34,799 ahora esta otra aplicación 250 00:11:34,799 --> 00:11:36,659 con esta otra arquitectura 251 00:11:36,659 --> 00:11:39,080 que es la arquitectura real, porque es la que se 252 00:11:39,080 --> 00:11:40,840 usaría si tuviéramos una base de datos 253 00:11:40,840 --> 00:11:42,259 que es 254 00:11:42,259 --> 00:11:44,720 unas clases 255 00:11:44,720 --> 00:11:47,120 específicas para acceso a datos que te 256 00:11:47,120 --> 00:11:49,399 ofrecen los métodos de insertar 257 00:11:49,399 --> 00:11:51,279 objeto, recuperar, modificar 258 00:11:51,279 --> 00:11:53,240 los que sea y cada vez que tú quieres 259 00:11:53,240 --> 00:11:55,259 hacer algo, llamas a 260 00:11:55,259 --> 00:11:57,279 eso y eso te lo hace en el fichero directamente 261 00:11:57,279 --> 00:11:58,899 entonces el fichero está actualizado 262 00:11:58,899 --> 00:11:59,799 todo el rato 263 00:11:59,799 --> 00:12:02,659 de la otra manera 264 00:12:02,659 --> 00:12:05,139 el fichero solo se queda actualizado 265 00:12:05,139 --> 00:12:06,500 cuando la aplicación termina 266 00:12:06,500 --> 00:12:07,919 ¿vale? 267 00:12:09,080 --> 00:12:11,539 Venga, vamos a plantear una aplicación así 268 00:12:11,539 --> 00:12:15,080 Con clases de acceso a datos 269 00:12:15,080 --> 00:12:17,120 Y cada vez que queremos hacer una acción con los datos 270 00:12:17,120 --> 00:12:19,240 Hacerla directamente con el fichero 271 00:12:19,240 --> 00:12:21,320 No hacerla con la colección 272 00:12:21,320 --> 00:12:23,259 Porque hemos volcado previamente todo 273 00:12:23,259 --> 00:12:27,240 ¿Vale? Y así tenemos una arquitectura más real 274 00:12:27,240 --> 00:12:27,919 Como si fuera 275 00:12:27,919 --> 00:12:30,120 Acceder a una base de datos 276 00:12:30,120 --> 00:12:31,759 Que no es una base de datos, es un fichero 277 00:12:31,759 --> 00:12:33,000 Pero la arquitectura va a ser la misma 278 00:12:33,000 --> 00:12:33,820 Que aproveche 279 00:12:33,820 --> 00:12:36,340 Uno y no más 280 00:12:36,340 --> 00:12:39,669 Ah, que es un caramelo 281 00:12:39,669 --> 00:12:41,370 Bueno, se tolera 282 00:12:41,370 --> 00:12:46,029 ¿Vale? Entonces, bueno, pues a ver 283 00:12:46,029 --> 00:12:50,110 ¿Qué os apetece gestionar? 284 00:12:52,429 --> 00:12:54,570 Porque yo no tengo imaginación ya 285 00:12:54,570 --> 00:12:56,210 Y ya no queremos 286 00:12:56,210 --> 00:12:58,210 Alumnos, ni clientes, ni libros 287 00:12:58,210 --> 00:12:58,909 Ni discos 288 00:12:58,909 --> 00:13:02,450 Ni kebabs 289 00:13:02,450 --> 00:13:07,870 A ver, algo que se traduzca 290 00:13:07,870 --> 00:13:09,529 En entidades que podamos describir 291 00:13:09,529 --> 00:13:13,049 yo de un kebab no sé describir un kebab 292 00:13:13,049 --> 00:13:17,870 sí, pero eso sería un restaurante 293 00:13:17,870 --> 00:13:19,870 puede ser un restaurante con menús 294 00:13:19,870 --> 00:13:22,490 pero siempre que os pregunto eso 295 00:13:22,490 --> 00:13:23,870 habláis de menús y de comidas 296 00:13:23,870 --> 00:13:28,629 eso nos lo prohíbe 297 00:13:28,629 --> 00:13:29,970 nuestra religión musulmana 298 00:13:29,970 --> 00:13:31,269 y hoy acaba el ramadán 299 00:13:31,269 --> 00:13:32,649 así que no estamos para eso 300 00:13:32,649 --> 00:13:56,850 Entonces, vamos a plantear la estructura y luego ya hacéis los métodos. 301 00:13:56,850 --> 00:14:01,889 A ver, una app de agencia de viajes, muy bien, muy bonita. 302 00:14:04,799 --> 00:14:07,379 Vale, el paquete del modelo. 303 00:14:12,929 --> 00:14:19,179 El modelo tiene la reserva. 304 00:14:19,940 --> 00:14:21,879 Bueno, primero vamos a poner el destino, que es la pequeñita. 305 00:14:27,389 --> 00:14:39,029 El destino se va a caracterizar por el nombre del destino y lo que cuesta, por ejemplo. 306 00:14:46,740 --> 00:14:47,960 Lo que cuesta ir allí. 307 00:14:49,340 --> 00:14:50,659 Lo que cuesta ir a ese destino. 308 00:14:50,659 --> 00:14:52,720 Cada destino tiene un precio asociado, lo que cuesta ir ahí. 309 00:14:52,720 --> 00:14:54,919 vale, pues por ahora 310 00:14:54,919 --> 00:14:57,080 por rapidez le hacemos los getter y setter 311 00:14:57,080 --> 00:14:58,240 solamente y ya está 312 00:14:58,240 --> 00:15:07,480 y ahora, lo que realmente gestiona 313 00:15:07,480 --> 00:15:09,820 la agencia de viajes son sus reservas 314 00:15:09,820 --> 00:15:11,279 tiene su lista de reservas 315 00:15:11,279 --> 00:15:13,399 que es la que tiene que tener ahí guardadita 316 00:15:13,399 --> 00:15:15,700 eso es lo que va a 317 00:15:15,700 --> 00:15:17,840 gestionar las reservas, para crear reservas 318 00:15:17,840 --> 00:15:19,960 eliminar reservas, consultar 319 00:15:19,960 --> 00:15:21,440 el precio de una reserva 320 00:15:21,440 --> 00:15:23,720 las fechas, etc 321 00:15:23,720 --> 00:15:25,740 entonces, la reserva 322 00:15:25,740 --> 00:15:27,600 se va a caracterizar 323 00:15:27,600 --> 00:15:28,500 por el código 324 00:15:28,500 --> 00:15:31,960 venga, le vamos a poner long 325 00:15:31,960 --> 00:15:33,279 porque nunca usamos long 326 00:15:33,279 --> 00:15:34,399 y es una pena 327 00:15:34,399 --> 00:15:37,480 y tiene un montón de reservas 328 00:15:37,480 --> 00:15:39,360 entonces cuanto más long, mejor 329 00:15:39,360 --> 00:15:43,299 código de reserva 330 00:15:43,299 --> 00:15:46,299 vale, le vamos a poner un cliente 331 00:15:46,299 --> 00:15:48,320 con stream, para no hacer más clases 332 00:15:48,320 --> 00:15:51,899 y le vamos a poner 333 00:15:51,899 --> 00:15:52,919 una fecha 334 00:15:52,919 --> 00:15:57,860 fecha del viaje 335 00:15:57,860 --> 00:15:59,299 lo que sea, fecha, ya está 336 00:15:59,299 --> 00:16:03,529 date, no, le vamos a poner 337 00:16:03,529 --> 00:16:04,250 Local date 338 00:16:04,250 --> 00:16:06,230 Más modernita 339 00:16:06,230 --> 00:16:07,129 ¿Vale? 340 00:16:09,820 --> 00:16:11,320 Local date 341 00:16:11,320 --> 00:16:14,179 Es de 342 00:16:14,179 --> 00:16:18,779 Exactamente 343 00:16:18,779 --> 00:16:19,519 Muy bien 344 00:16:19,519 --> 00:16:25,480 ¿Vale? 345 00:16:34,220 --> 00:16:36,320 ¿Dónde te vas y cuánto te gastas? 346 00:16:38,000 --> 00:16:40,100 Y ahora los getter y los setter 347 00:16:40,100 --> 00:16:46,490 ¿Perdón? 348 00:16:48,690 --> 00:16:49,330 Efectivamente 349 00:16:49,330 --> 00:16:50,610 Que sí, que se me ha olvidado 350 00:16:50,610 --> 00:16:53,889 Efectivamente 351 00:16:53,889 --> 00:16:58,350 Es que estamos ya 352 00:16:58,350 --> 00:17:03,240 El destino 353 00:17:03,240 --> 00:17:05,059 Lógicamente 354 00:17:05,059 --> 00:17:08,180 Getter y setter 355 00:17:08,180 --> 00:17:08,759 Vale 356 00:17:08,759 --> 00:17:15,569 Vale 357 00:17:15,569 --> 00:17:18,730 A medida que se vaya haciendo la aplicación 358 00:17:18,730 --> 00:17:21,230 Pues iremos incorporando 359 00:17:21,230 --> 00:17:22,109 Porque lo irá pidiendo 360 00:17:22,109 --> 00:17:24,269 O iréis incorporando constructores 361 00:17:24,269 --> 00:17:26,609 EqualHasCode, toString 362 00:17:26,609 --> 00:17:27,589 Lo que haga falta 363 00:17:27,589 --> 00:17:30,349 Ahí lo dejamos a bajo mínimos 364 00:17:30,349 --> 00:17:30,750 Ahora 365 00:17:30,750 --> 00:17:32,710 Con getter y setter 366 00:17:32,710 --> 00:17:40,609 A ver, es que se va a confundir un poco 367 00:17:40,609 --> 00:17:42,069 Le debería llamar nombre, yo creo 368 00:17:42,069 --> 00:17:43,769 Nombre del destino 369 00:17:43,769 --> 00:17:46,049 Sí, porque 370 00:17:46,049 --> 00:17:46,809 Si no 371 00:17:46,809 --> 00:17:51,329 Sí, pero como refactorizar 372 00:17:51,329 --> 00:17:53,329 No quita los getter y setter 373 00:17:53,329 --> 00:17:54,609 Pues así 374 00:17:54,609 --> 00:18:08,269 Nombre y nombre 375 00:18:08,269 --> 00:18:16,410 Vale, pues ahí tenemos nuestro modelo 376 00:18:16,410 --> 00:18:19,289 Podría ser muchísimo más complicado 377 00:18:19,289 --> 00:18:20,750 Pero se queda así de sencillo 378 00:18:20,750 --> 00:18:22,549 En condiciones normales, pues el modelo 379 00:18:22,549 --> 00:18:25,390 Pues hombre, serían 10, 11, 12 clases 380 00:18:25,390 --> 00:18:27,089 Aquí son 2 381 00:18:27,089 --> 00:18:29,710 Pero bueno, a los efectos viene a ser lo mismo 382 00:18:29,710 --> 00:18:32,190 Una vez que ya está bien diseñado 383 00:18:32,190 --> 00:18:33,910 Bien planteado sobre el papel 384 00:18:33,910 --> 00:18:36,630 Pues uno ya lo planta en 385 00:18:36,630 --> 00:18:39,410 En sus clases y listo 386 00:18:39,410 --> 00:18:42,309 Ahora, ¿qué es lo siguiente que hacemos? 387 00:18:42,309 --> 00:18:55,109 Una vez que hemos decidido dónde se van a guardar los datos de manera persistente y nosotros ya hemos decidido que es un fichero, una vez que lo hemos decidido, ahora ya vamos a hacer las clases de acceso a datos. 388 00:18:55,690 --> 00:19:03,430 Es decir, las clases que me van a ofrecer los métodos para insertar reservas, recuperar reservas, lo que yo quiera hacer. 389 00:19:03,430 --> 00:19:05,529 pues venga 390 00:19:05,529 --> 00:19:07,630 vamos a hacer 391 00:19:07,630 --> 00:19:08,470 ese paquete 392 00:19:08,470 --> 00:19:11,069 y como ese paquete es 393 00:19:11,069 --> 00:19:13,549 un paquete para clases exclusivamente 394 00:19:13,549 --> 00:19:15,529 que me ofrecen acceso a los datos 395 00:19:15,529 --> 00:19:17,829 lo vamos a llamar 396 00:19:17,829 --> 00:19:18,410 DAO 397 00:19:18,410 --> 00:19:20,890 porque DAO que significa pues 398 00:19:20,890 --> 00:19:22,250 Data Access Object y como 399 00:19:22,250 --> 00:19:24,789 nos gusta mucho el inglés 400 00:19:24,789 --> 00:19:27,309 pues al paquete lo vamos a llamar 401 00:19:27,309 --> 00:19:27,750 DAO 402 00:19:27,750 --> 00:19:30,109 ese paquete que va a tener 403 00:19:30,109 --> 00:19:33,150 las clases que me permiten 404 00:19:33,150 --> 00:19:35,289 acceder a los datos directamente 405 00:19:35,289 --> 00:19:36,869 en su fuente 406 00:19:36,869 --> 00:19:38,690 sea fichero, base de datos 407 00:19:38,690 --> 00:19:43,180 vale, pues a ver, ¿qué queremos 408 00:19:43,180 --> 00:19:45,019 hacer? nuestra aplicación lo que quiere es 409 00:19:45,019 --> 00:19:48,259 quiere 410 00:19:48,259 --> 00:19:52,859 a ver 411 00:19:52,859 --> 00:19:55,160 porque con ficheros no quiero complicarlo 412 00:19:55,160 --> 00:19:57,240 mucho, de destino 413 00:19:57,240 --> 00:19:58,940 hacemos un fichero aparte de 414 00:19:58,940 --> 00:20:00,880 destinos, pero si hacemos un fichero aparte de 415 00:20:00,880 --> 00:20:02,920 destinos, reserva 416 00:20:06,920 --> 00:20:09,119 Venga, sí, que somos unos, sois unos valientes. 417 00:20:09,980 --> 00:20:12,160 Vamos a hacer un fichero. 418 00:20:13,039 --> 00:20:14,519 Esto es como si fuera una base de datos. 419 00:20:14,640 --> 00:20:15,779 Pensadlo como si fuera una base de datos, 420 00:20:15,859 --> 00:20:16,940 pero vamos a simular en ficheros. 421 00:20:17,420 --> 00:20:18,960 Para hacerlo más parecido a una situación real. 422 00:20:19,539 --> 00:20:22,700 En una situación real tendríamos una tabla con destinos. 423 00:20:23,000 --> 00:20:23,519 ¿Verdad que sí? 424 00:20:24,920 --> 00:20:26,160 Con los campos que fueran. 425 00:20:26,240 --> 00:20:27,500 En este caso, dos, nombre y precio. 426 00:20:27,619 --> 00:20:28,140 Una tablita. 427 00:20:28,680 --> 00:20:31,200 Y luego tendríamos una tabla con reservas. 428 00:20:31,420 --> 00:20:33,559 Con todos sus datos, fecha, código. 429 00:20:33,559 --> 00:20:36,779 Y habría un campo que es la clave ajena, 430 00:20:36,779 --> 00:20:37,680 al destino, ¿verdad? 431 00:20:39,220 --> 00:20:40,619 Eso implica que tiene que haber 432 00:20:40,619 --> 00:20:42,700 una clave primaria en destino, porque si no 433 00:20:42,700 --> 00:20:44,420 ¿cómo hago una clave ajena? 434 00:20:44,940 --> 00:20:46,380 Vale, pues nombre nos vale. 435 00:20:47,240 --> 00:20:48,819 ¿Vale? Entonces, 436 00:20:49,359 --> 00:20:51,019 eso sería 437 00:20:51,019 --> 00:20:52,640 si lo hiciéramos en una base de datos. 438 00:20:52,799 --> 00:20:54,700 Tendríamos una tabla con los 439 00:20:54,700 --> 00:20:56,619 destinos y otra tabla con las 440 00:20:56,619 --> 00:20:58,460 reservas que mediante una clave ajena 441 00:20:58,460 --> 00:21:00,619 me lleva al 442 00:21:00,619 --> 00:21:01,759 destino correspondiente. 443 00:21:03,059 --> 00:21:04,240 Nosotros vamos a hacernos 444 00:21:04,240 --> 00:21:06,119 un fichero con los destinos. 445 00:21:06,779 --> 00:21:12,519 Porque puede ocurrir que mi agencia de viajes quiera incorporar destinos nuevos, 446 00:21:13,700 --> 00:21:18,019 eliminar destinos porque ya no trabaja con ese país, lo que sea. 447 00:21:18,240 --> 00:21:19,480 Entonces, un fichero con destinos. 448 00:21:20,539 --> 00:21:22,700 Y luego vamos a hacernos un fichero con las reservas. 449 00:21:24,039 --> 00:21:26,519 Lo que pasa es que ese fichero que tiene las reservas 450 00:21:26,519 --> 00:21:33,319 no va a ser exactamente como una tabla que tiene solamente el nombre del destino 451 00:21:33,319 --> 00:21:34,740 y que me lleva al destino. 452 00:21:34,740 --> 00:21:36,920 ese fichero con las reservas tiene la reserva entera 453 00:21:36,920 --> 00:21:39,279 porque ese fichero con las reservas 454 00:21:39,279 --> 00:21:40,740 tendrá estos objetos 455 00:21:40,740 --> 00:21:42,920 enteritos, los tendrá estos 456 00:21:42,920 --> 00:21:45,000 objetos enteros, con lo cual 457 00:21:45,000 --> 00:21:46,480 ese fichero de reservas 458 00:21:46,480 --> 00:21:48,960 tiene dentro toda la información de la 459 00:21:48,960 --> 00:21:50,900 reserva, el destino incluido 460 00:21:50,900 --> 00:21:52,279 el destino incluido 461 00:21:52,279 --> 00:21:54,019 ¿vale? pero aún así 462 00:21:54,019 --> 00:21:56,920 está bien tener un fichero aparte de destinos 463 00:21:56,920 --> 00:21:58,920 para tener ahí los posibles destinos que tiene 464 00:21:58,920 --> 00:22:01,099 mi aplicación, entonces yo si me 465 00:22:01,099 --> 00:22:02,579 voy a hacer una reserva 466 00:22:02,579 --> 00:22:12,460 A este destino, pues tengo ese fichero para ver si el destino existe, sacar los datos de él para crear el objeto y meterlo aquí, ¿vale? Como si fuera una base de datos. 467 00:22:13,460 --> 00:22:19,799 Bueno, pues entonces vamos a tener dos ficheros. Un fichero con los posibles destinos y un fichero con las reservas que hay hechas. 468 00:22:19,799 --> 00:22:22,160 vale, pues entonces 469 00:22:22,160 --> 00:22:24,880 vamos a hacer dos clases dentro de DAO 470 00:22:24,880 --> 00:22:26,559 una que me va a ofrecer 471 00:22:26,559 --> 00:22:27,680 los métodos 472 00:22:27,680 --> 00:22:30,759 para acceder al fichero de destinos 473 00:22:30,759 --> 00:22:32,799 insertar un destino nuevo 474 00:22:32,799 --> 00:22:34,240 eliminar un destino, por ejemplo 475 00:22:34,240 --> 00:22:35,700 cambiar el precio de un destino 476 00:22:35,700 --> 00:22:38,819 y otra clase que me va a ofrecer los métodos 477 00:22:38,819 --> 00:22:40,000 para acceder a las reservas 478 00:22:40,000 --> 00:22:41,680 hacer una reserva nueva 479 00:22:41,680 --> 00:22:44,819 eliminar reserva, modificar fecha 480 00:22:44,819 --> 00:22:46,779 de reserva, lo que yo decida que quiere 481 00:22:46,779 --> 00:22:47,779 hacer mi aplicación 482 00:22:47,779 --> 00:22:49,440 ¿vale? 483 00:22:49,799 --> 00:22:52,359 bueno pues entonces como vamos a tener dos ficheros 484 00:22:52,359 --> 00:22:53,599 y vamos a hacer dos clases 485 00:22:53,599 --> 00:22:55,660 venga vamos a empezar con la clase 486 00:22:55,660 --> 00:22:57,839 que me va a ofrecer los métodos para 487 00:22:57,839 --> 00:22:59,299 cambiar los destinos 488 00:22:59,299 --> 00:23:02,140 esa clase pues tiene sentido 489 00:23:02,140 --> 00:23:03,599 que la llamemos para organizarnos 490 00:23:03,599 --> 00:23:05,500 destino dao 491 00:23:05,500 --> 00:23:11,880 vale destino dao es la clase 492 00:23:11,880 --> 00:23:13,759 que tiene los métodos que me van a permitir 493 00:23:13,759 --> 00:23:16,240 acceder al fichero de destinos 494 00:23:16,240 --> 00:23:19,839 ahora aquí ya si que tenemos que pensar 495 00:23:19,839 --> 00:23:21,920 nosotros que métodos me importa meter 496 00:23:21,920 --> 00:23:24,180 normalmente por defecto 497 00:23:24,180 --> 00:23:25,259 en estas clases DAO 498 00:23:25,259 --> 00:23:28,079 se meten las cuatro cosas que se pueden hacer 499 00:23:28,079 --> 00:23:28,680 con los datos 500 00:23:28,680 --> 00:23:31,240 que es insertar 501 00:23:31,240 --> 00:23:34,220 eliminar, consultar 502 00:23:34,220 --> 00:23:35,180 y modificar 503 00:23:35,180 --> 00:23:37,940 el cruz famoso, normalmente por defecto 504 00:23:37,940 --> 00:23:38,900 se meten los cuatro 505 00:23:38,900 --> 00:23:41,579 luego a lo mejor nosotros solo nos interesa 506 00:23:41,579 --> 00:23:44,460 implementar uno de ellos o dos de ellos 507 00:23:44,460 --> 00:23:46,119 pues vamos a hacer una cosa 508 00:23:46,119 --> 00:23:47,700 vamos a hacer 509 00:23:47,700 --> 00:23:49,220 una interfaz destino DAO 510 00:23:49,220 --> 00:23:51,500 no porque si luego la implemento 511 00:23:51,500 --> 00:23:54,099 implementar los cuatro, vamos a 512 00:23:54,099 --> 00:23:56,319 aunque normalmente se meterían los cuatro 513 00:23:56,319 --> 00:23:57,779 vamos por ahora a meter 514 00:23:57,779 --> 00:24:00,140 las únicas dos cosas que 515 00:24:00,140 --> 00:24:02,400 nos puede interesar hacer, que luego se pueda ampliar 516 00:24:02,400 --> 00:24:04,140 insertar un destino 517 00:24:04,140 --> 00:24:06,039 nuevo, porque mi agencia ha ampliado 518 00:24:06,039 --> 00:24:07,839 su escala de países y 519 00:24:07,839 --> 00:24:09,380 ya puede ir a un destino nuevo 520 00:24:09,380 --> 00:24:12,480 pues venga, ese método se llamaría 521 00:24:12,480 --> 00:24:25,400 insert 522 00:24:25,400 --> 00:24:26,559 insert 523 00:24:26,559 --> 00:24:40,480 vale, ¿por qué 524 00:24:40,480 --> 00:24:42,660 puesto un boolean, bueno vamos a aprovechar 525 00:24:42,660 --> 00:24:43,700 ya que este método 526 00:24:43,700 --> 00:24:46,160 no me tiene por qué devolver nada 527 00:24:46,160 --> 00:24:48,759 porque lo que hace es meter un objeto en un fichero 528 00:24:48,759 --> 00:24:50,579 es decir, este método 529 00:24:50,579 --> 00:24:52,599 tendrá que hacer el object output string 530 00:24:52,599 --> 00:24:54,299 con el fichero que tiene los destinos 531 00:24:54,299 --> 00:24:56,440 hacer el write object 532 00:24:56,440 --> 00:24:57,380 y poco más 533 00:24:57,380 --> 00:25:00,359 pues como este método 534 00:25:00,359 --> 00:25:02,700 no me tiene por qué devolver nada de retorno 535 00:25:02,700 --> 00:25:04,460 podemos aprovechar 536 00:25:04,460 --> 00:25:05,740 podemos aprovechar 537 00:25:05,740 --> 00:25:08,779 y poner un boolean y true se ha funcionado 538 00:25:08,779 --> 00:25:10,319 bien y false si no, por ejemplo 539 00:25:10,319 --> 00:25:11,779 o lo dejamos en void 540 00:25:11,779 --> 00:25:15,140 y lanzamos una excepción si algo no ha funcionado 541 00:25:15,140 --> 00:25:16,539 porque el fichero no exista 542 00:25:16,539 --> 00:25:19,180 vale, si no queremos 543 00:25:19,180 --> 00:25:20,940 tener a la aplicación 544 00:25:20,940 --> 00:25:22,799 principal luego toda loca y con los 545 00:25:22,799 --> 00:25:24,140 trycatch que se ha vuelto toda loca 546 00:25:24,140 --> 00:25:26,839 pues mira, un boolean 547 00:25:26,839 --> 00:25:28,440 falso, si te devuelvo falso 548 00:25:28,440 --> 00:25:30,779 es que esto no ha ido bien 549 00:25:30,779 --> 00:25:32,599 y ya está, y no hay tantos trycatch 550 00:25:32,599 --> 00:25:33,579 obligatorios arriba 551 00:25:33,579 --> 00:25:36,880 vale, venga, pues con los destinos por ahora 552 00:25:36,880 --> 00:25:38,420 vamos a hacer insertar un destino 553 00:25:38,420 --> 00:25:40,400 y eliminar uno 554 00:25:40,400 --> 00:25:42,619 porque ya no trabajamos 555 00:25:42,619 --> 00:25:43,519 con ese país 556 00:25:43,519 --> 00:25:49,490 vale, borrar 557 00:25:49,490 --> 00:25:52,170 se borra por clave primaria siempre 558 00:25:52,170 --> 00:25:54,589 entonces la clave primaria del destino es el nombre 559 00:25:54,589 --> 00:26:06,640 vale, pues estos dos 560 00:26:06,640 --> 00:26:08,420 métodos tendrá y estos métodos 561 00:26:08,420 --> 00:26:09,900 actuarán sobre el fichero 562 00:26:09,900 --> 00:26:12,160 el insert 563 00:26:12,160 --> 00:26:14,420 ahora cuando lo hagáis 564 00:26:14,420 --> 00:26:16,240 pues que será 565 00:26:16,240 --> 00:26:18,240 abrir con object input 566 00:26:18,240 --> 00:26:20,339 string, perdón, object 567 00:26:20,339 --> 00:26:21,380 output string 568 00:26:21,380 --> 00:26:24,819 pero claro, cuidado, si el fichero ya tiene cosas 569 00:26:24,819 --> 00:26:26,480 tenemos que abrir 570 00:26:26,480 --> 00:26:27,359 para añadir 571 00:26:27,359 --> 00:26:29,799 porque si no me borra todo lo anterior 572 00:26:29,799 --> 00:26:32,799 entonces, para añadir 573 00:26:32,799 --> 00:26:34,180 lo único que tenemos que hacer 574 00:26:34,180 --> 00:26:36,660 si recordáis ayer cuando abríamos 575 00:26:36,660 --> 00:26:38,599 el object output 576 00:26:38,599 --> 00:26:39,299 string 577 00:26:39,299 --> 00:26:41,839 aquí 578 00:26:41,839 --> 00:26:51,420 aquí cuando escribíamos con 579 00:26:51,420 --> 00:26:53,180 object output string que era 580 00:26:53,180 --> 00:26:55,599 aquí 581 00:26:55,599 --> 00:27:01,400 vale, le pasábamos 582 00:27:01,400 --> 00:27:03,160 al object output string un flujo 583 00:27:03,160 --> 00:27:04,900 file output string que hay que pasarle 584 00:27:04,900 --> 00:27:07,019 entonces este flujo es como 585 00:27:07,019 --> 00:27:09,259 el file writer, admite 586 00:27:09,259 --> 00:27:11,039 un segundo parámetro en el 587 00:27:11,039 --> 00:27:12,940 constructor, que es el de 588 00:27:12,940 --> 00:27:14,920 abres para añadir o abres para 589 00:27:14,920 --> 00:27:16,599 borrar de cero y empezar nuevo 590 00:27:16,599 --> 00:27:18,900 recordad que si ese segundo 591 00:27:18,900 --> 00:27:20,940 parámetro en el constructor no está, por defecto 592 00:27:20,940 --> 00:27:23,220 es como si estuviera falso, que es no abres para añadir 593 00:27:23,220 --> 00:27:25,079 abres para pulirte lo entero 594 00:27:25,079 --> 00:27:25,940 y empezar de nuevo 595 00:27:25,940 --> 00:27:44,680 Entonces, si queremos abrir nuestro fichero de objetos para añadir, que se posiciona al final y entonces añadamos, pues este flujo que abramos le ponemos aquí coma true, ¿vale? Coma true y entonces el objeto put string se abre para añadir en este flujo, ¿vale? Se abre para añadir. 596 00:27:44,680 --> 00:27:50,240 ¿Pero el file output string también crea el archivo si no lo encuentro? 597 00:27:50,299 --> 00:27:51,940 Sí, sí, sí, sí, como el file writer. 598 00:27:52,319 --> 00:27:57,420 La única diferencia entre este y el file writer es que este envía el byte directamente 599 00:27:57,420 --> 00:28:02,599 y el file writer tiene en cuenta que es un ASCII, entonces lo interpreta como ASCII 600 00:28:02,599 --> 00:28:07,200 y lo codifica luego en Java en el unicode para que luego coincida. 601 00:28:07,500 --> 00:28:10,519 Es la única diferencia, pero lo demás... 602 00:28:10,519 --> 00:28:16,240 Vale, pues entonces, este método primero será abrir para añadir, 603 00:28:16,400 --> 00:28:17,920 mandar el objeto nuevo y listo. 604 00:28:18,559 --> 00:28:22,619 Y este, este no es tan fácil porque tenemos que borrar del archivo. 605 00:28:23,140 --> 00:28:26,619 Entonces, este habrá que hacerlo como hacíamos los dos ejercicios, 606 00:28:26,619 --> 00:28:31,359 con un archivo temporal, el archivo de maniobras de toda la vida. 607 00:28:32,160 --> 00:28:37,279 Entonces, abriremos el original para leer, un temporal limpio para escribir. 608 00:28:37,279 --> 00:28:40,519 vamos, leyendo del original 609 00:28:40,519 --> 00:28:42,660 ¿coincide en destino 610 00:28:42,660 --> 00:28:43,819 con el que tengo que borrar? 611 00:28:44,140 --> 00:28:45,940 no lo copio, ¿no coincide? 612 00:28:46,079 --> 00:28:46,680 lo copio 613 00:28:46,680 --> 00:28:49,519 una vez que hemos creado el temporal 614 00:28:49,519 --> 00:28:51,900 con los objetos nuevos 615 00:28:51,900 --> 00:28:54,259 que son los originales menos el que hay que borrar 616 00:28:54,259 --> 00:28:56,359 borro el original y cambio el nombre 617 00:28:56,359 --> 00:28:58,200 pues ese sería el delete de destino 618 00:28:58,200 --> 00:29:01,059 y podríamos añadir 619 00:29:01,059 --> 00:29:02,480 si hacemos todo esto muy rápido 620 00:29:02,480 --> 00:29:04,299 pues modificar 621 00:29:04,299 --> 00:29:06,920 el precio de un destino 622 00:29:06,920 --> 00:29:09,200 pero modificar precio de un destino 623 00:29:09,200 --> 00:29:11,359 sería prácticamente un copia y pega del delete 624 00:29:11,359 --> 00:29:13,180 porque es a través de un temporal 625 00:29:13,180 --> 00:29:15,319 lees copias, lees copias 626 00:29:15,319 --> 00:29:16,720 cuando estás leyendo 627 00:29:16,720 --> 00:29:19,299 aquel cuyo nombre 628 00:29:19,299 --> 00:29:20,680 coincide con el que tengo que modificar 629 00:29:20,680 --> 00:29:22,619 lo copio pero con el precio nuevo 630 00:29:22,619 --> 00:29:25,359 luego el modificar 631 00:29:25,359 --> 00:29:27,099 precio del destino 632 00:29:27,099 --> 00:29:32,420 este que lo podríamos hacer así 633 00:29:32,420 --> 00:29:34,160 public 634 00:29:34,160 --> 00:29:35,000 boolean 635 00:29:35,000 --> 00:29:36,420 update 636 00:29:36,420 --> 00:29:39,299 a este sí que le pasaríamos 637 00:29:39,299 --> 00:29:41,019 un destino enterito 638 00:29:41,019 --> 00:29:47,450 y que hace el 639 00:29:47,450 --> 00:29:48,069 UGDATE 640 00:29:48,069 --> 00:29:54,740 pues el UGDATE 641 00:29:54,740 --> 00:29:57,740 del destino del archivo de destinos 642 00:29:57,740 --> 00:29:59,160 cuyo nombre sea 643 00:29:59,160 --> 00:29:59,980 el de este objeto 644 00:29:59,980 --> 00:30:03,059 le cambia el precio por el precio que tenga 645 00:30:03,059 --> 00:30:04,779 este objeto, o sea en este objeto está 646 00:30:04,779 --> 00:30:07,039 el nombre del que tienes que 647 00:30:07,039 --> 00:30:09,019 modificar y el precio nuevo que tienes 648 00:30:09,019 --> 00:30:14,819 que modificar y nos faltaría 649 00:30:14,819 --> 00:30:16,460 del destino dado y en este 650 00:30:16,460 --> 00:30:18,400 caso ya habríamos hecho los cuatro del 651 00:30:18,400 --> 00:30:20,119 CRUD, recuperar porque claro 652 00:30:20,119 --> 00:30:22,059 uno tiene que poder consultar 653 00:30:22,059 --> 00:30:24,619 vamos a consultar un destino 654 00:30:24,619 --> 00:30:25,619 a ver cuánto cuesta 655 00:30:25,619 --> 00:30:28,400 entonces este 656 00:30:28,400 --> 00:30:28,940 sería 657 00:30:28,940 --> 00:30:35,200 get y que le pasaríamos 658 00:30:35,200 --> 00:30:35,779 la clave 659 00:30:35,779 --> 00:30:46,660 return null, vale 660 00:30:46,660 --> 00:30:52,779 pues este se le pasa un nombre 661 00:30:52,779 --> 00:30:55,059 y te devuelve el objeto 662 00:30:55,059 --> 00:30:57,099 destino, el objeto destino 663 00:30:57,099 --> 00:30:58,819 que tiene ese nombre para consultarlo 664 00:30:58,819 --> 00:31:00,880 pues este sería el DAO 665 00:31:00,880 --> 00:31:03,099 para acceder al fichero de destinos 666 00:31:03,099 --> 00:31:05,019 para manipularlo, lo que fuera 667 00:31:05,019 --> 00:31:07,059 entonces 668 00:31:07,059 --> 00:31:09,420 si nosotros tuviéramos ya 669 00:31:09,420 --> 00:31:11,920 nuestro main 670 00:31:11,920 --> 00:31:13,039 ahora ya esto 671 00:31:13,039 --> 00:31:14,779 o lo llamamos desde una interfaz gráfica 672 00:31:14,779 --> 00:31:15,400 o lo que sea 673 00:31:15,400 --> 00:31:17,519 entonces 674 00:31:17,519 --> 00:31:20,200 vamos a hacernos un main 675 00:31:20,200 --> 00:31:50,829 vale, pues nuestra clase main 676 00:31:50,829 --> 00:31:52,210 pues es un rollo porque 677 00:31:52,210 --> 00:31:55,589 hay que hacer el menú 678 00:31:55,589 --> 00:31:57,029 si queremos probar esto 679 00:31:57,029 --> 00:31:57,690 y que no 680 00:31:57,690 --> 00:32:00,009 Y no engorronarla 681 00:32:00,009 --> 00:32:01,309 Vamos a tener que hacer un menú 682 00:32:01,309 --> 00:32:26,539 Y ahora, do, pues venga 683 00:32:26,539 --> 00:32:27,779 ¿Qué opciones tenemos? 684 00:32:32,859 --> 00:32:34,339 Pues sobre destinos 685 00:32:34,339 --> 00:32:41,809 Pues sobre destinos 686 00:32:41,809 --> 00:32:46,710 Insertar 687 00:32:46,710 --> 00:33:00,980 A ver, por ahora vamos a meter las cuatro de destinos 688 00:33:00,980 --> 00:33:02,700 Porque es la primera parte que vais a hacer 689 00:33:02,700 --> 00:33:04,119 Gestionar los destinos y más 690 00:33:04,119 --> 00:33:05,299 Y luego ya las reservas 691 00:33:05,299 --> 00:33:08,000 Que ya las reservas 692 00:33:08,000 --> 00:33:10,660 Nos permite introducir otra capa adicional 693 00:33:10,660 --> 00:33:12,279 Para que vaya engordando esta aplicación 694 00:33:12,279 --> 00:33:14,319 Insertar destino 695 00:33:14,319 --> 00:33:17,180 Recuperar destino 696 00:33:17,180 --> 00:33:18,460 Dado nombre 697 00:33:18,460 --> 00:33:23,440 Eliminar 698 00:33:23,440 --> 00:33:26,509 Y modificar 699 00:33:26,509 --> 00:33:28,069 Que modificar es solamente el precio 700 00:33:28,069 --> 00:33:29,150 Lo que se puede modificar 701 00:33:29,150 --> 00:33:30,509 Modificar 702 00:33:30,509 --> 00:33:32,329 Vale 703 00:33:32,329 --> 00:33:35,450 Entonces aquí le iríamos la opción 704 00:33:35,450 --> 00:33:40,549 Que lo mismo 705 00:33:40,549 --> 00:33:43,529 Para olvidarme del rollo de los báferes 706 00:33:43,529 --> 00:33:44,950 Lo voy a leer con Nesline 707 00:33:44,950 --> 00:33:46,490 Y lo convierto al íntegro 708 00:33:46,490 --> 00:34:03,940 Y ahora nuestro 709 00:34:03,940 --> 00:34:05,839 Suite 710 00:34:05,839 --> 00:34:18,619 Case 1 711 00:34:18,619 --> 00:34:23,559 Case 2 712 00:34:23,559 --> 00:34:30,690 Case 3 713 00:34:30,690 --> 00:34:39,730 Case 4 714 00:34:39,730 --> 00:34:41,789 Ya, ya, ya, ya lo sé 715 00:34:41,789 --> 00:34:43,269 Hay muchas cosas que tendría que hacer 716 00:34:43,269 --> 00:34:45,050 Y 717 00:34:45,050 --> 00:34:47,829 No hago por vaguería 718 00:34:47,829 --> 00:34:51,079 Pero bueno, yo me puedo permitir 719 00:34:51,079 --> 00:34:52,239 Ser vaga, porque ya 720 00:34:52,239 --> 00:34:55,159 Ya tengo la vida resuelta 721 00:34:55,159 --> 00:34:57,760 Pero vosotros no, vosotros no os podéis permitir ser vagos 722 00:34:57,760 --> 00:34:59,300 Vale 723 00:34:59,300 --> 00:35:01,579 Vale 724 00:35:01,579 --> 00:35:03,860 Y en el caso de cero está salir 725 00:35:03,860 --> 00:35:17,480 Saliendo 726 00:35:17,480 --> 00:35:18,400 Cerrando 727 00:35:18,400 --> 00:35:21,539 Y en default opción incorrecta 728 00:35:21,539 --> 00:35:32,219 No 729 00:35:32,219 --> 00:35:34,719 Claro 730 00:35:34,719 --> 00:35:37,639 Ahora ya opción incorrecta 731 00:35:37,639 --> 00:35:43,099 Entonces aquí ahora ya 732 00:35:43,099 --> 00:35:44,619 No hay un map 733 00:35:44,619 --> 00:35:46,900 una lista que tenga todos los destinos 734 00:35:46,900 --> 00:35:48,019 o todos los viajes 735 00:35:48,019 --> 00:35:50,480 no hay por qué, tú aquí todos los 736 00:35:50,480 --> 00:35:52,219 accesos para consultar para lo que sea 737 00:35:52,219 --> 00:35:54,420 van a través de los métodos estos de DAO 738 00:35:54,420 --> 00:35:55,179 que van al archivo 739 00:35:55,179 --> 00:35:57,960 vale, pues entonces esto es lo de mi while 740 00:35:57,960 --> 00:36:08,900 y se acabó, pues venga 741 00:36:08,900 --> 00:36:09,900 primera parte 742 00:36:09,900 --> 00:36:12,659 hace de estos cuatro métodos 743 00:36:12,659 --> 00:36:15,260 de destino para poder 744 00:36:15,260 --> 00:36:16,840 probarlos ahora desde el main 745 00:36:16,840 --> 00:36:24,469 venga, primera parte