Resumen
- Hablamos sobre Reificar comportamiento y cómo implementarlo
- Mencionamos cuestiones sobre sincronismo y asincronismo.
- Hay diferentes “situaciones” / “sabores” de asincronismo
- Nos importaba realizar una operación no bloqueante: queríamos iniciar el cómputo sin tener que esperar a que termine. Puede que nos interese (o no) el resultado de esa operación.
- Nos interesa difere una acción en el tiempo, de forma que no me importe si se realiza ahora o más tarde. Quizás incluso me interese poder cancelar esa operación antes de que se llegue a culminar o incluso poder deshacerlo luego de que se haya aplicado.
- Nos interesa que una operación no se realice en respuesta a una interacción directa de un actor sino de forma periódica
- Hay distintas soluciones (no necesariamente incompatibles entre sí) al problema
- Cosificar el comportamiento <- es lo que tienen/tenían que ver para esta clase
- Inversión de control / callback <- lo vimos la clase pasada
- Programar orientado a eventos <- es lo que corresponde a la clase que viene
- Hay diferentes “situaciones” / “sabores” de asincronismo
- También respondimos algunas dudas sobre QMP4. A continuación dejamos el código que fuimos escribiendo.
class Clima {
....
}
class GeneradorDeSugerencias {
ServicioMeteorologico servicioMeteorologico
Sugerencia generarSugerencia() {
....
servicioMeteorologico.dameClima()
....
}
}
interface ServicioMeteorologico {
Clima dameClima(lugar)
}
class ServicioMeteorologicoAccuWeather implements ServicioMeteorologico {
Clima dameClima(lugar) {
...hacer llamados http al api de accu weather usando un cliente basado en Retrofit o Jersey...
...retornar un objeto clima compatible con esas respuestas....
}
}
class ServicioMeteorologicoNacional implements ServicioMeteorologico {
Clima dameClima(lugar) {
...hacer llamados http al api de SMN usando un cliente basado en Retrofit o Jersey...
...retornar un objeto clima compatible con esas respuestas....
}
}
// solución basada en herencia usando un template method
// 👍
abstract class ServicioMeteorologico {
Clima dameClima(lugar) {
if (!el resultado ya está guardado) {
resultado = this.dameClimaPosta(lugar)
}
return resultado
}
abstract Clima dameClimaPosta(lugar)
}
// Una solución basada en composición
// 👍
interface ServicioMeteorologico {
Clima dameClima(lugar)
}
class ServicioMeteorologicoConCache implements ServicioMeteorologico {
ServicioMeteorologico servicioMeteorologicoPosta
Clima dameClima(lugar) {
if (!el resultado ya está guardado) {
resultado = servicioMeteorologicoPosta.dameClima(lugar)
}
return resultado
}
}
ServicioMeteorologico unServicio = new ServicioMeteorologicoAccuWeather();
unServicio = new ServicioMeteorologicoNacional();
unServicio = new ServicioMeteorologicoConCache(ServicioMeteorologicoNacional());
unServicio = new ServicioMeteorologicoConCache(ServicioMeteorologicoAccuWeather());
unServicio = new ServicioMeteorologicoDeMentira()
unServicio = mock(ServicioMeteorologico.class)
// corolario: al tener un adapter no solamente gano en extensibilidad
// sino también testeabilidad
enum Formalidad { FORMAL, DE_GALA, ELEGANTE_SPORT, INFORMAL, DE_ENTRECASA
}
class Prenda { Formalidad formalidad
getFormalidad() {
} } ```
Material
Para la próxima clase
Apuntes y ejercicios
- Que Me Pongo Sexta Iteración: no hacer el punto bonus.
- Patrón Observer. Antes de encararlo se recomienda antes leer:
- El ejercicio de Listas de Correo
- La la solución posible. De esta se recomienda omitir el apartado sobre decortator, dado que no es un patrón que trabajemos en la cursada
- Complementario: Sobre los efectos en el Observer