franciscogazitua / IIC2113-2024

Consultas sobre el proyecto en las Issues
4 stars 0 forks source link

[E3] Duda implementación vista #92

Open agustind1 opened 4 months ago

agustind1 commented 4 months ago

Hola! tengo dudas sobre cómo implementar la vista para cumplir con el MVC. ¿Puedo aprovechar la clase View que ya está en el proyecto Fire-Emblem-View para agregarle nuevos métodos que manejen los distintos mensajes de mi juego? Por ejemplo, agregar a View un método que se encargue de mostrar la selección de equipos. ¿O debería crear una nueva clase en el proyecto Fire-Emblem-View que tenga los output del juego y que ocupe la clase View? Agradezco si me pueden aclarar un poco cómo sería la implementación de la vista aprovechando el proyecto View ya existente.

agustind1 commented 4 months ago

Otra duda con respecto a esto, es que si tengo la vista en el proyecto View, no puedo importar el namespace de Fire-Emblem para utilizar las estructuras de datos como Unit, ya que se genera una dependencia circular. ¿Cómo puedo solucionar esto?

RodrigoToroIcarte commented 4 months ago

Hola! tengo dudas sobre cómo implementar la vista para cumplir con el MVC. ¿Puedo aprovechar la clase View que ya está en el proyecto Fire-Emblem-View para agregarle nuevos métodos que manejen los distintos mensajes de mi juego? Por ejemplo, agregar a View un método que se encargue de mostrar la selección de equipos. ¿O debería crear una nueva clase en el proyecto Fire-Emblem-View que tenga los output del juego y que ocupe la clase View? Agradezco si me pueden aclarar un poco cómo sería la implementación de la vista aprovechando el proyecto View ya existente.

Crea una nueva view. Una hecha a la medida. Y trata nuestra view como una librería externa. Por ejemplo, acá puse todo el código base del view en una carpeta (para que no moleste) y el view del proyecto mismo es el FireEmblemView:

Screenshot from 2024-05-31 13-36-37

El FireEmblemView recibe el view del código base (pues lo necesita para hacer prints y pedir cosas). También tiene métodos para mostrar cosas (que son delegados a otras clases dentro del view):

Screenshot from 2024-05-31 13-38-04

Luego en tu Game.cs puedes crear el objeto FireEmblemView a partir del view que les damos nosotros en el constructor. Así todo seguirá funcionando igual que antes (incluido los test cases):

Screenshot from 2024-05-31 13-40-37

RodrigoToroIcarte commented 4 months ago

Otra duda con respecto a esto, es que si tengo la vista en el proyecto View, no puedo importar el namespace de Fire-Emblem para utilizar las estructuras de datos como Unit, ya que se genera una dependencia circular. ¿Cómo puedo solucionar esto?

Para esto sirve el proyecto Model. Eso te permite eliminar la dependencia circular. Por ejemplo, acá tengo la lógica de los neutralizadores en mi controlador:

Screenshot from 2024-05-31 13-43-18

Como está en mi controlador, no puede meter un método a view que reciba un neutralizador (porque genera una dependencia circular). La solución es mover esas clases al modelo:

Screenshot from 2024-05-31 13-44-32

Ahora que los neutralizadores están en el modelo, la vista y el controlador pueden mirar al modelo sin problemas. No hay dependencias circulares. Eso permite que la vista ahora sí pueda tener un método que recibe un neutralizador (o una unidad, o cualquier cosa que sea parte del modelo):

Screenshot from 2024-05-31 13-46-08

agustind1 commented 4 months ago

Perfecto, muchas gracias!

agustind1 commented 4 months ago

Aunque con respecto a crear una nueva clase FireEmblemView en vez de utilizar la clase View ya existente no me queda muy claro para qué, es una cosa de orden solamente?

RodrigoToroIcarte commented 4 months ago

Sí... es un poco para separar responsabilidades. Y, en parte, porque echarte la clase View hará que te eches los test cases. Si quieres modificar el View directo igual está bien. Aunque deberías hacer privados los métodos de WriteLine y ReadLine porque la idea es que no sean usados directamente por el controlador :)