Notificación de estado de cambio de componente de estado compartido

Como continuación del artículo anterior sobre el estado general de los componentes , desarrollaré más el tema y quiero implementar una función que detecte y procese un evento de cambio de estado en cada componente (cuando los datos en estado general cambian en algún componente).

Enlace al proyecto

Por lo general, para rastrear los cambios de datos en un componente, se crea una conexión directa, es decir, verificamos en el método de Actualización si los datos han cambiado allí.


Verificación previa de datos a través del método de actualización

o nos suscribimos a un evento muy específico, que se activa de forma independiente en el componente "rastreado" y finalmente se procesa.


Suscribirse a un evento en un componente y procesarlo

Hay muchas deficiencias en este enfoque, que se describen principalmente en un artículo anterior. La principal razón común de estas deficiencias es una fuerte coherencia y mantenimiento complejo (la capacidad de apoyar, desarrollar un proyecto y refactorizar).

Crear una solución de notificación estatal


Ahora que tiene un sistema que le permite aflojar la conexión entre los componentes y los medios para crear correos entre los componentes, puede deshacerse de la verificación manual de valores en condiciones generales, de la siguiente manera:


Esquema general de notificación de cambio de estado

En la implementación descrita en el artículo anterior, los datos se cambian en un lugar, en el indexador del componente SharedState, y por lo tanto es muy simple controlar su cambio.


Indexador en estado general

En el setter del indexador, asignamos valores de estado.

Ahora, para el componente SharedState , debe agregar una dependencia en SharedEvents , ya que lo usaré para enviar notificaciones. Añadir atributo para SharedState.


Agregar una dependencia SharedState de SharedEvents

Y cree una clase que herede de EventData para enviar datos en una notificación de estado. Contendrá el nombre del parámetro, en estado y su nuevo valor


Agregar una clase que contiene información sobre un cambio en el estado general

Ahora necesita agregar un enlace a SharedEvents , obteniéndolo del objeto del juego en el componente SharedState


Obtener eventos compartidos en un componente SharedState

Ahora cambiaremos la configuración del indexador para que cada vez que cambie el estado, se cree una notificación con el nombre "sharedstatechanged" y pasemos un objeto que contenga todos los datos sobre el cambio


Cambiar el configurador del indexador

Ahora queda suscribirse a los cambios en un componente, cambiar los datos en otro y verificar cómo funciona.

Digamos que SecondComponent cambia de estado, por ejemplo, el parámetro "somedata", y el componente FirstComponent monitorea el cambio de estado suscribiéndose a notificaciones

En SecondComponent, llamamos al cambio de parámetro


Cambiar llamada de datos

Y ahora en el método FirstComponent agregamos un controlador e imprimimos información sobre el cambio en el estado general de la consola


Manejo de eventos de cambio de estado general

Ahora, si inicia el juego, después de cambiar el estado general en SecondComponent , en el componente FirstComponent recibiremos una notificación y enviaremos los datos a la consola.



Ahora que esto funciona, puede refactorizar un poco y hacer que el código sea aún más conveniente. Para hacer esto, debe transferir la suscripción para notificaciones de cambios en el estado general a la clase base SharedStateComponent y crear un método abstracto, mediante la implementación de que cada componente procesará los cambios de estado en él o no, a discreción del componente.

Transferir una suscripción a SharedStateComponent


Suscribirse a notificaciones de cambios en el estado general en la clase base

Agregue un método abstracto y llámelo en el controlador de eventos


Agregar un método abstracto para manejar el evento en clases secundarias

Y ahora, en cada componente secundario de FirstComponent y SecondComponent, debe implementar este método y procesar el cambio en el estado general. Pero solo lo imprimiremos en la consola como antes


Implementación de un método abstracto en componentes FirstComponent y SecondComponent

Y ahora, cuando comenzamos el juego, veremos 2 entradas en la consola, de ambos componentes.



Importante!


En la implementación anterior, había un error en la clase SharedEvents, y para solucionarlo, debe cambiar el método de suscripción a:

Source: https://habr.com/ru/post/438628/


All Articles