Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





¿Eventos vs funciones virtuales?

Iniciado por chan, 17 de Diciembre de 2007, 07:01:44 PM

« anterior - próximo »

chan

Buenas,

No se si será buena práctica o no porque no me lo he preguntado hasta ahora, pero la historia es que de siempre he utilizado métodos virtuales y llamadas a funciones, lo explico con código que se entenderá mejor.
Digamos que tengo una clase tal que así:

public void Render()
{
preRender();
//historias variadas, como por ejemplo el render en sí
postRender();
}

public virtual preRender();
public virtual postRender();


, en vez de funcionar a base de eventos, por ejemplo un evento para el preRender y otro para un postRender, lo que suelo hacer es el tipo de cosas que os he puesto en el código de arriba. Después lo que hago es, en la clase que hereda, implementar los métodos virtuales preRender() y postRender().
Os preguntaréis: bueno,¿ cuál es tu problema entonces?, pues el problema es que no se cuál de las dos técnicas es más eficiente, si el uso de funciones virtuales o el uso de eventos.
Yo personalmente pienso que son idénticas las dos formas de trabajar en cuanto a resultados (que alguien me corrija si me equivoco, no se si tengo claro del todo los conceptos), y creo que si hay alguna diferencia importante entre las dos técnicas, quizás sea de rendimiento ...

¿Qué opináis?

Pogacha

¿Como manejarias los eventos?
¿Como es llamada la funcion render?

Pero de todas formas, ambas tecnicas son distintas en cuanto a el orden de ejecución, el numero de llamadas será el mismo y suponiendo que la parte que llame sea en ambos casos optimizada es lo mismo entonces.

Si puede afectar el orden, cuando puedes agrupar por tipo entonces puedes optimizar en algunos casos.

Saludos!

swapd0

¿Eventos? El C++ no tiene eventos, eso quiere decir que tienes que hacer tus rutinas para manejarlos, y a mas codigo mas errores. Ademas creo que siempre seran menos eficientes los eventos, los tienes que crear, meter en una cola, sacarlos y ejecutarlos.

Usa la opcion de las funciones virtuales, todo el mundo (los programadores de C++) entendera el codigo.

chan

Pues generalmente ésa función de render se introduce en un bucle while.
Hasta ahora no he necesitado disparar eventos fuera de aplicaciones de consola, me las he arreglado del modo que comento, porque no le veo la utilidad real a los eventos, puede parecer una locura total, pero en realidad los veo como llamadas a funciones, es decir un evento se dispara cuando se ejecuta cierta acción, y después una función es llamada, lo veo como si dentro de un bucle hicieras un: if(cierta condición) ClaseEstatica.Mifuncion();

De todas formas siento que me estoy perdiendo algo por el camino, porque cuando tanto se utilizan los eventos, será por algo ... ¿Me recomiendas alguna lectura que me pueda hacer ver realmente la utilidad de los eventos?, y no me refiero al típico artículo que te explica que es un evento y se queda ahí, sino a algo que vaya más allá y justifique el uso de eventos frente a otras técnicas ...

chan

Cita de: "swapd0"¿Eventos? El C++ no tiene eventos, eso quiere decir que tienes que hacer tus rutinas para manejarlos, y a mas codigo mas errores. Ademas creo que siempre seran menos eficientes los eventos, los tienes que crear, meter en una cola, sacarlos y ejecutarlos.

Usa la opcion de las funciones virtuales, todo el mundo (los programadores de C++) entendera el codigo.

Buenas swapd0, ¿seguro que C++ no tiene eventos?, me suena haber hecho algo hace tiempo con directx y creo recordar que usé eventos (no se si fué para la entrada de usuario ...)

Me alegra saber que no voy tan mal encaminado con el uso de funciones virtuales, porque la mayoría de programadores que conozco utilizan eventos para todo, y ya estaba empezando a pensar que yo estaba totalmente equivocado o que me fallaban los conceptos ...

swapd0

Cita de: "chan"Buenas swapd0, ¿seguro que C++ no tiene eventos?, me suena haber hecho algo hace tiempo con directx y creo recordar que usé eventos (no se si fué para la entrada de usuario ...)

Estoy al 100% seguro, otra cosa es que las rutinas para leer el teclado con las DirectX las llamen eventos, por la forma de funcionar o por las pajas mentales de microchof.

Tambien las SDL tienen eventos, pero no significa que el C tenga.

chan

Entonces de arte, puedo estar tranquilo con el uso de ésta técnica para simular los eventos, porque además siempre había pensado lo que comentas: cuando registras un evento, en algún momento tienes que comprobar la condición de lanzado y ejecutar la llamada a la función delegada, y además dices que se almacenan en una pila, por lo que también estoy de acuerdo en que debe ser menos eficiente hacer lo anterior más recorrer y sacar de la pila cada evento ...

Gracias por las aclaraciones!

PD: de todas formas si alguien me recomienda alguna lectura interesante sobre eventos, guay, que no me vendría mal conocerlos más a fondo

tamat

Entonces descubres los delegators de C# o los Signal/Slot de QT y tus ojos lloran.
Por un stratos menos tenso

Vicente

Como dice tamat si quieres leer sobre eventos te puedes leer la documentación de C# sobre eventos/delegados/lambdas (y por lo que oido las señales de Qt son buenas buenas buenas).

Un saludo,

Vicente

Tei

No me siento cualificado para opinar sobre la cuestión.

Pero voy a preguntar algo.
¿Como vas a usar esto de funciones virtuales en lugar de eventos?

Osea, vas a hacer pooling, en lugar de una cola de eventos. No es que ninguna de las dos opciones suene demasiado apetitosa.

Pero ¿como es ese pooling?. Osea, ¿es un codigo del estilo?:

if ( mio.preRender )
  mio.preRender();

Y ¿que assembler genera eso? ¿es trivial, o alienigenaverboso?

Y sobretodo.. ¿que mas da?.
¿No puedes simplemente hacer una prueba mas o menos realista, y ver que sale que es mas rapido?.

chan

Cita de: "Tei"
Pero ¿como es ese pooling?. Osea, ¿es un codigo del estilo?:

if ( mio.preRender )
  mio.preRender();

Pues no es así como se suele usar, un método virtual sólo tiene sentido si en algún momento tienes el pensamiento de sobreescribir el método. Ciñiéndonos al asunto, es como preveer que eventos puede lanzar un método concreto, en el caso de ejemlo supón que quieres lanzar un evento preRender() y otro postRender() cada vez que hagas una llamada a la función Render(), y además tienes controlado en que lugar exacto del código se empieza a ejecutar cada "evento" (en éste caso funciones virtuales).

Ten encuenta que si instancias un objeto de la clase que contiene el método Render(), cada vez que hagas ésto: miObjeto.Render(); , se van a llamar a las funciones de preRender() y postRender(). Como éstas dos funciones son virtuales, puedes heredar la clase base de render a otra, por ejemplo MyClaseRenderPersonalizada, y dentro de ésta nueva, implementas el código que te de la gana para las funciones de pre y post render, con lo que, si te das cuenta, vas a conseguir el mismo efecto que con los eventos. Un trozo de código vale más que mil palabras:

class RenderClass
{
public void Render()
{
preRender();
/*Código que muestra un fotograma ..
.....
*/
postRender();
}
public virtual void preRender();
public virtual void postRender();
}

class MyClaseRenderPersonalizada : RenderClass
{
public virtual preRender()
{
Console.Write("Ejecutando el pre-renderizado ...");
}
public virtual postRender()
{
Console.Write("Ejecutando el post-renderizado ...");
//Liberar recursos
//resetear contadores de fotogramas ...
}
}

/* En algún lugar dentro de tu aplicación:*/
MyClaseRenderPersonalizada renderPerso=new MyClaseRenderPersonalizada();

while(true)
//Automáticamente se ejecutará el codigo de pre y post render de la clase personalizada
renderPerso.Render();

davur

No veo tan clara la duda entre funciones virtuales (término específico de C++) y eventos (concepto genérico implementable de varias maneras), cuando normalmente se utilizan con propósitos totalmente diferentes. Personalmente, cuando leo "eventos", inmediatamente pienso en comunicación entre entidades o, a nivel más general, entre sistemas.

En este caso en concreto, ¿qué sentido tendría tratar preRender y postRender como eventos?

Tei

Cita de: "chan"
...

La teoria ya la conozco. He programado en C++ bastante años. Etc.

Jare

Cada vez que tengo que debuguear algo pasando por el rollo de signal/slots de Qt me dan ganas de matar a alguien. En cambio, los delegates de C# me gustan mucho. Para gustos, colores...






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.