Se solicita información sobre el paradero del estudiante Arshak Karhanyan

Clase 7

Viernes (Noche, 2025)

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
  • 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