IIC2233 / syllabus-2020-2

Repositorio oficial del curso IIC2233 Programación Avanzada 🎉🎊
https://iic2233.github.io
7 stars 57 forks source link

No se ejecutan instancias en el main del cliente #1207

Closed joserubiod closed 3 years ago

joserubiod commented 3 years ago

Prerrequisitos

(Marcar colocando una X entre los corchetes los ítems que ya hiciste, así: "[X]")

Duda

Estuve leyendo varias issues con respecto a señales que no se envían. Al principio creí que era eso lo que ocurría pero me di cuenta que lo que pasa es que cuando corro el main se instancia el cliente que recibe datos del server y luego no se siguen instanciando los demás archivos como la interfaz y el backend. Llevo mil horas tratando de arreglarlo pero no encuentro nada.

[De ser necesario, coloca tu pregunta de manera explícita utilizando este formato]

lucas-valenzuela commented 3 years ago

Hola @joserubiod, leí tu código y te puedo señalar lo siguiente:

  1. Estás confundido con el manejo de los clientes. En un archivo client/main.py se debe instanciar solamente un cliente. Esto implica de que cuando quieras probar tu código con N jugadores, deberás ejecutar Narchivos client/main.py en distintas ventanas de la consola. Es incorrecto que tengas dos instancias Cliente llamadas clientey b_cliente.
  2. Ojo que en backend.pyy client.py tienes dos clases con el mismo nombre (Client).
  3. Sobre las señales, te recomiendo fuertemente que implementes una Inferfaz, que se encargue de establecer las conexiones y señales entre el frontend y el backend. Te ayudará muchísimo a estructurar mejor tu código. Las conexiones también las puedes hacer en el main. Pero ojo que actualmente las realizas en client.py que es backend, lo cual no es apropiado. Así, tendrías principalmente estos archivos por cada cliente (los nombres pueden cambiar):
    • client.py: backend que recibe la info del servidor y llama a la interfaz para enviar mensajes al frontend.
    • interfaz.py: punto de conexión entre el back y el front. Acá se instancian las clases del front, las señales y se establecen las conexiones.
    • main.py: instancia a la clase Client
    • archvios del front y secundarios del back

Si decides usar una Interfaz te recomiendo leer la issue #1180, además claramente de la actividad formativa 5, que te puede servir de punto de partida.

Éxito en la tarea!

joserubiod commented 3 years ago

Buena gracias ! Acabo de corregirlo como dices. Puedes echarle una mirada para ver si va bien porfa ?

lucas-valenzuela commented 3 years ago

Hola @joserubiod, gran avance! Felicitaciones

Ojo con lo siguiente: la interfaz debe instanciarse como self.controlador = Controlador(self). Dentro de Cliente nunca debes instanciar o emitir una señal. Lo que se hace en el Clientes es llamar a métodos de la Interfaz que dentro de ellos se emiten las señales correspondientes. Las señales deben instanciarse dentro de la Interfaz (antes del init), no deben pasarse algunas como parámetros.

Entiendo la idea de mensaje_recibido, pero la idea es que cada response distinta tenga su propio método en la Interfaz, y sea desde el Cliente que se llame a un método específico dependiendo del dato.

Sigue así!