Notificação de status de alteração do componente SharedState

Como continuação do artigo anterior sobre o estado geral dos componentes , desenvolverei o tópico e quero implementar um recurso que capturará e processará um evento de alteração de estado em cada componente (quando os dados em um estado geral forem alterados em algum componente).

Link para o projeto

Geralmente, para rastrear alterações de dados em um componente, é criada uma conexão direta, ou seja, verificamos no método Update se os dados foram alterados lá


Pré-quadro de verificação de dados através do método Update

ou nos inscrevemos em um evento muito específico, chamado de forma independente no componente "rastreado" e processado posteriormente.


Inscrevendo-se em um evento em um componente e processando-o

Existem muitas deficiências nessa abordagem, descritas principalmente em um artigo anterior. O principal motivo comum para essas deficiências é a coerência forte e a manutenção complexa (a capacidade de apoiar, desenvolver um projeto e refatorar).

Criando uma solução de notificação de estado


Agora que você possui um sistema que permite afrouxar a conexão entre componentes e meios para criar correspondências entre componentes, você pode se livrar da verificação manual de valores em condições gerais, da seguinte maneira:


Esquema geral de notificação de alteração de status

Na implementação descrita no artigo anterior, os dados são alterados em um único local, no indexador do componente SharedState e, portanto, é muito simples controlar suas alterações.


Indexador em estado geral

No setter do indexador, atribuímos valores de estado.

Agora, para o componente SharedState , você precisa adicionar uma dependência no SharedEvents , pois eu o usarei para enviar notificações. Adicione atributo para SharedState.


Adicionando uma dependência SharedState de SharedEvents

E crie uma classe que herda de EventData para enviar dados em uma notificação de status. Ele conterá o nome do parâmetro, no estado e seu novo valor


Adicionando uma classe que contém informações sobre uma alteração no estado geral

Agora você precisa adicionar um link ao SharedEvents , obtendo-o do objeto de jogo no componente SharedState


Obtendo SharedEvents em um componente SharedState

Agora, alteraremos o configurador do indexador para que, toda vez que o estado seja alterado, uma notificação com o nome "sharedstatechanged" seja criada e passemos um objeto que contenha todos os dados sobre a alteração


Alterar o setter do indexador

Agora resta assinar as alterações em um componente, alterar os dados em outro e verificar como ele funciona.

Digamos que o SecondComponent altera o estado, por exemplo, o parâmetro "somedata", e o componente FirstComponent monitora a alteração do estado assinando notificações

No SecondComponent, chamamos a alteração de parâmetro


Alterar chamada de dados

E agora no método FirstComponent, adicionamos um manipulador e imprimimos informações sobre a alteração no estado geral no console


Tratamento geral de eventos de alteração de status

Agora, se você iniciar o jogo, depois que o estado geral for alterado no SecondComponent , no componente FirstComponent , receberemos uma notificação e enviaremos os dados para o console



Agora que isso funciona, você pode refatorar um pouco e tornar o código ainda mais conveniente. Para fazer isso, você precisa transferir a assinatura para notificações de alterações no estado geral para a classe base SharedStateComponent e criar um método abstrato, implementando o qual cada componente processará ou não as alterações de estado, a critério do componente.

Transferindo uma assinatura para SharedStateComponent


Assinando notificações de alterações no estado geral na classe base

Adicione um método abstrato e chame-o no manipulador de eventos


Adicionando um método abstrato para manipular o evento em classes filho

E agora, em cada componente filho do FirstComponent e SecondComponent, você precisa implementar esse método e processar a alteração no estado geral nele. Mas vamos imprimi-lo no console como antes


Implementando um método abstrato nos componentes FirstComponent e SecondComponent

E agora, quando iniciarmos o jogo, veremos 2 entradas no console, de ambos os componentes.



Importante!


Na implementação anterior, havia um erro na classe SharedEvents e , para corrigi-lo, você precisa alterar o método Subscribe para:

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


All Articles