Open flbulgarelli opened 3 years ago
Hola @flbulgarelli gracias por el review! No había tenido tiempo de sentarme a digerir toda la info. Paso a comentarte algunas cosas sobre la revisión.
Respecto a los tests, no los iba a escribir y la realidad es que iba a borrarlos porque me acorde que no hace falta escribir código que compile en los diseños. De todas maneras gracias por el consejo del nombre de los métodos eso si lo tomo, al igual que al menos un assert en el test 👯
Respecto de las clases anidadas, lo deje porque no entraba en esta iteración pero nunca mas hago clases anidadas lo juro. Aparte no le da tanta claridad al diagrama como si los tuvieras separados. Tomo la sugerencia de los nombres del builder tambien.
Acá viene algo muy interesante que aprendí en la clase del viernes pasado. NO HAGAMOS INTERFACES CUANDO TODAVIA NO TIENEN SENTIDO. Y me pareció excelente, venia con una malacostumbre del laburo de crear interface para cualquier clase y esta mal a nivel diseño es un sobre diseño. Respecto al tipado si, hay que tipar según la interfaz 📄
El PrendaRepository esta mal, fue una mala interpretación mia del enunciado. El viernes cuando vimos lo de que la app es para usuario dije "que tonto claro" no tenes un PrendaRepository global acá, no tiene sentido, tenes un guardarropa por usuario. Gracias por todas las explicaciones y con la clase del viernes pasado me quedo muchisimo mas claro.
Respecto a 5
@Override
public Atuendo sugerirAtuendo() {
Temperatura temperatura = climaService.getTemperature("Buenos Aires, Argentina");
Atuendo atuendo = obtenerAtuendoSegunTemperatura(temperatura);
return atuendo;
}
Esto lo escribo así porque me es mas fácil debuggear y para mi le da mas claridad al código (construyo la respuesta paso a paso). Pero si a la catedra le gusta mas de la otra forma no hay problema, me adapto.
El 6 esta bien, tenia que aplicar un Adapter ahi, pero no habia leido el apunte antes de codear el TP.
Otra vez lo que me paso en el PrendaRepository, el enunciado lo interprete como que existia un solo usuario entonces tenia objetos globales que resolvian todo para uno solo. Cualquier cosa hice.
Respecto del 8, si vuelvo a que me falto entender bien lo del adapter. Podria haber hecho getTemperature() solo y luego que la implementación de ese servicio sea el AccuWeather con los cambios para que devuelva una temperatura.
9 y 10 Si, genial por las recomendaciones, lo de los if-else no lo habia implementado yo pero quedo de iteraciones pasadas.
Viendo lo que me sugeris en el punto 11, medio que responde la duda de arriba, la idea es usar constructores que me permiten instanciar una prenda nueva y ya, asi como un TipoTemperatura o con un nombre mas lindo unidadTemperatura.
En la justificacion me falto decir que mockeando el servicio getWeather puedo no incurrir en gastos dado que no voy a estar yendo a la api sino a un mock.
CONSULTAS:
Respecto de las prendas mutables tenia una duda que vengo arrastrando hace un par de clases. Como seteo el contexto de mi test si no puedo modificar el estado de una prenda? Creo prendas nuevas y ya?
El diagrama pudiste verlo? Tendras algun feedback, porque por mas que este mal, quiero saber si al menos esta comunicado bien.
Muchas gracias por la corrección.
Saludos Emi
Esto lo escribo así porque me es mas fácil debuggear y para mi le da mas claridad al código (construyo la respuesta paso a paso). Pero si a la catedra le gusta mas de la otra forma no hay problema, me adapto.
No es tanto una cuestión de gustos sino que no es necesario. Además, probablemente cuando vayas a hacer debugging muchas veces var a tener que hacer más modificaciones al codigo para poder realmente recorrerlo paso a paso (desde logs, hasta modificaciones drásticas de la lógica), y no por ello va a quedar en el código final. Además, siempre podrás utilizar herramientas como un evaluador de expresiones o un watch para obtener más información del código en ejecución, aún cuando no tenés variables.
Respecto de las prendas mutables tenia una duda que vengo arrastrando hace un par de clases. Como seteo el contexto de mi test si no puedo modificar el estado de una prenda? Creo prendas nuevas y ya?
¡Exacto! Podés crear esas prendas en un @Before
si son realmente comunes a todos tus casos de prueba, y si no, en el propio método de test.
El diagrama pudiste verlo? Tendras algun feedback, porque por mas que este mal, quiero saber si al menos esta comunicado bien.
Sí, ¡lo veo bien!
¡Buenas!
Te dejo @EMazzaglia te dejo nuestros comentarios:
@DisplayName
, poné nombres de métodos significativos en lugar detest1
y asíassert
Prenda.Builder
en lugar dePrenda.PrendaBuilder
.PrendaBuilder
sería un mejor nombre para una clase sin anidar. Más allá de eso, en cualquier caso creo que será mejor contar con una abstracción con un nombre de dominio, comoBorrador
.PrendaRepository
y una implementación concreta si luego vas a tipar las cosas según la implementación como acá .... https://github.com/mnigliazzo/qmp-grupo10/blob/5f89f971639ef0ad6b41401bd37c64e0a5ef5bf3/src/test/java/tests/service/ClimaServiceTest.java#L21. Recomiendo que no hagas esa separación (en este punto no aporta porque no hay mas de una implementación posible del repositorio) o que si avanzás con ese (pequeño) sobrediseño, tipes los atributos de forma consistente.obtenerPrendaRandom
me suena a que terminará siendo un missplaced method, pero me falta información.... ojo con generar variables que no se reutilizan y generan por tanto confusión. Eso mismo deberías escribirlo de forma más directa: `return obtenerAtuendoSegunTemperatura(climaService.getTemperature("Buenos Aires, Argentina"))
src/test/java
. Opcionalmente podrías implementarlo usando Mockito (ver el TPI2, que tiene varios links, entre ellos este con un resumen de sus operaciones principales)ClimaService
es tu interfaz de alto nivel para interactuar con AccuWeather o proveedores similares. Sin embargo mirá estas firmas: https://github.com/mnigliazzo/qmp-grupo10/blob/5f89f971639ef0ad6b41401bd37c64e0a5ef5bf3/src/main/java/service/ClimaService.java#L10-L12. Si biengetTemperatura
es un mensaje de alto nivel,getWeather
sigue representando al clima como una lista de diccionarios, probablemente con la misma estructura del sistemaAccuWeather
adaptado, acoplándose implícitamente a sus interfaces.Atuendo
expone getters que no parecen ser necesarios y hacen mutable a tu objeto innecesariamente. Lo mismo vale para tu clasePrenda
else
, dado que la excepción corta el flujo de ejecución y podes obviarlo.... si bien esto es mayormente cierto (con la salvedad del punto 8) no terminás de responder cómo harás para probar el código. Por mas que sea una interfaz, si no explicás qué mockearás (y cómo lo harás) no terminará de quedar respondida esta cuestión.
¡Saludos!