20250930-FicherosObjetos_3 - Contenido educativo
Ajuste de pantallaEl ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:
vale, pues ya está
00:00:00
entonces, no vamos a ponerle
00:00:02
módulos, porque a esta aplicación
00:00:05
se supone que habría que agregarle
00:00:07
que le agregaríais vosotros
00:00:09
una funcionalidad que es
00:00:11
agregar módulo a un alumno
00:00:13
agregar módulo a un alumno
00:00:15
entonces vamos a crearlo sin módulos y sin más
00:00:16
entonces su lista de módulos
00:00:19
que he puesto
00:00:21
setNif, porque he copiado y pegado
00:00:23
vale, entonces
00:00:25
Set nombre
00:00:27
Hay que ver
00:00:30
Que pendientes estamos de todo
00:00:32
Entonces este alumno
00:00:34
Se va a crear con su lista de módulos
00:00:36
Vacío
00:00:39
Esto a mi también me daba ansiedad el año pasado
00:00:39
Vale
00:00:42
Y a vosotros como
00:00:44
Contagio también
00:00:46
Una propiedad colección
00:00:47
Al menos instanciarla
00:00:50
Para no arriesgarnos
00:00:52
A los null pointer exceptions
00:00:54
Si alguien se pone a añadir así por las buenas
00:00:56
Al menos instanciarla
00:00:57
No es una mala costumbre
00:00:59
A ver
00:01:02
Es mala costumbre
00:01:04
En cuanto a que te compromete
00:01:07
Ya un tipo de estructura
00:01:09
Arraylist, linkedlist
00:01:11
Pero bueno, uno siempre podría sobreescribirla más adelante
00:01:12
Pero hombre
00:01:15
Cuanto menos
00:01:16
Nos arriesguemos
00:01:19
A un null pointer exception
00:01:20
Mejor
00:01:22
¿Vale?
00:01:23
¡Hala! Pues este es nuestro alumnito que le devolvemos aquí.
00:01:26
Ya hemos solicitado los datos.
00:01:34
Porque el null pointer exception seguramente sea la...
00:01:39
Si uno pudiera contabilizar todas las excepciones que han salido a lo largo de la historia de Java,
00:01:42
todo el mundo que ha programado en Java,
00:01:46
¿qué pena no poder hacer un histograma?
00:01:48
Seguramente null pointer exception tendría la delantera.
00:01:50
A ver
00:01:54
¿Dónde estábamos? Aquí
00:01:57
Solicitar datos
00:01:59
Y ahora ya sí que tenemos que insertar
00:02:00
Alumno
00:02:04
En el fichero
00:02:06
Ahora ya tenemos que meter
00:02:08
Al alumno en el fichero
00:02:13
Vale
00:02:15
Ah bueno
00:02:22
Perdona, perdona, perdona
00:02:28
Claro, sí, sí, sí, tienes razón
00:02:29
O sea, la aplicación está trabajando con el map
00:02:31
Perdona, claro, tienes razón
00:02:33
Entonces lo que tengo que instalar es en el map
00:02:34
En el fichero, claro, en el fichero lo mandaré
00:02:36
Claro, insertar alumno es que no me hace falta
00:02:38
Ni hacer un método aparte
00:02:41
Porque directamente pondría
00:02:42
En el map
00:02:45
Alumnos.put
00:02:46
Alumn.getNive
00:02:53
Alumn
00:02:58
Vale, ya está
00:02:59
Entonces efectivamente este método fuera
00:03:01
Ahora no pinta nada
00:03:03
Pintará cuando ya lo hagamos
00:03:06
Con un patrón de diseño un poco más decente
00:03:08
Porque os dais cuenta
00:03:10
De lo mal que estamos programando aquí
00:03:12
Estamos haciendo todos los métodos en el main
00:03:14
Según los vamos necesitando
00:03:15
No hemos hecho un diseño previo
00:03:17
Entonces esta aplicación que luego tenemos que ampliar
00:03:19
La va a ser un desmadre
00:03:22
Luego la vamos a intentar hacer con un diseño previo
00:03:23
Dime
00:03:26
Bajar hasta donde
00:03:26
Solicita datos, nada
00:03:30
Tiene el scan y devolver el alumno
00:03:33
Y ya está
00:03:35
No tiene nada
00:03:35
¿Vale?
00:03:38
Entonces efectivamente
00:03:40
Como bien has apuntado
00:03:41
Esta aplicación una vez que ha recuperado
00:03:43
A los alumnos en el map
00:03:46
Tendrá que preocuparse de cuando la aplicación
00:03:47
Termina, que es aquí
00:03:51
Guardarlos otra vez
00:03:52
¿Vale? En ese punto tendrá que guardarlos
00:03:54
Entonces
00:03:56
Uy
00:03:57
Aquí tendremos que
00:03:59
Guardar
00:04:04
Alumnos
00:04:06
Vale
00:04:09
Y ahora ya este método
00:04:10
Implica de nuevo
00:04:12
Que cojamos las clases de serialización
00:04:16
Guardar alumnos
00:04:18
Object output stream
00:04:23
Vale
00:04:25
Asociado a un flujo
00:04:44
New file output
00:04:45
stream
00:04:47
con el nombre del objeto
00:04:49
file, que era
00:04:51
fichero alumnos
00:04:53
y luego
00:04:55
podíamos poner opcionalmente
00:04:57
en el file output stream
00:05:00
un parámetro para
00:05:01
poner si queremos añadir
00:05:03
o sobreescribir enterores del principio
00:05:05
en este caso vamos a escribir
00:05:07
claro, pero en este caso tenemos
00:05:08
suerte, porque si no, tenemos
00:05:11
una movida, no queremos añadir
00:05:13
en este caso queremos todo el map entero
00:05:15
que tiene todos los alumnos, los nuevos
00:05:17
los que he quitado, todo el map entero, volcarlo
00:05:19
con lo cual podemos dejar
00:05:21
la variante
00:05:23
de format.string que no tiene ese parámetro
00:05:25
que es igual a tenerlo falso
00:05:28
es decir, no añadas
00:05:29
sobreescribe el fichero con todo este map entero
00:05:30
pero lo que si que tenemos que hacer es
00:05:34
los import y los
00:05:37
throws
00:05:39
y ahora ya si que si
00:05:40
Pues recorrer el map
00:05:51
De nuevo para irlos guardando
00:05:53
Pues venga, lo recorremos así a lo patatero
00:05:54
Otra vez
00:05:57
Para cada clave
00:05:58
En
00:06:01
Nuestros alumnos
00:06:03
Vamos
00:06:05
A escribir el objeto
00:06:07
Vamos a escribir
00:06:09
Eh
00:06:13
Alumnos.get
00:06:14
Nif
00:06:17
Lo próximo que pasa
00:06:19
sí, hace falta
00:06:20
un quesed
00:06:25
ala, los estamos escribiendo
00:06:26
uno por uno y cuando ya hemos terminado
00:06:32
fuera
00:06:34
guardar alumnos está
00:06:35
que lo haríamos
00:06:41
cuando salimos
00:06:44
si, eso
00:06:49
cuando lo hagamos con el patrón
00:06:53
lo vamos a ir haciendo añadiendo poco a poco
00:06:55
y ahí ya sí que tendremos que ver
00:06:57
que tenemos un problema con la cabecera
00:06:59
claro, y ese lo tendremos que arreglar
00:07:00
Aquí como lo sobre escribimos enterito
00:07:02
Ese problema no lo tenemos
00:07:04
Vale, entonces
00:07:05
Dime
00:07:09
Si, podríamos guardar el map entero
00:07:09
¿Vale?
00:07:16
Pero aquí lo quiero guardar uno por uno
00:07:18
Pues para que veamos
00:07:20
Que empecemos a intuir
00:07:22
Que habría una diferencia entre
00:07:24
Añadir, guardarlos todos
00:07:25
Y que esa diferencia tiene implicaciones
00:07:27
Lo veremos luego
00:07:29
Pero si, podría guardar el map
00:07:31
Un único great object
00:07:33
y luego cuando recuperara
00:07:35
haría un único read object
00:07:38
pero no habríamos tenido que hacer el buque de lectura
00:07:39
que yo si quería que hiciéramos el buque de lectura
00:07:42
para leer uno por uno
00:07:44
entonces
00:07:45
eso te vale
00:07:47
cuando tu aplicación usa un map
00:07:49
pero claro, puede ser que tu aplicación
00:07:52
guarde los alumnos
00:07:54
cada vez en una estructura
00:07:56
distinta, entonces si la aplicación
00:07:58
lo guarda cada vez en una estructura distinta
00:08:00
pues la idea es que tú los vayas añadiendo
00:08:01
Bueno, pues entonces antes de probarla para ver si esto funciona
00:08:03
Vamos a recuperar un alumno
00:08:09
Que recuperar un alumno pues no tiene nada
00:08:12
Porque aquí le pedimos el NIF del alumno
00:08:15
Leemos el NIF
00:08:20
Bueno, es que ni siquiera
00:08:23
Vamos a mostrar directamente al alumno
00:08:27
Alumnos.get
00:08:30
De scan.nextint
00:08:34
Nextline, perdón
00:08:39
Vale, pedimos el nif
00:08:41
Y con este nif
00:08:49
Indexamos en el map
00:08:51
Para sacar el alumno
00:08:53
Y con el system out
00:08:54
Pues nos lo muestra
00:08:56
Aquí no tenemos
00:08:57
Añadido nada de añadir un módulo
00:09:01
Para un módulo, pero bueno
00:09:03
Bueno, pues podríamos probar
00:09:04
Esta
00:09:07
Esta versión de la aplicación
00:09:08
A ver si funciona todo
00:09:13
Vale
00:09:14
A ver
00:09:18
Venga
00:09:21
Nombre de fichero alumnos
00:09:22
Alumnos.txt
00:09:25
Uy txt, bueno da igual
00:09:28
Venga
00:09:29
Vamos a insertar un primer alumno
00:09:32
Su nombre
00:09:34
Digo su nif
00:09:35
Su nombre
00:09:36
lo habrá insertado
00:09:38
va a un map, tampoco es que sea tan complicado
00:09:44
insertar, vamos a
00:09:46
mostrar el listado de alumnos
00:09:48
pues si, tenemos
00:09:50
este alumno
00:09:52
vamos a recuperarlo
00:09:53
por nif, 1, 2, 3, 4
00:09:56
está trabajando con el map, no tiene nada que hacer
00:09:58
vale
00:10:00
y vamos a insertar un segundo
00:10:01
para al menos tener 2
00:10:04
5, 6, 7, 8
00:10:05
nombre
00:10:08
Y ya está
00:10:10
Y aquí tenemos a los dos en el mar
00:10:12
Vale, aquí
00:10:14
Todavía no hemos guardado nada en el fichero
00:10:16
¿Cuándo vamos a guardar en el fichero?
00:10:18
Cuando demos a la opción
00:10:21
Salir
00:10:22
Aquí se supone que es la poca persistencia
00:10:23
Que tiene la aplicación
00:10:27
La hace aquí, la poca que tiene
00:10:28
Le damos a salir
00:10:30
Y esto ya lo sabíamos
00:10:31
¿Verdad?
00:10:34
Ya lo sabíamos porque se nos había olvidado
00:10:36
hacer a alumno
00:10:39
serializable
00:10:41
elements
00:10:43
serializable
00:10:45
vale, aquí
00:10:49
puede que haya llegado a hacer
00:11:02
el fichero
00:11:06
el object output string
00:11:08
puede que haya llegado a hacerlo
00:11:11
pero luego cuando ha intentado
00:11:12
hacer el great object es cuando le ha salido
00:11:15
el error, entonces ha llegado a hacerlo
00:11:17
y ya ha metido cosas
00:11:19
relacionadas con la cabecera
00:11:21
entonces este fichero ya se ha quedado
00:11:23
corrupto, porque no ha
00:11:25
entonces cuando trate de recuperarse
00:11:26
volvemos a arrancar la aplicación
00:11:29
él verá, existe y no es cero
00:11:31
pues intentará
00:11:33
leer de él y va a ser un desastre
00:11:35
claro
00:11:37
o sea, ahora si volvemos a arrancar la aplicación
00:11:39
ya al arrancarla
00:11:41
esto debería dar un error de partida
00:11:43
en cuanto le demos este
00:11:45
nombrecito, alumnos.txt
00:11:50
porque esto
00:11:52
ya es, pero que
00:11:54
basura me has
00:11:55
pasado aquí, esto que es
00:11:57
entonces, vamos
00:12:00
a eliminar este fichero
00:12:02
ok, vale
00:12:03
entonces, esto
00:12:10
funcionaría, alumnos
00:12:17
ahora, vale, insertamos
00:12:18
uno cualquiera, nif1
00:12:21
nombre1 y nos
00:12:23
vamos, vale
00:12:25
adiós
00:12:26
Vamos a recuperar ahora
00:12:27
Vamos a arrancar la aplicación
00:12:30
Otra vez
00:12:32
Arrancamos la aplicación
00:12:33
Venga, nombre del fichero
00:12:36
Alumnos
00:12:38
Vamos a ver si el alumno está
00:12:39
O sea, si esta aplicación realmente tiene
00:12:43
Esa pequeña persistencia
00:12:45
MIF 1.1
00:12:47
Pues sí
00:12:48
El alumno está
00:12:50
Vale, vamos a añadir otro nuevo
00:12:52
1
00:12:55
Alumno 2.2
00:12:57
Nombre 2-2
00:12:59
En el map está
00:13:01
Vamos a salir ya de la aplicación
00:13:04
Ahí está
00:13:08
Vale
00:13:10
La arrancamos otra vez
00:13:11
Nombre del fichero
00:13:14
Alumnos
00:13:17
A ver cuántos alumnos tengo
00:13:18
Ahí están
00:13:20
Vale
00:13:22
Con estas pruebas
00:13:23
Parece que más o menos
00:13:25
Funciona
00:13:26
¿significa eso que hayamos contemplado
00:13:28
todos los errores? seguro que no
00:13:31
si empezamos a hacer pruebas un poquito más
00:13:32
la tiramos seguro
00:13:35
aunque sea una aplicación de dos líneas
00:13:36
la tiramos fijo
00:13:38
por eso una fase de pruebas tiene que ser
00:13:40
larga y concienzuda
00:13:42
porque esto podrá tener
00:13:44
mil casos de prueba no contemplados
00:13:46
¿vale?
00:13:49
pero bueno, los arreglaríamos porque son muy listos
00:13:50
y no pasa nada
00:13:52
y esta aplicación nos ha metido
00:13:53
Que sería lo ideal que para practicar programación a vosotros y esas cosas
00:13:56
Pues hicierais por ejemplo esta funcionalidad
00:14:03
Porque seguramente luego cuando lo probéis ahí si que os vais a encontrar errores
00:14:09
Etcétera
00:14:14
Vale, pues la funcionalidad 4
00:14:16
¿Qué haría esta funcionalidad?
00:14:24
Pues esta funcionalidad tendría que solicitar un if y unos datos de módulo
00:14:28
Que los datos de módulo son nombre y nota solamente
00:14:39
Incorpora módulo a alumno
00:14:41
Y sería lo ideal que hicierais también el 5 que es listado de módulos de un alumno
00:14:50
Vale, aquí tendríamos
00:15:02
El
00:15:15
Caso 5
00:15:18
Que es dado nif
00:15:20
Listado módulos, pero vamos
00:15:26
Que esto
00:15:27
Esto no sería nada
00:15:28
Porque esto sería
00:15:33
Coger los datos y hacer
00:15:36
Al get un set
00:15:38
¿Verdad?
00:15:40
Al get por nif
00:15:42
Eh, sacar el get
00:15:43
De los módulos y hacerle el add
00:15:46
De los datos
00:15:49
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.
00:15:50
Módulo
00:16:30
Método que haríais
00:16:32
Aquí fuera
00:16:38
Vale
00:16:39
Entonces
00:16:45
Se daría un NIF
00:16:47
Al alumno con ese NIF
00:16:52
Cogería su lista de módulos
00:16:54
Y le añadiría
00:16:57
El módulo
00:16:59
Que devuelve el método este
00:17:01
Solita datos de módulo
00:17:03
que no haría nada, nada más que pido los datos
00:17:04
y ya está
00:17:06
aquí claro
00:17:07
de nuevo forma de
00:17:09
aplicación
00:17:12
robustez cero
00:17:13
porque si el tío me metió un
00:17:16
if que no existe
00:17:18
aquí me sale un pedazo de null
00:17:19
entonces me sale
00:17:22
un pedazo de null
00:17:24
pointer exception cuando tenga
00:17:25
un red módulo
00:17:28
entonces aquí pues efectivamente
00:17:28
si esto no es null y si es null
00:17:31
Puede decir el NIF no existe
00:17:33
¿Vale?
00:17:35
Aplicación, acortamos código y hacemos algo
00:17:37
Lo menos robusto del mundo
00:17:39
Aquí hay un pedazo de null pointer de excepción ahí metido
00:17:40
Enorme
00:17:43
En cuanto el usuario meta un NIF
00:17:44
Que no existe
00:17:47
Bueno, pues entonces
00:17:48
Con esto
00:17:51
Tenemos una pequeña aplicación
00:17:53
Persistente que se cae por todas partes
00:17:55
Primero
00:17:58
La hemos hecho
00:18:00
Más cómoda imposible
00:18:02
todos los objetos, pum, todos al map
00:18:03
al arrancar, y si tengo un instituto
00:18:06
de 100.000 alumnos
00:18:08
pues un map de 100.000
00:18:10
pues no
00:18:12
muy mal eso, eso para empezar
00:18:13
y luego ya
00:18:16
salvando eso
00:18:18
¿qué diseño es este?
00:18:19
estamos mezclando vista
00:18:22
la vista es el menú con el switch
00:18:23
con la lógica
00:18:26
tenemos ahí los métodos
00:18:28
que por lo menos nos hemos dignado
00:18:30
a sacarlos fuera del main
00:18:32
pero es lo más a lo que hemos llegado
00:18:34
a sacarlos fuera del main, pero es que están aquí mismo
00:18:36
que es un desastre
00:18:38
es que de hecho
00:18:40
algunos ni los hemos sacado, o sea, aquí estamos
00:18:42
con la lógica de la aplicación
00:18:44
no la lógica de negocio, la lógica de la aplicación
00:18:46
aquí metida, y menos mal
00:18:48
que al menos hemos sacado una entidad fuera
00:18:50
pero vamos, que esta es una aplicación
00:18:52
que se cae por todos lados
00:18:54
entonces
00:18:55
aún así
00:18:57
podría ser una aplicación que tú se la das
00:18:59
un usuario y el usuario la usa
00:19:02
durante los 25 años restantes
00:19:04
de su vida sin tener ningún
00:19:06
problema y sin que le pase nada
00:19:08
pero ¿qué pasa?
00:19:09
si en algún momento de esos 25 años
00:19:11
ese cliente
00:19:13
necesita añadirle una funcionalidad
00:19:15
a esa aplicación
00:19:18
y te la devuelve
00:19:19
a los 10 años, oye añádenme esta pequeña
00:19:22
funcionalidad, ah sí, sí, sí
00:19:24
tú la abres 10 años después
00:19:25
no entiendes nada, eso es un desastre
00:19:28
el trabajador que te la hizo
00:19:32
ya lo has echado, lógicamente
00:19:34
porque si no hubieras tenido que subir
00:19:36
el sueldo demasiado en 10 años, lo has echado
00:19:38
y has cogido a uno de prácticas
00:19:40
que le estás pagando
00:19:42
una mierda y le sueltas esto
00:19:44
que está fatal hecho 10 años después
00:19:46
se vuelve loco
00:19:48
y dice, pero cómo voy a añadir yo una funcionalidad
00:19:50
nueva en esto que está hecho un desastre
00:19:52
la tiro a la basura y la hago de nuevas
00:19:54
con lo cual va a tardar
00:19:56
mucho tiempo, al jefe
00:19:58
tampoco le va a gustar que tarde tanto
00:20:00
y también le va a echar.
00:20:01
Entonces, ¿cómo?
00:20:04
Sí, ahora las cosas han cambiado
00:20:07
porque ahora tienes al esclavo.
00:20:09
Pero claro, el jefe sabe que tienes al char GPT
00:20:11
con lo cual va a esperar que lo hagas todo
00:20:14
muchísimo más rápido.
00:20:17
En cualquier caso, si partes de una aplicación de partida
00:20:19
bien diseñada y estructurada
00:20:21
lo vas a tener más fácil
00:20:23
para incorporar cualquier cosa nueva.
00:20:25
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?
00:20:27
sería lo natural
00:20:45
que ya de partida incorporáramos esto
00:20:48
que es el patrón
00:20:51
de data
00:20:53
access
00:20:54
de
00:20:56
llegamos al object
00:21:03
que lo juro
00:21:05
menos que la O sea
00:21:07
sí, no, es que de repente
00:21:09
como que me ha venido un vacío a la mente
00:21:13
y me sonaba fatal
00:21:15
me sonaba fatal
00:21:17
pero no, es eso
00:21:20
Pero me ha venido como una laguna
00:21:21
Y yo, mal me suena
00:21:22
Pero no, no, es así
00:21:24
Vale, como nunca jamás
00:21:25
Uno lo deletrea, siempre dice
00:21:28
Sin más
00:21:29
Vale, entonces
00:21:30
Esto es un patroncito chorra, sin más
00:21:33
Es una forma de organizar las cosas
00:21:35
En una aplicación que usa persistencia
00:21:37
¿Significa eso que si una aplicación
00:21:39
Sigue el patrón, ya no pueda seguir ningún otro?
00:21:42
No, cada patrón
00:21:44
Se ocupa de organizar
00:21:45
Cuestiones diferentes
00:21:48
desde la aplicación. Este patrón se ocupa de organizar la parte de hacer persistencia
00:21:50
de los datos. Es decir, el CRUD, de esto se ocupa. ¿Y qué es el CRUD? Pues ya sabemos
00:21:58
que es crear datos, consultar datos, actualizar datos y borrar datos. Porque esto es lo que
00:22:09
con los datos. Eso es lo que
00:22:20
hacemos con los datos. No hacemos más que esto.
00:22:22
Pues este patrón
00:22:25
trata de
00:22:26
separar
00:22:28
estas funciones,
00:22:30
separarlas, y luego
00:22:32
tú ya las usas desde tu aplicación,
00:22:34
pero estás absolutamente abstraído
00:22:37
de la parte de la
00:22:38
persistencia que es esa.
00:22:40
Estás absolutamente abstraído.
00:22:42
En esta aplicación no lo estábamos.
00:22:43
Tenemos...
00:22:46
En esta aplicación no estamos
00:22:47
abstraídos porque
00:22:54
tenemos aquí metido el fichero
00:22:56
que yo de repente
00:22:58
cambio y ya esta aplicación
00:23:00
el usuario me ha dicho, el cliente
00:23:02
es que ya no son 20 alumnos
00:23:04
de repente he pasado a 20.000
00:23:06
por favor, cámbiame
00:23:08
la aplicación, tú tienes que moverla a una base
00:23:10
de datos, con la aplicación
00:23:12
hecha así, mover a una base de datos
00:23:14
implica hacer mil cambios
00:23:16
Con una aplicación hecha con un patrón DAO
00:23:17
Mover a una base de datos
00:23:20
Todo esto significa
00:23:22
No tocar la aplicación
00:23:23
Solamente tocar
00:23:25
Unas clasecitas que están ahí aparcadas
00:23:27
Solo tocar esas
00:23:29
Tu aplicación no se entera
00:23:30
Aquí esta aplicación se entera de principio a fin
00:23:32
Si yo tengo que cambiar una base de datos
00:23:34
¿Vale?
00:23:36
Bueno, pues entonces
00:23:39
Versión 2
00:23:41
que sí, que sí, tranquilos
00:23:50
pero bueno, podemos escribir la clase
00:23:55
¿no? bueno, espera, espera
00:23:58
versión, bueno, voy a hacer la clase
00:23:59
la aplicación
00:24:01
a ver, gestión alumnos
00:24:03
versión 2
00:24:06
esta sería la main
00:24:07
pero la main se va a apoyar en otras
00:24:09
¿vale?
00:24:11
vale, aquí vamos a
00:24:13
hacer nuestra nueva aplicación
00:24:15
esta aplicación
00:24:17
ya no lo va a tener aquí todo dentro
00:24:19
tendrá aquí
00:24:22
idealmente
00:24:24
la parte de la vista
00:24:26
¿vale?
00:24:28
pero la parte de acceso a datos
00:24:30
la sacamos fuera
00:24:32
¿vale? venga pues vamos a
00:24:34
a dejarlo aquí
00:24:38
vale
00:24:42
- Materias:
- Programación
- Niveles educativos:
- ▼ Mostrar / ocultar niveles
- Formación Profesional
- Ciclo formativo de grado superior
- Primer Curso
- Subido por:
- Raquel G.
- Licencia:
- Todos los derechos reservados
- Visualizaciones:
- 6
- Fecha:
- 30 de septiembre de 2025 - 18:58
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 24′ 44″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 473.28 MBytes