Activa JavaScript para disfrutar de los vídeos de la Mediateca.
Clase 8-01-24 - 4 - 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 en este caso el main sería el software de la cafetera, simplemente.
00:00:00
Entonces, un main realista en este caso sería una interfaz gráfica
00:00:10
con los botoncitos de vaciar, servir taza, agregar.
00:00:15
Ese sería un main realista, una interfaz gráfica.
00:00:22
Como no sabemos hacer interfaces gráficas, pues un main más o menos realista podría ser un menú.
00:00:26
Vamos a hacerlo rápidamente para que se quede esto completo.
00:00:33
Esto lo dejo aquí comentado, que es con lo que hemos ejemplificado de los constructores.
00:00:37
A ver, pues un main realista podría ser un menú para hacer las acciones con la cafetera.
00:00:45
Las cuatro opciones que se pueden hacer son llenarla, servir, vaciar y agregar.
00:01:04
Pues serían llenar cafetera.
00:01:17
Otra opción que se puede dar dando al botoncito de la máquina, vaciarla.
00:01:35
Otra opción que se puede dar dándole al botoncito correspondiente, servir taza.
00:01:42
Y otra opción que se puede hacer, esta era, nos falta agregar café a la cafetera.
00:01:55
Estas serían las cuatro opciones.
00:02:18
Y ahora ya el switch case de toda la vida y en función de la opción que hayamos elegido en la cafetera.
00:02:33
Pues si se ha elegido la opción uno, habrá que llamar al método llenar cafetera.
00:02:50
¿Qué cafetera? Vamos a crearla, la cafetera está sin inicializar.
00:02:55
A ver, Andoni, vente aquí al lado de Adrián que te echa de menos.
00:03:00
Ya, ya, ya están los huevos de vosotros. Vente aquí para adelante.
00:03:07
¿Tú tienes portátil, Diego?
00:03:31
Pues ponte en el de Moisés, por favor.
00:03:45
Bueno, el siguiente candidato es Moisés o María.
00:04:00
Vale, a ver, en el caso uno, la cafetera todavía está sin inicializar.
00:04:11
Entonces cuando arranca este programa, cuando arranca el programa, es el momento en el que encendemos la cafetera.
00:04:15
En el momento de encenderla será cuando la cafetera se inicializa y todo eso.
00:04:21
Pues entonces en el momento de arrancar el programa será cuando ocurra esto.
00:04:26
Vamos a hacerlo, voy a copiar esto mismo.
00:04:34
O sea, cuando arranca el programa, la cafetera se creará y se inicializará con estos valores.
00:04:47
A ver, en una situación real, la cafetera cuando la encendemos no nos pide los valores, los detecta.
00:04:54
Detecta la capacidad máxima y con ella crea la cafetera.
00:05:02
Y detecta la cantidad que haya de café en ese momento y con ella crea la cafetera aquí.
00:05:06
Es decir, esta parte no nos la pedirá a nosotros.
00:05:12
En el momento de arrancar el software, estas dos variables se cargarán con lo que detecte la cafetera que hay en ese momento.
00:05:15
Se cargarán. En nuestro caso no están conectados los sensores que pueden detectar nada.
00:05:23
Por eso no nos los pide.
00:05:27
Lo que importa es que se tiene que crear este objeto.
00:05:29
Ya hemos leído cft sin más.
00:05:33
Y una vez que se ha creado el objeto con los valores, ahora ya el software trabajará y dirá, a ver, ¿qué quieres hacer?
00:05:36
Y así estará todo el rato.
00:05:43
Que lo que queremos es llenar la cafetera.
00:05:45
Pues ala, facilísimo, ya está. Ya está hecho.
00:05:48
Y el break.
00:05:53
Que lo que queremos es vaciar la cafetera.
00:05:57
Pues de nuevo, ya está, facilísimo. Ya está hecho.
00:06:02
Que lo que queremos es servir una taza.
00:06:11
Pues antes de servirla, habrá que preguntar de cuánto volumen es.
00:06:14
En un caso real, la cafetera no nos pregunta de cuánto volumen es.
00:06:18
En el momento de meter la taza, pues lo detectaría.
00:06:22
Y al detectarlo ya, llamaría el método con ese valor.
00:06:24
En nuestro caso no hay ese sensor que detecte, pues nos lo pregunta.
00:06:27
Nos lo pregunta.
00:06:40
Y una vez que tenemos ya ese volumen,
00:06:45
una vez que tenemos ya ese volumen, ahora ya podemos servir la taza.
00:06:52
Ala, ya está.
00:07:00
Y ya estaría.
00:07:04
Y el caso cuatro, que es agregar café, pues lo mismo.
00:07:06
Agregar café, nos tendría que, de alguna manera hay que decirle al software de la cafetera,
00:07:10
hay que decirle cuánto vamos a agregar.
00:07:15
Pues en este caso no hay otro método que nos lo pregunte por consola,
00:07:19
porque tenemos sensor y no tenemos nada.
00:07:23
Bueno, pues una vez que
00:07:33
una vez que ya sabe la cafetera cuánto café va a agregar,
00:07:41
una vez que ya lo sabe, porque lo ha detectado por sus sensores,
00:07:45
porque en este caso nos lo ha preguntado por consola,
00:07:48
pues ya está, ya podemos...
00:07:51
Y ya estaría todo ese software hecho.
00:07:59
Podríamos poner aquí una opción default,
00:08:02
que fuera opción incorrecta y ya está.
00:08:06
Y podríamos poner la opción apagar.
00:08:11
Y si ponemos la opción apagar...
00:08:23
Vale, pues entonces ahora ya con la opción apagar,
00:08:41
este do while acabará aquí, aquí,
00:08:44
mientras la opción sea diferente de la cinco, que es la de apagar.
00:08:47
Cuando ya le hemos dado a apagar, ya el programa sale y el programa termina.
00:08:53
Ya está, pues ya se apaga. Se apaga la cafetera y listo.
00:08:57
Bueno, pues este sería nuestro main.
00:09:01
Entonces nuestro main se limita a inicializar la taza.
00:09:05
Perdón, inicializar la cafetera,
00:09:10
crearla e inicializarla y luego ir a trabajar con ella todo el rato,
00:09:13
llenándola, vaciándola, llamándolo a los métodos que hemos hecho.
00:09:17
Ya está, llama a los métodos y se acabó.
00:09:22
Vale, vamos a probar por si algo se nos ha escapado y no nos funciona.
00:09:28
Claro, para la segunda porque como he hecho un copia y pega,
00:09:34
ahí queda el mensaje muy feo. Vamos a cambiarlo.
00:09:37
La capacidad máxima para la cafetera.
00:09:40
Así mejor.
00:09:47
Vale, vamos a ver si nos funcionaría.
00:09:49
Venga, pues esta cafetera que acaba de arrancar tiene hasta 200.
00:09:54
¿Qué cantidad actual tiene en el momento del arranque?
00:09:58
En el momento del arranque no lo detecta ella sola.
00:10:01
En el momento del arranque tiene 50.
00:10:04
Vale, y ahora ya empieza el software.
00:10:07
Venga, vamos a llenarla.
00:10:10
Pues ya está llenada.
00:10:12
Vamos a... lo que pasa es que como no tenemos una opción de menú,
00:10:16
que sería interesante ver la cantidad que tiene en ese momento,
00:10:19
no podemos comprobar si lo está haciendo bien o mal,
00:10:22
servir taza.
00:10:25
¿De qué vas a servir la taza? Pues la voy a servir de 30.
00:10:27
Pues ya está, ya está servida.
00:10:30
Vamos a agregar café. ¿Cuánto quieres agregar? Pues 50.
00:10:34
Si hubiéramos incorporado un menú que fuera ver la cantidad actual que tiene,
00:10:39
podríamos comprobar si realmente el servir taza y agregar y está funcionando,
00:10:44
pero bueno, es evidente que va a estar funcionando.
00:10:48
Y así ya está. Entonces, bueno, no parece que se nos haya escapado nada.
00:10:51
Bueno, pues esto ya está.
00:11:05
Entonces este ejercicio implica una única clase,
00:11:10
porque solo hay una entidad con la que trabajar, la cafetera,
00:11:14
y ahora ya el main, sí o sí.
00:11:17
Lo normal es que una aplicación tenga muchas más clases
00:11:20
y un main ya que trabaja con muchas de ellas.
00:11:23
La siguiente, por ejemplo, ya he incorporado dos clases.
00:11:31
Se supone que este ejercicio 4 es una aplicación para gestionar
00:11:37
el número de funciones y los precios que tiene un teatro.
00:11:42
Se supone que este ejercicio 4 es una aplicación para gestionar
00:11:50
pues nada, para gestionar el número de funciones
00:11:55
y los precios que tiene un teatro.
00:12:00
Entonces, nos dicen eso así en general.
00:12:07
Pues nada, un teatro puede tener varias funciones,
00:12:10
bueno, en este caso solo 4, va a tener 4 funciones cada día,
00:12:13
cada función va a tener un nombre, un precio,
00:12:18
el teatro a su vez tiene las funciones y tiene el nombre,
00:12:20
y vas a tener que gestionar cositas de eso.
00:12:23
Vale, pues entonces, después de hacer el análisis,
00:12:27
aquí llegaríamos rápidamente a la conclusión
00:12:30
de que aquí hacen falta dos clases,
00:12:32
porque hay dos entidades a gestionar.
00:12:34
El teatro, que tiene nombre y funciones,
00:12:37
pero es que cada función no puede ser un simple string,
00:12:40
o un simple int, no, porque cada función a su vez
00:12:44
tiene dentro nombre y precio,
00:12:48
con lo cual ya son dos entidades,
00:12:52
del momento en que necesitamos algo,
00:12:54
que no puedo describir con un simple string
00:12:56
o con un simple número, pues necesito una clase para ello.
00:12:58
Y función no la puedo describir con un simple string
00:13:03
o un simple número, porque función tiene dentro nombre,
00:13:05
precio, con lo cual función tiene su propia clase.
00:13:08
Y teatro tiene su propia clase,
00:13:12
porque tiene dentro su nombre, sus funciones,
00:13:14
luego ya son dos clases,
00:13:17
cada una de ellas con sus apartaditos dentro,
00:13:19
ya son dos clases.
00:13:21
Vale, pues entonces se empieza a programar
00:13:23
desde la más pequeñita hasta la más grande,
00:13:25
entonces teatro va a contener dentro funciones.
00:13:27
Pues primero programa función, que no depende de nadie.
00:13:30
Y luego ya programa teatro,
00:13:33
que depende de la existencia de funciones,
00:13:34
porque teatro tiene dentro funciones.
00:13:36
Entonces primero programa la que no necesita
00:13:39
de las demás para existir.
00:13:41
Pues aquí función no necesita de las demás,
00:13:43
porque función tiene nombre, que es un string,
00:13:45
y precio, que es un int.
00:13:47
Ya está.
00:13:49
Pues puedo programar función perfectamente,
00:13:50
que no depende de nadie.
00:13:52
Nombre, string, precio, int.
00:13:53
Pues esa es la primera que programamos.
00:13:55
Función, que la tenemos perfectamente caracterizada.
00:13:57
Tiene nombre y precio.
00:14:00
Vale, pues venga.
00:14:04
Cuatro.
00:14:06
Pues venga, la primera que programaríamos
00:14:17
sería esa función.
00:14:19
Public fuera.
00:14:28
¿Qué caracteriza a cada función?
00:14:32
El nombre y el precio, ¿no?
00:14:35
Es lo que decía el enunciado.
00:14:38
Nombre y precio.
00:14:40
Decido yo qué tipo de dato refleja mejor
00:14:42
esas propiedades.
00:14:46
El nombre, un string, está claro.
00:14:47
Ese es el tipo de dato que mejor lo refleja.
00:14:50
El precio, pues un daven.
00:14:52
No hacen falta más propiedades.
00:14:56
Pues ya está.
00:14:58
Las propiedades de función están.
00:14:59
Lo siguiente que hacemos siempre por sistema,
00:15:03
por su utilidad.
00:15:06
El constructor con parámetros.
00:15:08
Para la vez que instanciamos,
00:15:10
dar valor a las propiedades.
00:15:12
Ahora ya tenemos el constructor con...
00:15:21
...el constructor con parámetros.
00:15:24
Vale, a ver.
00:15:36
¿Función es interesante que tenga algún método?
00:15:37
¿O me han dicho aquí que tiene que tener algún método
00:15:40
para hacer cosas?
00:15:43
Porque aquí ya me dan el diseño hecho.
00:15:44
Vale.
00:15:48
El precio de una función
00:15:50
tiene que poder ser cambiado.
00:15:52
Bueno, pues aquí ya identifico una primera acción
00:15:55
a realizar con las funciones.
00:15:58
Cambiar su precio.
00:16:00
¿Vale?
00:16:02
Esa es una acción que afecta a las funciones.
00:16:03
Cambiar el precio de la función.
00:16:06
Luego, como es una acción que afecta a la función,
00:16:08
el mejor sitio para que estés en un método
00:16:12
de la clase función.
00:16:14
¿Vale?
00:16:16
Pero de nuevo insisto lo de siempre.
00:16:17
Diseños para una aplicación hay millones.
00:16:20
¿Vale?
00:16:23
Hay millones.
00:16:24
De alguna manera hay que seguir ciertas pautas,
00:16:25
ciertos estilos de programación.
00:16:27
Entonces las acciones que trabajan con un objeto
00:16:29
dentro de una aplicación,
00:16:32
lo ideal es que yo las recoja todas ellas
00:16:34
en un método de esa clase.
00:16:37
Podría no diseñarlo así.
00:16:39
Y podría hacer un mail que hace todo eso.
00:16:40
Cambiar el precio de la función,
00:16:42
llamando directamente la propiedad precio,
00:16:44
pero sería una aplicación muy mal hecha.
00:16:46
Mejor lo meto en un método.
00:16:48
Y el mail que llame al método y se acabó.
00:16:50
Me va a quedar el mail mucho más claro.
00:16:52
Bueno, pues este es un caso.
00:16:54
Hay una acción que trabaja sobre la función,
00:16:56
que es cambiar un precio.
00:16:58
Pues el sitio ideal para que esté esa acción
00:17:00
es guardadita en un método
00:17:02
dentro de la clase función.
00:17:04
Eso es un sitio ideal para estar.
00:17:05
Y no en un mail, no en el mail.
00:17:07
El sitio ideal es que esté ahí.
00:17:09
Pues venga, vamos a hacer un método.
00:17:11
¡Adiós!
00:17:13
Vamos a hacer un método
00:17:16
dentro de la clase función
00:17:18
para cambiar el precio.
00:17:20
Vale.
00:17:22
Pues el nombre está claro.
00:17:25
¿Necesito alguna información desde fuera
00:17:27
para cambiar el precio?
00:17:29
¿Sí o no?
00:17:32
¿Eh?
00:17:35
No, el precio nuevo, claro.
00:17:36
Pues bueno, imaginemos que...
00:17:39
Lo podríamos llamar precio.
00:17:42
Bueno, por variar lo llamo nuevo precio.
00:17:44
Y en este caso estamos en el de siempre.
00:17:46
El método es esto.
00:17:49
No es más que esto.
00:17:51
¿Vale?
00:17:52
No es más que esto.
00:17:53
Luego no necesita devolver nada
00:17:54
porque el efecto, la acción del método
00:17:57
ya se queda reflejado
00:17:59
en la modificación que hace de este precio.
00:18:02
Esta propiedad se queda modificada.
00:18:05
Se queda modificada.
00:18:07
Se queda modificada y ese es su efecto.
00:18:09
Aquí el dis de nuevo no me hace ninguna falta.
00:18:12
Bueno, pues a la...
00:18:16
Estas funciones
00:18:18
se caracterizan por su nombre y precio
00:18:20
y además puedo cambiarles el precio
00:18:22
si me da la gana.
00:18:24
No puedo cambiarles el nombre,
00:18:25
no puedo hacer otras cosas,
00:18:27
pero cambiar el precio a través de este método sí.
00:18:28
Vale.
00:18:31
Siguiente clase.
00:18:32
Teatro.
00:18:33
Teatro dependía de función
00:18:34
porque teatro tiene dentro objetos función.
00:18:36
Luego, por eso hemos probado función antes,
00:18:38
la que no depende de ninguna otra.
00:18:40
Pues venga, la clase teatro.
00:18:43
Vale.
00:19:02
Pues esta clase, ¿por qué se caracteriza?
00:19:03
Un teatro tiene
00:19:06
su nombre,
00:19:08
eso está claro, un string, no hay tutía.
00:19:10
Y luego tiene dentro
00:19:12
cuatro funciones distintas que representa.
00:19:14
Cuatro funciones, cada una de ellas con su nombre y su precio.
00:19:16
Tiene cuatro funciones.
00:19:18
Entonces, hombre, bueno,
00:19:20
pues tal y como me han planteado este enunciado,
00:19:22
pues puedo resolverlo
00:19:24
de diferentes maneras.
00:19:26
Esta en realidad sería una, ¿verdad?
00:19:28
Su nombre,
00:19:30
está claro, es este.
00:19:32
Y además tiene dentro
00:19:34
cuatro objetos función
00:19:36
que caracterizan a ese teatro.
00:19:38
Pues hombre, podríamos hacer esto, ¿no?
00:19:40
Esto lo puedo hacer, no está mal.
00:19:48
F1 es la primera función,
00:19:51
toda ella, de ese teatro.
00:19:53
F2 es la segunda función, toda ella.
00:19:55
F3 es la tercera función, toda ella.
00:19:57
Y F4 es la cuarta función,
00:19:59
cada una de ellas tiene su nombre y su precio.
00:20:01
Vale, no penséis que, hombre,
00:20:04
queda un poco feo, ¿no?
00:20:06
Cuando ya empiezan a ser una, dos, tres,
00:20:08
queda un poco feo.
00:20:10
Sería casi mejor meterlo en una estructura de datos.
00:20:12
Ahora mismo, como estructura de datos,
00:20:14
solo conocemos el array.
00:20:16
Entonces,
00:20:18
mucho mejor
00:20:20
así, más bonito.
00:20:22
Y así hago esta clase
00:20:24
más genérica.
00:20:26
Porque así de golpe
00:20:28
me he hecho una clase de teatro
00:20:30
que puede contener cuatro.
00:20:32
Pero si en un momento dado
00:20:34
el teatro cambia y puede albergar hasta siete,
00:20:36
pues también caben siete ahí.
00:20:38
Entonces la he hecho
00:20:40
más genérica que la otra
00:20:42
que tenía solo F1, F2, F3 y F4.
00:20:44
Bueno, pues
00:20:48
entonces, esto
00:20:50
es lo que se conoce
00:20:52
como agregación en realidad,
00:20:54
pero es un nombre que no nos dice nada
00:20:56
que nosotros no sepamos.
00:20:58
Una clase puede tener propiedades
00:21:00
que a su vez son de otra clase.
00:21:02
Anda claro, porque las propiedades son variables.
00:21:04
Y las variables pueden ser
00:21:06
primitivo u objeto. Ya lo sabemos
00:21:08
que las variables pueden ser primitiva u objeto.
00:21:10
Pues esta variable es de tipo objeto,
00:21:12
un array de funciones.
00:21:14
Cualquier propiedad puede ser
00:21:16
tipo objeto, tipo primitivo,
00:21:18
la que interese.
00:21:20
Como la clase clientes pedidos
00:21:22
en el ejemplo que arrancamos,
00:21:24
el cliente puede tener
00:21:26
dentro su objeto pedido, claro, ¿por qué no?
00:21:28
Es una variable más.
00:21:30
Bueno, pues eso
00:21:34
se le da nombre, porque a todos se le da nombre.
00:21:36
Y ese nombre es
00:21:38
o agregación o composición, cualquiera de los dos
00:21:40
lo podéis encontrar.
00:21:42
Es decir,
00:21:48
un objeto tenga dentro otro,
00:21:50
es una agregación o una composición.
00:21:52
Vale, entonces el teatro este,
00:21:58
pues,
00:22:00
como siempre, lo ideal es que uno haga un constructor.
00:22:02
Vale, a ver,
00:22:24
ya está enunciado, ¿hay algún otro método
00:22:26
que interese poner en función para que luego
00:22:28
llame el main?
00:22:30
Cambiar,
00:22:34
cambiar el nombre del teatro.
00:22:36
Bueno, pues venga, vamos a
00:22:38
cambiar el nombre del teatro. Pues cambiar el nombre
00:22:42
del teatro tiene poco que
00:22:44
poner.
00:22:46
Cambiar nombre,
00:22:50
pues habrá que pedir el nombre nuevo,
00:22:52
habrá que pasarle el nombre nuevo
00:22:54
y ya está.
00:22:56
Y dárselo.
00:22:58
Vale,
00:23:04
entonces vamos a añadir algún otro método
00:23:06
para poder hacer algún main un poco más operativo.
00:23:08
Vale, y para trabajar
00:23:10
un poco con este array.
00:23:12
Porque si no,
00:23:14
se nos queda aquí el main
00:23:16
que le va a tocar hacerlo todo el main.
00:23:18
Bueno.
00:23:20
Vale,
00:23:24
vamos a agregar por ejemplo
00:23:26
este método.
00:23:28
Bueno,
00:23:32
no los pongo así, así mejor.
00:23:34
Vale.
00:23:36
Que agrega una
00:23:44
función
00:23:46
al teatro.
00:23:48
Vale, vamos a
00:23:50
cambiar, vamos a
00:23:52
enriquecer
00:23:56
un poco este ejercicio,
00:23:58
vamos a enriquecerlo un poco
00:24:00
y vamos a plantearlo de esta manera.
00:24:02
Vamos a hacer otro constructor diferente,
00:24:04
porque constructores puede haber
00:24:06
todos los que uno quiera.
00:24:08
Vamos a hacer otro constructor que reciba solo el nombre.
00:24:10
Vale, este es otro constructor.
00:24:16
Entonces, este constructor
00:24:18
es muy útil cuando hay
00:24:20
clases que tienen
00:24:22
como propiedades
00:24:24
conjuntos de otras cosas.
00:24:26
Entonces primero creas el objeto
00:24:28
y luego
00:24:30
las funciones que ya se vayan agregando después.
00:24:32
Bueno, pues tiene sentido
00:24:34
ese constructor.
00:24:36
Este constructor lo usaremos
00:24:38
cuando queramos crear
00:24:40
el teatro, primero lo creamos vacío
00:24:42
sin funciones.
00:24:44
Y luego ya a través de un método abajo
00:24:46
vamos agregando funciones
00:24:48
según vayamos queriendo.
00:24:50
¿Vale?
00:24:54
Pues nada, yo aquí tengo, bueno,
00:24:56
me faltaría obviamente completar
00:24:58
el constructor.
00:25:00
Vale, y ahora
00:25:06
vamos a hacer un método que agrega
00:25:08
una función
00:25:10
al teatro. Entonces
00:25:12
devolvería void
00:25:14
porque el resultado de este método
00:25:16
es que este array
00:25:18
incorpore esa otra función.
00:25:20
Entonces el resultado del método
00:25:22
se queda en ese array.
00:25:24
Vale, voy a
00:25:26
agregar función.
00:25:28
¿Qué parámetro le pasamos?
00:25:32
El nuevo objeto
00:25:34
función que hay que agregar a ese array.
00:25:36
Es una variable,
00:25:38
objeto normal de corriente.
00:25:40
Bueno, pues así.
00:25:42
¿Verdad?
00:25:44
Tenemos que
00:25:48
empezar ya a manejar variables primitivas,
00:25:50
variables objeto, en plano
00:25:52
de igualdad completamente.
00:25:54
Me da igual que una variable sea int,
00:25:56
sea función, a la hora
00:25:58
de declararla, a la hora de pasarla como parámetro,
00:26:00
me da igual.
00:26:02
Su funcionamiento no es el mismo
00:26:04
porque esto es una dirección de memoria
00:26:06
que tiene dentro función punto
00:26:08
precio, función punto.
00:26:10
Pero a la hora de declararla y pasarla,
00:26:12
o sea, esta cabecera
00:26:14
a nadie le
00:26:16
produce problemas. Tengo que pasar un objeto
00:26:18
función. Y ahora
00:26:20
este método
00:26:22
tendrá que
00:26:26
agregar esa función
00:26:28
a este array.
00:26:30
Es decir,
00:26:32
hacer el rollo de siempre,
00:26:34
aumentarlo en una posición
00:26:36
y en la posición nueva que he creado
00:26:38
¿vale?
00:26:40
Pues ya está. Podría ser un método.
00:26:42
Vamos a dejarlo hecho
00:26:46
rápidamente. Entonces esto
00:26:48
lo hemos hecho un montón de veces.
00:26:50
Esto sería, haríamos
00:26:52
un array auxiliar de funciones
00:26:54
que
00:27:00
sería así.
00:27:04
Un array de funciones
00:27:06
con una posición más que este otro.
00:27:08
Funciones
00:27:14
punto length
00:27:16
más uno.
00:27:18
¿Verdad? Hacemos un array con una
00:27:20
posición adicional
00:27:22
al de funciones.
00:27:24
Hacemos un array con una posición adicional.
00:27:26
Copiamos uno
00:27:28
en el otro.
00:27:30
Menor que
00:27:32
funciones
00:27:34
punto length.
00:27:36
Incrementando
00:27:38
y
00:27:40
aux de y
00:27:42
igual a
00:27:44
funciones
00:27:46
de y.
00:27:48
Una vez que hemos terminado de copiar
00:27:50
uno en el otro, en la posición adicional
00:27:52
de aux que hemos creado
00:27:54
que es
00:27:56
aux punto length
00:27:58
menos uno. Es su última
00:28:00
posición. Ponemos
00:28:02
la última función creada.
00:28:04
Y ahora ya
00:28:08
asignamos a funciones aux.
00:28:10
Lo que hemos hecho siempre.
00:28:18
Crea un array adicional con una posición
00:28:24
más. Copia
00:28:26
el viejo en el nuevo, posición
00:28:28
por posición. En la posición
00:28:30
adicional copia el nuevo objeto,
00:28:32
el nuevo elemento y ahora
00:28:34
reasigna para que
00:28:36
funciones ahora pase a ser
00:28:38
el nuevo array.
00:28:40
Este método es un método
00:28:42
que nos permite... Le das un objeto
00:28:44
de función y te lo agrega
00:28:46
el array.
00:28:48
Chao.
00:28:54
Sobre este código en particular.
00:28:58
¿Alguien prevé que en algún
00:29:00
momento, alguna situación pueda haber algún problema?
00:29:02
Seguro que sí, ¿no?
00:29:06
Que la primera vez
00:29:16
que llamemos a agregar función
00:29:18
funciones es null todavía.
00:29:20
La primera vez que lo llamemos.
00:29:22
Entonces funciones punto length
00:29:24
nos va a dar un null pointer exception.
00:29:26
¿No?
00:29:30
Cuando se crea el objeto teatro por primera vez
00:29:32
este array es null.
00:29:34
Ese array es null cuando se crea
00:29:36
por primera vez. Es null.
00:29:38
Con lo cual por...
00:29:40
Si ese array es null
00:29:42
yo no puedo llamar
00:29:44
a funciones punto length
00:29:46
porque esto es null y me va a decir
00:29:48
no puedes hacer llamar a nada de un null.
00:29:50
Te da un null pointer exception.
00:29:52
¿Vale?
00:29:54
Claro, es que aquí
00:29:56
tendríamos que distinguir
00:29:58
si funciones es null
00:30:00
entonces funciones
00:30:02
si funciones
00:30:06
es null
00:30:08
entonces
00:30:12
ahora ya le creamos su primera
00:30:14
posición
00:30:16
y única new
00:30:20
función de uno
00:30:22
y a esa única posición
00:30:32
a esa única posición que acabo de crear
00:30:38
le asignamos esto.
00:30:40
¿Vale? Le asignamos esto.
00:30:42
Y si no
00:30:44
si no es null
00:30:46
entonces ahora ya
00:30:48
sí que
00:30:50
aplica todo esto de aquí.
00:30:52
¿Vale?
00:30:56
Si es la primera vez
00:30:58
que llamo a agregar
00:31:00
función, esto es un null
00:31:02
entonces si es null
00:31:04
lo creo dándole una única
00:31:06
posición y a esa única posición
00:31:08
le asigno esta. Pero si no es
00:31:10
null porque ya tiene posiciones, pues ahora ya
00:31:12
sí. Le doy
00:31:14
un auxiliar con una posición más
00:31:16
copio
00:31:18
el viejo en el nuevo
00:31:20
asigno a la última
00:31:22
posición creada
00:31:24
la función nueva y reasigno.
00:31:26
¿Vale? Esto es
00:31:44
el repaso de lo que hemos
00:31:46
hecho otras veces. ¿Vale? Para que
00:31:48
no se nos olvide programar en general.
00:31:50
Programar en general.
00:31:52
¿Vale? Aquí este else
00:31:54
queda un poco feo porque es un else que
00:31:56
tiene un montón de cosas ahí dentro.
00:31:58
Es un else que queda un poco feo. Entonces me puedo
00:32:00
aprovechar de una cosa
00:32:02
y es acordaros del retune.
00:32:04
¿Para qué me servía el retune en los métodos?
00:32:06
El retune servía cuando yo quería
00:32:08
devolver un valor. Pero es que además
00:32:10
de devolver un valor, finaliza
00:32:12
el método. El método se acaba. Y se acabó.
00:32:14
El método se acaba. Claro, pero es que
00:32:16
el retune lo podemos utilizar también
00:32:18
para salir de un método
00:32:20
void poniendo retune sin nada más.
00:32:22
Entonces
00:32:24
si yo hago aquí un retune
00:32:26
el retune lo puedo poner sin
00:32:30
nada detrás cuando el método
00:32:32
devuelve void. Cuando devuelve
00:32:34
void puedo poner el retune sin nada.
00:32:36
Si el método devuelve int, double,
00:32:38
debo poner el retune con el valor que sea. Con el int,
00:32:40
con el dado, el obligatorio.
00:32:42
Pero si el método devuelve void, pongo el retune sin nada.
00:32:44
¿Y para qué me ha servido
00:32:46
poner aquí el retune? Pues cuando yo
00:32:48
pongo un retune, el método
00:32:50
termina. El método
00:32:52
termina. Con lo cual me ahorro
00:32:54
el tener que poner este else y la
00:32:56
tabulación.
00:32:58
Porque yo ahora ya
00:33:00
quito esto y me queda más bonito.
00:33:02
¿Por qué?
00:33:04
¿Por qué ahora qué ocurre?
00:33:10
Si funcionas es igual a null.
00:33:12
Haces esto y terminas.
00:33:14
Se acabó. No hay más que hacer.
00:33:16
Método acabado. Retune fuera. Se acabó.
00:33:18
Con lo cual nunca llegarías aquí.
00:33:20
Si entró en el if
00:33:22
nunca vas a llegar ahí. Luego no hace falta
00:33:24
ponerlo en un else. No hace falta.
00:33:26
Porque si entró en el if, ahí, paf.
00:33:28
Método terminado. Se acabó.
00:33:30
Entonces no hace falta que yo meta esto en un else.
00:33:32
Porque si ha llegado aquí
00:33:34
es porque no entró en el if.
00:33:36
Si ha llegado aquí es porque no entró en el if.
00:33:38
Luego es como ponerlo en un else. Es igual.
00:33:40
Y así me queda más bonito. No puedo poner
00:33:42
todo eso ahí metido.
00:33:44
¿Vale? Pues entonces
00:33:50
el retune, por tanto,
00:33:52
se puede poner
00:33:54
en un método que devuelva void también.
00:33:56
No es obligatorio.
00:33:58
Como en los métodos que devuelven algo.
00:34:00
En los métodos que devuelven algo el retune es obligatorio.
00:34:02
Hay que poner retune y el valor que siga.
00:34:04
Es obligatorio.
00:34:06
Pero en los métodos que devuelven void el retune
00:34:08
lo puedo poner o no. Porque ya el método va a acabar
00:34:10
en cualquier caso, al final.
00:34:12
Si lo pongo
00:34:14
significa ahí se acaba.
00:34:16
Y lo que hay después
00:34:18
no se va a ejecutar nunca.
00:34:20
Pues en este caso, ¿para qué me sirve ponerlo?
00:34:22
Para ahorrarme el else.
00:34:24
Y para que quede más bonito el código.
00:34:26
Solo para eso. Para que quede más bonito el código.
00:34:28
Me está siguiendo. ¿Vale?
00:34:30
Porque si entró aquí
00:34:34
nunca va a llegar ahí.
00:34:36
Y si llega aquí es que nunca entró aquí.
00:34:38
Entonces me ahorro.
00:34:40
¿Vale?
00:34:42
Vale, entonces
00:34:44
para comprobar
00:34:46
que este agregar función nos funciona
00:34:48
deberíamos hacer un método
00:34:50
que muestre las funciones que tiene el teatro.
00:34:52
Porque si no, vamos a hacer un método
00:34:54
de mostrar funciones.
00:34:56
El método de mostrar funciones
00:35:00
pues vamos a hacerlo con un for each
00:35:02
de estos. Para cada
00:35:04
función f
00:35:06
en las
00:35:08
funciones del teatro
00:35:10
pues vamos a mostrar
00:35:12
nombre
00:35:16
de la función
00:35:18
f.nombre
00:35:22
y precio.
00:35:26
Precio de esa función
00:35:38
f.precio
00:35:40
¿Vale? F es
00:35:46
todas y cada una de las funciones
00:35:48
de ese array.
00:35:50
Pues para cada función
00:35:52
me va a mostrar su nombre
00:35:54
y su precio. Porque f es un objeto.
00:35:56
F es un objeto.
00:35:58
Luego de f lo que tiene sentido mostrar son
00:36:00
sus propiedades internas.
00:36:02
Es lo que tiene sentido mostrar.
00:36:04
Entonces de cada función f de este array
00:36:06
muestro su nombre y su precio.
00:36:08
¿Vale?
00:36:10
¿Vale? Pues ya tenemos la clase
00:36:14
teatro con
00:36:16
eh
00:36:18
me falta la
00:36:22
esta.
00:36:24
¿Vale? Ya tenemos la clase teatro
00:36:28
con un constructor
00:36:30
que le da nombre
00:36:32
con el método agregar función
00:36:34
y mostrar función.
00:36:36
Vamos a hacer un main rápidamente
00:36:38
para ver que esto funciona.
00:36:40
Nos vamos.
00:36:44
Vamos a hacer rápidamente un main. A ver.
00:36:46
Pues venga, vamos a crear el teatro
00:36:56
lo primero.
00:36:58
Vamos a crear el teatro.
00:37:04
Para no perder el tiempo pidiendo
00:37:06
por teclado lo voy a
00:37:08
dar directamente el nombre.
00:37:10
Uy.
00:37:16
Vale.
00:37:30
Entonces el teatro está creado con ese nombre.
00:37:32
Pero su array de funciones es nulo.
00:37:34
No tiene ninguna función.
00:37:36
Venga, pues vamos a ir agregándole funciones
00:37:38
y luego mostrándolas a ver si las agrega.
00:37:40
Pues por ejemplo, vamos a crear aquí
00:37:42
una función primero.
00:37:44
Una función
00:37:46
F1 a través del constructor.
00:37:48
La voy a crear
00:37:52
en lugar de pedir por teclado para que sea más rápido
00:37:54
le voy a dar directamente los valores.
00:37:56
Pues venga.
00:37:58
Función 1 y el precio
00:38:02
va a ser 54.
00:38:04
Este es un objeto función.
00:38:06
Pues vamos a agregárselo al teatro.
00:38:08
Teatro punto
00:38:10
agregar función F1.
00:38:12
Y vamos a ver si realmente
00:38:14
la ha agregado mostrándolas.
00:38:16
Mostrar funciones.
00:38:18
Vamos a hacer
00:38:20
lo mismo con otra función.
00:38:22
Vamos a crear otro objeto
00:38:28
función F2
00:38:30
función 2
00:38:32
precio 64.
00:38:34
Este objeto función 2
00:38:36
lo vamos a agregar al teatro.
00:38:38
Se supone
00:38:40
que lo agregará al array.
00:38:42
Y ahora vamos a mostrar los que tiene.
00:38:44
A ver si ahora en ese segundo mostrar funciones
00:38:46
nos muestra las dos.
00:38:48
¿Vale? Está claro lo que
00:38:50
hemos hecho. Un teatro
00:38:52
con nombre y funciones nul
00:38:54
por ahora. Agregamos
00:38:56
una primera y mostramos.
00:38:58
Agregamos una segunda
00:39:00
y mostramos. A ver si
00:39:02
nos sale algún null point de
00:39:04
deceptio, no lo hace bien.
00:39:06
Pues lo ha hecho bien.
00:39:10
Este es el resultado del primer mostrar
00:39:12
donde solo tenía uno.
00:39:14
Y este es el resultado del
00:39:16
segundo mostrar donde ahora tiene las dos.
00:39:18
Entonces pues sí.
00:39:20
Lo ha hecho bien, ahora tiene
00:39:22
las dos y así podríamos seguir agregando
00:39:24
todas las funciones que hicieran falta.
00:39:26
E ir incorporando métodos
00:39:28
pues la función más cara, suma
00:39:30
de todas las funciones, yo que sé. Ahí esta
00:39:32
aplicación ya podría extenderse
00:39:34
con un montón de métodos, funcionalidades
00:39:36
para el teatro, para las
00:39:38
funciones, para lo que fuera.
00:39:40
¿Vale? Pero su diseño de clases
00:39:42
pues sería este.
00:39:44
Que era lo interesante
00:39:46
de este ejercicio, ver un diseño de este tipo
00:39:48
que puede tener unas propiedades que es
00:39:50
de tipo objeto.
00:39:52
Y a partir
00:39:54
de ahí se puede extender.
00:39:56
Pues función más cara.
00:39:58
Mostrar
00:40:00
el nombre de la
00:40:02
función cuyo precio
00:40:04
rebase no sé qué cantidad.
00:40:06
Pues lo que sea, las funcionalidades que se vayan
00:40:08
necesitando.
00:40:10
¿Vale? ¿Alguna pregunta?
00:40:14
Bueno.
00:40:18
¿Habíais hecho esto en Navidad?
00:40:24
¿Alguien?
00:40:26
¿Miguel?
00:40:28
No te des miedo que te vayan a
00:40:30
fusilar.
00:40:32
Bueno. Pues a ver.
00:40:36
Tenéis esto de aquí
00:40:38
para hacer esta tarde.
00:40:40
Esto que eran
00:40:42
son un poco más sencillos.
00:40:44
Estaban puestos ahí con la idea de
00:40:46
hacer hoy el repaso.
00:40:48
Espero que lo hemos
00:40:50
hecho corrigiendo esto.
00:40:52
Conclusión, que lo estudiéis todo, que lo hagáis todo,
00:40:54
que lo repaséis todo, porque tenemos que contar
00:40:56
muchísimas, muchísimas cosas más.
00:40:58
Muchas más.
00:41:00
Y hay que ir avanzando.
00:41:02
Pues venga.
00:41:04
A estudiarlo todo.
00:41:06
- Subido por:
- Raquel G.
- Licencia:
- Todos los derechos reservados
- Visualizaciones:
- 6
- Fecha:
- 8 de enero de 2024 - 13:33
- Visibilidad:
- Público
- Centro:
- IES ROSA CHACEL
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1280x720 píxeles
- Tamaño:
- 783.36 MBytes