Benachrichtigung über den Status der Änderung der SharedState-Komponente

Als Fortsetzung des vorherigen Artikels über den allgemeinen Status für Komponenten werde ich das Thema weiterentwickeln und eine Funktion implementieren, die ein Statusänderungsereignis in jeder Komponente abfängt und verarbeitet (wenn sich Daten im allgemeinen Status in einer Komponente ändern).

Link zum Projekt

Um Datenänderungen in einer Komponente zu verfolgen, wird normalerweise eine direkte Verbindung hergestellt, dh wir überprüfen entweder in der Update-Methode, ob sich die Daten dort geändert haben


Überprüfen Sie die Daten vorab über die Update-Methode

oder wir abonnieren ein ganz bestimmtes Ereignis, das in der "verfolgten" Komponente unabhängig aufgerufen und später verarbeitet wird.


Ein Ereignis in einer Komponente abonnieren und verarbeiten

Dieser Ansatz weist viele Mängel auf, die meist in einem früheren Artikel beschrieben wurden. Der Hauptgrund für diese Mängel ist eine starke Kohärenz und komplexe Wartung (die Fähigkeit, ein Projekt zu unterstützen, zu entwickeln und umzugestalten).

Erstellen einer Statusbenachrichtigungslösung


Nachdem Sie nun über ein System verfügen, mit dem Sie die Verbindung zwischen Komponenten lösen und Mailings zwischen Komponenten erstellen können, können Sie die manuelle Überprüfung von Werten im allgemeinen Zustand wie folgt vermeiden:


Allgemeines Benachrichtigungsschema für Statusänderungen

In der im vorherigen Artikel beschriebenen Implementierung werden die Daten an einer Stelle im Indexer der SharedState-Komponente geändert, und daher ist es sehr einfach, ihre Änderung zu steuern


Indexer im Allgemeinzustand

Im Setter des Indexers weisen wir Statuswerte zu.

Jetzt müssen Sie für die SharedState- Komponente eine Abhängigkeit von SharedEvents hinzufügen , da ich sie zum Senden von Benachrichtigungen verwenden werde. Attribut für SharedState hinzufügen.


Hinzufügen einer SharedState-Abhängigkeit von SharedEvents

Erstellen Sie eine Klasse, die von EventData erbt, um Daten in einer Statusbenachrichtigung zu senden. Es enthält den Namen des Parameters im Status und seinen neuen Wert


Hinzufügen einer Klasse, die Informationen zu einer Änderung des allgemeinen Status enthält

Jetzt müssen Sie einen Link zu SharedEvents hinzufügen , um ihn vom Spielobjekt in der SharedState- Komponente abzurufen


SharedEvents in einer SharedState-Komponente abrufen

Jetzt ändern wir den Setter des Indexers so, dass bei jeder Änderung des Status eine Benachrichtigung mit dem Namen "sharedstatechanged" erstellt wird und wir ein Objekt übergeben, das alle Daten über die Änderung enthält


Ändern Sie den Indexer-Setter

Jetzt müssen Sie die Änderungen in einer Komponente abonnieren, die Daten in einer anderen ändern und überprüfen, wie sie funktionieren.

Angenommen , die SecondComponent ändert den Status, z. B. den Parameter "somedata", und die FirstComponent- Komponente überwacht die Statusänderung , indem sie Benachrichtigungen abonniert

In SecondComponent rufen wir die Parameteränderung auf


Datenanruf ändern

Und jetzt fügen wir in der FirstComponent- Methode einen Handler hinzu und drucken Informationen über die Änderung des allgemeinen Status zur Konsole


Allgemeine Behandlung von Statusänderungsereignissen

Wenn Sie nun das Spiel starten, nachdem der allgemeine Status in SecondComponent geändert wurde, erhalten wir in der FirstComponent- Komponente eine Benachrichtigung und geben die Daten an die Konsole aus



Jetzt, da dies funktioniert, können Sie ein wenig umgestalten und den Code noch komfortabler gestalten. Dazu müssen Sie das Abonnement für Benachrichtigungen über Änderungen des allgemeinen Status an die SharedStateComponent- Basisklasse übertragen und eine abstrakte Methode erstellen, indem Sie nach Ermessen der Komponente implementieren, welche Komponenten Statusänderungen darin verarbeiten oder nicht.

Übertragen eines Abonnements auf SharedStateComponent


Abonnieren von Benachrichtigungen über Änderungen des allgemeinen Status in der Basisklasse

Fügen Sie eine abstrakte Methode hinzu und rufen Sie sie im Ereignishandler auf


Hinzufügen einer abstrakten Methode zur Behandlung des Ereignisses in untergeordneten Klassen

Und jetzt müssen Sie in jeder untergeordneten Komponente von FirstComponent und SecondComponent diese Methode implementieren und die Änderung des allgemeinen Status darin verarbeiten. Aber wir werden es einfach wie zuvor auf die Konsole drucken


Implementieren einer abstrakten Methode in FirstComponent- und SecondComponent-Komponenten

Und jetzt, wenn wir das Spiel starten, sehen wir 2 Einträge in der Konsole von beiden Komponenten.



Wichtig!


In der vorherigen Implementierung gab es einen Fehler in der SharedEvents- Klasse. Um diesen Fehler zu beheben, müssen Sie die Subscribe- Methode in Folgendes ändern:

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


All Articles