2009-07-20 8 views
8

En el trabajo, tenemos un marco enorme y usamos eventos para enviar datos de una parte de la misma a otra. Recientemente comencé un proyecto personal y a menudo pienso en usar eventos para controlar las interacciones de mis objetos.Cuándo usar eventos?

Por ejemplo, tengo una clase Mixer que reproduce efectos de sonido y al principio pensé que debería recibir eventos para reproducir un efecto de sonido. Luego decidí hacer que mi clase sea estática y llame a

Mixer.playSfx(SoundEffect) 

en mis clases. Tengo un montón de ejemplos como este en el que inicialmente pienso en una implementación con eventos y luego cambio de opinión, diciéndome a mí mismo que es demasiado complejo para nada.

Entonces, ¿cuándo debo usar eventos en un proyecto? ¿En qué ocasiones los eventos tienen una gran ventaja sobre otras técnicas?

Respuesta

11

Por lo general, utiliza eventos para notificar a los suscriptores acerca de alguna acción o cambio de estado que ocurrió en el objeto. Al usar un evento, permite que diferentes suscriptores reaccionen de manera diferente, y al desacoplar el suscriptor (y su lógica) del generador de eventos, el objeto se vuelve reutilizable.

En el ejemplo de su Mezclador, tengo eventos que indican el inicio y el final de la reproducción del efecto de sonido. Si tuviera que usar esto en una aplicación de escritorio, podría usar esos eventos para habilitar/deshabilitar los controles en la interfaz de usuario.

4

La diferencia entre Llamar a una subrutina y Criar eventos tiene que ver con: Especificación, Elección, Cardinalidad y finalmente, de qué lado, el iniciador o el receptor tiene Control.

con llamadas, el iniciador elige a llamar a la rutina de recepción, y el iniciador especifica el receptor. Y esto lleva a la cardinalidad many-to-one, ya que muchos llamadores pueden elegir llamar a la misma subrutina.

Con eventos, por otro lado, el iniciador genera un evento que será recibido por las rutinas que tienen elegido para recibir ese evento. El receptor especifica qué eventos recibirá de los iniciadores. Esto lleva a una cardinalidad de uno a muchos ya que una fuente de evento puede tener muchos receptores.

Por lo tanto, la decisión sobre las llamadas o los eventos, principalmente tiene que ver con si el iniciador determina que el receptor es o el receptor determina el iniciador.

3

Es una compensación entre simplicidad y reutilización. Vamos a tomar una metáfora del proceso "Enviar el correo electrónico":

Si conoce los destinatarios y son de número finito que siempre puede determinar, es tan simple como ponerlos en la lista "Para" y presionar el botón Enviar. Es simple ya que es lo que usamos la mayor parte del tiempo. Esto está llamando a la función directamente.

Sin embargo, en el caso de la lista de correo, no se sabe de antemano cuántos usuarios se van a suscribir a su correo electrónico. En ese caso, usted crea un programa de lista de correo donde los usuarios pueden suscribirse y el correo electrónico se envía automáticamente a todos los usuarios suscritos. Esto es modelado de eventos.

Ahora, a pesar de que, en ambas opciones anteriores, los correos electrónicos se envían a los usuarios, usted es un mejor juez de cuándo enviar el correo electrónico directamente y cuándo usar el programa de la lista de correo.Aplicar el mismo criterio, espero que se podrían obtener su respuesta :)

Cheers,

Ajit.

Cuestiones relacionadas