Hola Pepita
Luego de instalar Wollok, y antes de explicar cualquier concepto, presentamos un ejercicio básico. Nuestro favorito (e insignia de Wollok) es Pepita...
Objetivos de esta clase
- Tener una imagen visual de objetos y referencias por medio del diagrama dinámico
- Mandar mensajes que se diferencian entre acciones y consultas
- Concepto de asignación como "apuntar una referencia"
- Introducir un objeto polimórfico
Elementos del lenguaje
objectvaryconstmethod(inline y asignación)- Envío de mensajes
. - Levantar un REPL con la consola
Apuntes teóricos
Presentación del ejercicio
#TODO: Buscar un repo con el ejercicio inicial: vola(kms) y come(comida)
Presentamos los requerimientos del ejercicio:
Pepita es una golondrina que tiene energía. Cuando vuela, gasta energía en función de los kilómetros recorridos. Cuando come, aumenta su energía en función de la comida. Pepita está cansada cuando su energía es mejor a 50.
Mostramos directamente el código:
object pepita {
var energia = 100
method vola(kms) { energia = energia - kms }
method come(comida) { energia = energia + comida.energia() }
method estaCansada() = energia < 50
}
object manzana {
method energia() = 50
}
object alpiste {
const granos = 70
method energia() = granos * 2
}Y lo levantamos en la consola interactiva para ver el diagrama dinámico.
1. Objetos y Referencias
- Definición de programa en objetos:
- "Un programa Wollok está compuesto por objetos que se conocen por medio de referencias".
- Explicación de diagrama dinámico:
- Los objetos son círculos y las referencias son flechas que apuntan siempre a uno de los círculos.
- El diagrama muestra los objetos vivos con sus atributos: referencias que el objeto conoce.
- Las flechas tienen un nombre.
- Explicación del ejemplo:
- pepita conoce al 100 por medio de la referencia
energia. - El alpiste conoce al 70 a través de la referencia
granos. - Los números, que son círculos, también son objetos (que vienen con el lenguaje, por eso tienen otro color).
- Existen referencias variables: que cambian el objeto al que apuntan a través del tiempo. O constantes 🔒: que siempre apuntan al mismo objeto.
- pepita conoce al 100 por medio de la referencia
- Algunas preguntas para hacer:
- ¿La manzana conoce al alpiste?
- ¿El alpiste conoce a alguien como su
energia? - ¿Pepita conoce al 70?
2. Envío de mensajes
- Seguimos definiendo un programa en objetos:
- "Los objetos se conocen por medio de referencias y se mandan mensajes para comunicarse entre sí".
Le envíamos un mensaje a pepita por la consola:
> pepita.estaCansada()
✓ false- Consultar la intuición / lógica. Preguntar: "¿qué piensan que está pasando?"
- La idea es relacionarlo con
method estaCansada() = energia < 50. - Lógicamente: la energía de pepita es 100, que NO es menor a 50, entonces es falso que está cansada.
- La idea es relacionarlo con
- Explicación de la expresión
pepita.estaCansada()- le estamos mandando el mensaje
estaCansada()al objetopepita. - Sintaxis
objeto.mensaje(). Siempre es objeto, seguido de punto., y luego el mensaje terminado en paréntesis para pasar parámetros (como veremos en un rato).
- le estamos mandando el mensaje
- Mensaje y método
- Método lookup: Cuando un objeto recibe un mensaje, ejecuta el método que tenga la misma firma (en Wollok, que tenga el mismo nombre y cantidad de parámetros).
- Diferencia entre mensaje y método: el mensaje se le envía a un objeto para que "pase algo", mientras el método es la definición de ese "algo que debe pasar".
> pepita.algoQueNoEntiende()
✗ Evaluation Error! pepita does not understand algoQueNoEntiende()- Cuando un objeto recibe un mensaje que no entiende se produce un error. En este ejemplo, le estamos pidiendo a pepita algo que no entiende.
- Jugar en la consola (#TODO: hacer después?)
- Decir que los chirimbolos también son mensajes
+ - *que entienden los números. - Evaluar algunas expresiones para mostrar los objetos números, booleanos, strings:
1 + 21 > 2true || false"hola " + "mundo"
- Decir que los chirimbolos también son mensajes
3. Métodos
- Seguimos definiendo qué es un objeto:
- Un objeto tiene un estado interno definido por sus atributos (los objetos que conoce) y un comportamiento definido por sus métodos.
Preguntas gatillo
¿Qué habría que hacer para que pepita esté cansada?
Respuesta: hacer que su atributo energia apunte a un objeto menor que 50.
¿Y cómo podemos cambiar la referencia energia?
Respuesta: Hay que pedírselo al objeto que la posee (de dónde sale la flecha) enviándole un mensaje.
¿Qué otros mensajes le podemos enviar a pepita?
Respuesta: vola(kms) y come(comida)
Le enviamos el mensaje vola(kms) para que baje su energía. ¡Recordá tener visible el diagrama, y de prestar atención a lo que pasa justo cuando mandamos el mensaje!
> pepita.vola(10)
✓[!NOTE] Una posible pregunta al ver la transición en el diagrama es preguntarse: ¿dónde se fue el 100? Por ahora diremos que existe un garbage collector (recolector de basura) que se encarga de llevarse los objetos que no están siendo usados. Hablaremos más sobre garbage collector a lo largo del curso, sobre todo cuando lleguemos al tema clases.
- Definición de
method vola(kms) ( energia = energia - kms )- El parámetro
kmstambién es una referencia, que enpepita.vola(10)va a apuntar al 10. - El objeto apuntado por
energia(un número) se le manda el mensaje-con el objeto apuntado porkms.- El resultado se asigna como la nueva
energia, o sea que esa referencia pasa a apuntar al resultado.
- El resultado se asigna como la nueva
- El parámetro
- Acción vs Consulta
- Diferencias entre los mensajes
pepita.estaCansada()ypepita.vola(10):estaCansada()es de consuta -> devuelve un valor (objeto).vola(kms)es de acción (una orden, de forma imperativa) -> cambia (tiene efecto) del mundo (diagrama).
- Como buena práctica, recomendamos tener esta clasificación exclusiva:
- Si esperamos que un mensaje sea de consulta, que no tenga efecto.
- Si esperamos que un mensaje tenga efecto, que no devuelva nada.
- Diferencias entre los mensajes
- Encapsulamiento
- Cada objeto es dueño de sus atributos
- "Si queremos cambiar la energía de pepita, hay que pedírselo (órden) a pepita"
- Cada objeto es dueño de sus atributos
- Sintaxis
- Métodos de consulta
- Inline (con el
=):method estaCansada() = energia < 50 - Con llaves
( )yreturn:method estaCansada() ( return energia < 50 )
- Inline (con el
- Métodos de acción
- Siempre con llaves
( )y casi nunca conreturn
- Siempre con llaves
- Métodos de consulta
Extra simpático
- Viendo el diagrama, volar lo necesario para que pepita quede con 70 de energía y sorprenderse al vez que tanto
energiacomogramosapuntan al mismo objeto. - Hacer que la energía quede por debajo de 50 y volverle a preguntar
pepita.estaCansada()
4. Polimorfismo
- Seguimos definiendo cómo se usa un objeto:
- Los mensajes que se le manda a un objeto definen una interfaz.
Preguntas gatillo
El método come(comida), ¿es de acción o de consulta?
Respuesta: acción. No devuelve nada, esperamos que cambie la energía de pepita.
¿Y qué objetos espera por parámetro?
Respuesta: una comida, como la manzana o el alpiste.
Hacer que pepita coma ambas comidas, ver el efecto que tiene.
> pepita.come(manzana)
✓
> pepita.come(alpiste)
✓- Seguir la cadena de mensajes en cada caso:
pepita.come/1->comida.energia/0- Entender qué método
energia()se ejecuta en cada caso - Usar el debugger para una mejor experiencia
- Entender qué método
Pregunta gatillo
Si queremos que pepita pueda comer kiwi, ¿qué cambios hay que hacer al programa?
Respuesta: tiene que salir 2 cosas claves: meter un nuevo objeto kiwi que entienda el mensaje energia().
- Concepto de interfaz: para que un objeto sea una comida, tiene que entender el mensaje
energia()y devolver un número. - Mencionar cómo se aprovecha el polimorfismo:
- Ahora pepita puede comer kiwi, pero no tuvimos que tocar a pepita. Extendimos el programa agregando un nuevo comportamiento.
- Los objetos contribuyen (intercambian mensajes) entre sí para producir distintos efectos: la energía aumenta distinta si se come la manzana o el alpiste.
- Si conocen el
if, no hay ninguno en nuestra solución.
Ejercicios similares
Sobre gustos: https://github.com/wollok/objetosGustos Cosas que le gustan a distintas personas.
Jugadores, personajes y elementos: https://github.com/wollok/juegoPersonajesElementos Juego con personajes y elementos.
Wollok Game
Titanic: https://github.com/wollok/TitanicGame Intro a objetos contando la película de Titanic con Wollok Game.
#TODO armar un script para esta clase -> https://www.youtube.com/watch?v=KsagIzpa9Zs&list=PLD2HhVLe8swfrASREMvVy-DRuccfMUvFJ