IIC2233 / syllabus-2019-1

Repositorio oficial del curso IIC2233 Programación Avanzada 🎉 🎊
43 stars 69 forks source link

Obtener atributos de clase parent. #590

Closed bmurtagh01 closed 5 years ago

bmurtagh01 commented 5 years ago

Con la correcion de la Tarea 2 tengo la duda de como poder acceder datos entre diferentes clases del mismo universo (ej. backend o frontend). Si tengo en mi frontend un clase VentanaPrincipal que es un QMainWindow y guarda variables importantes como usuario, id_sala, etc. Dentro de esta clase yo instancio diferentes ventanas como VentanaChat, VentanaSalas, etc. Yo pretendía agregar dentro de la instancia de estas salas, el "self" de la VentanaPrincipal y guardarla en un atributo self.parent y asi poder acceder a esta Ventana principal (No agrego directamente los atributos especificos porque no siempre estan disponibles o estos cambian), es decir, si el chat quiere el usuario puede acceder de la forma self.parent.usuario.

Hice esto en la Tarea 02 y veo que era muy mala practica, entonces me gustaria saber que formas alternativas (y correctas) hay de comunicacion entre clases, y porque la practica anterior esta mala. Recordar que esto es entre clases del Frontend.

Muchas gracias.

jeschuwirth commented 5 years ago

Hola!

Utilizar un atributo parent para poder acceder a este se conoce como programación circular, personalmente no estoy seguro cual es el problema exacto, pero se nota mucho cuales tareas ocupan señales y cuales no.

Las tareas sin señales y que ocupan programación circular se "lagean" bastante y no permiten más de 10 enemigos, si se colocan más de esa cantidad entonces el programa se detiene o funciona muy lento, mientras una tarea sin programación circular puede fácilmente correr 50 enemigos.

No hay problema con que una ventana contenga a otra, el padre por lo general es muy común que contenga a su hijo (VentanaPrincipal a VentanaJuego por ejemplo), y al crear una clase hijo le puedes entregar información que esta pueda necesitar (Como el usuario), el problema es cuando la clase hijo ingresa a la clase padre para buscar información.

un ejemplo de uso de señales correcto es por ejemplo tener esta función en la clase padre. image La cual conectas con señales a un botón en maingame, entonces si aprietas el botón en el juego principal, bajas el juego ya abres una nueva ventana (mainventana).

En general no te podría dar la razón exacta de cual es el error en utilizar programación circular, pero se nota cuando esta implementada y cuando no, y para evitar problemas se tiene que utilizar señales que conecten métodos de los padres con los hijos sin que los hijos se tengan que meter en su clase padre

Espero haber ayudado con tu duda.