¿Qué "olores de código" hay que son un síntoma de que se requiere un modelo de escucha de eventos?

10

¿Cuáles son los síntomas en una base de código que indican que se requiere un enfoque de escucha de eventos?

Me parece que cuando hay clases que necesitan ser llamadas por múltiples, no definidas en el conjunto de otras clases en tiempo de diseño, necesita algún tipo de marco de señalización, pero me gustaría saber qué otras situaciones hay. mejorado al cambiar a un modelo basado en eventos.

acechador
fuente

Respuestas:

8

El enfoque Event / Listener intenta evitar el acoplamiento estrecho , por lo que todos los olores de código que indican eso apuntarían al enfoque.

En base a eso, sugeriría los siguientes síntomas:

  • constructores grandes , ya que cada objeto necesita conocer a todos los demás, y no puede funcionar sin él. Quizás disfrazado de tantos obj.set_dependecy(x)inmediatamente después de la llamada del constructor.

  • dependencias bidireccionales , porque, sin eventos, en un lenguaje imperativo, el flujo de información es básicamente 'push' (llamado método de alguien)

  • La "jerarquía del conocimiento" es difícil de determinar . Estas son las dependencias bidireccionales , solo otro enfoque: si hay A, que escucha a B, A sabe de B, pero B no de A, entonces hay una 'jerarquía': algunos objetos no saben nada, algunos saben otros , etc. Por ejemplo, al implementar MVC de esta manera: http://en.wikipedia.org/wiki/Model_View_Controller , el modelo solo se conoce a sí mismo, la vista conoce el modelo y el controlador conoce la vista y el modelo.

keppla
fuente
1
Las dependencias bidireccionales son, con mucho, la señal más reveladora de que necesita cambiar a un modelo controlado por eventos. La hinchazón del constructor puede significar eso, pero la mayoría de las veces solo significa que necesita hacer más en cuanto a la agregación, la composición y / o la abstracción general (es decir, refactorización, no cambios de diseño).
Aaronaught
Tienes razón. Traté de ordenarlo por la facilidad de detección, y los grandes constructores son tan simples que pueden ser atrapados por expresiones regulares.
keppla
6

Cuando no puede o no debe saber qué debe reaccionar ante un conjunto de mensajes / señales / eventos.

A menudo es cuando quieres que "el mundo" sepa sobre algo que sucede en un módulo (una clase o un sistema de clases) pero no quieres preocuparte por lo que se llama.

El olor del código asociado, para ser específicos, es cuando sientes que comienzas a mezclar código de módulos independientes, uno haciendo algo a lo que el otro debería reaccionar. Una vez que vea que tiene que llamar al código desde el módulo B dependiendo del estado / eventos del módulo A, necesita oyentes de eventos.

Klaim
fuente
3

Cambiaría su pregunta y diría: ¿cuándo un evento basado no es la solución correcta para una aplicación orientada a objetos? Creo que la mayoría de las aplicaciones OO pueden beneficiarse si están diseñadas como productores y consumidores de eventos.

Al final, una "llamada al método" es, de hecho, un mensaje que llega a un objeto y el objeto es responsable de decidir si va a hacer algo con el mensaje y realizar la operación. Esto no está muy claro en lenguajes fuertemente tipados como Java, pero se vuelve más obvio en lenguajes dinámicos como Ruby.

Otro punto interesante del diseño de una aplicación basada en eventos es que, por lo general, los componentes internos deben aislarse y ser coherentes, de lo contrario el código se convierte en un desastre muy, muy rápidamente. Como ejemplo, me gusta mucho el concepto de Arquitectura Hexagonal utilizado por Alistair Cockburn, ya que generalmente este patrón crea una mejor encapsulación y fuerza (en mi opinión) componentes más cohesivos.

Creo (pero probablemente me equivoque) que esto también está relacionado con el concepto de diseño impulsado por dominio de eventos de dominio , en el que las clases de dominio emiten eventos que son capturados por otros objetos, y estos objetos emiten otros eventos (puede ver dónde esto va: D). Lo que me gusta de este patrón es que dice que las interfaces deben modelar roles, no implementaciones.

Lo siento si no tengo mucho sentido, he estado experimentando con estos patrones durante los últimos meses con resultados sorprendentes, pero todavía estoy tratando de entender los conceptos y hasta dónde llegan.

Augusto
fuente
2

Piensa en lo que tendrías que hacer si los oyentes de eventos (también conocido como el Patrón de Observador) no existieran.

Si tiene un objeto que tiene referencias a una lista de otros objetos y llama a un método en un punto dado del proceso, definitivamente debería haber tenido un evento allí.

Si tiene una bandera en un objeto para decir que se ha hecho algo y está mirando esa bandera desde otros objetos, definitivamente debería haber usado un modelo basado en eventos.

Sin embargo, no confunda esto con una devolución de llamada. Si llama a un método en otro objeto y le pasa un método en el objeto de origen al que volver a llamar en un momento dado, debe dejarlo así, en lugar de utilizar un detector de eventos.

pdr
fuente