Wird die Verkettung von Ereignissen als bewährtes Verfahren angesehen?

15

Von Zeit zu Zeit habe ich Szenarien erlebt, in denen mehrere komplexe Bedingungen erfüllt sein müssen, bevor ein Ereignis ausgelöst wird. Darüber hinaus führen die meisten Listener zusätzliche Überprüfungen durch, um die Vorgehensweise zu bestimmen. Dies brachte mich zu der Überlegung, ob es eine bessere Lösung wäre, in kleineren Ereignissen zu denken und sie ineinander auslösen zu lassen.

Durch das Verketten von Ereignissen könnte ich später mit relativ geringem Aufwand zusätzliche Zuhörer einbinden (mögliche Verletzung von YAGNI?). Mein Code würde aus einfachen, leicht verständlichen Elementen bestehen, die für andere nicht schwer zu verstehen sein sollten.

Die möglichen Nachteile dieser Lösung wären jedoch die Tatsache, dass es ziemlich schwierig ist, den Fehler zu finden, wenn in der Kette etwas schief läuft (z. B. das Auslösen eines falschen Ereignisses aufgrund eines menschlichen Fehlers).

Ist Event Chaining eine gute Idee TM ? Wenn nicht, welche alternativen Methoden stehen zur Verfügung, um die Übersichtlichkeit des ereignisbezogenen Codes zu gewährleisten?

gilden
quelle
1
Ich habe in den letzten Jahren an einer Event-Verkettungsbibliothek für JavaScript gearbeitet. kayoub5.github.io/onQuery ermöglicht es, komplexe Ereignisse wie <br> (A oder B), dann C (D und E) als {A + B} > C > {D & E}<br> zu schreiben. Testen und Debuggen sind immer noch ein Schmerz.
Ayoub Kaanich

Antworten:

11

Ist Event Chaining eine gute Idee?

Es ist eines dieser Dinge, die wie eine wirklich gute Idee scheinen, bis Sie es verwenden.

Es ist sehr schwierig, kaskadierende Ereignisse ohne irgendeine implizite Abhängigkeit von der Reihenfolge einzurichten. Aufgrund von Endlosschleifen und gelegentlichen Speicherverlusten ist es schwierig, sie einzurichten, ohne Probleme zu verursachen. Sie erschweren das Klassendesign aufgrund der Kopplung, die durch Ereignisse verursacht wird, die wissen müssen, wo sie angebracht werden müssen und wohin sie kaskadiert werden müssen.

Und sie sind super hart im Debuggen und Überlegen von Code.

Jetzt können sie manchmal in relativ begrenzten Szenarien verwendet werden, in denen die Struktur des Codes einige dieser Probleme einschränkt. In Benutzeroberflächen können kaskadierende Ereignisse zum Auslösen der Hierarchie verwendet werden, da diese Hierarchiestruktur dazu beiträgt, die Bedenken hinsichtlich Besitzverhältnisse und Schleifen zu begrenzen.

Trotzdem finde ich heutzutage viel häufiger, dass ich einen Delegaten in einem Konstruktor für diese Art von erweiterbarem Verhalten akzeptiere, als willkürliches Verhalten zur Laufzeit einrasten zu lassen.

Telastyn
quelle
Einige großartige Punkte, insbesondere die zu UI-Hierarchien.
Vaughandroid
2

Event-Verkettung ist eine gute Idee, wenn

  • Es ist im Allgemeinen für Ihr Szenario geeignet. Ein einfaches Beispiel ist eine Benutzeroberflächenaktion, die andere visuelle Ereignisse auslöst.
  • Jede Veranstaltung ist eigenständig und überschaubar. Sie möchten nicht, dass die Lösung zu umständlich wird.
  • Der Kontrollfluss ist leicht zu verfolgen. Es muss auf einer Plattform und in einer Sprache implementiert werden, die für Entwickler einfach zu durchlaufen ist. Wenn Sie nach "magischen" Methoden suchen müssen, um zu verfolgen, was passiert, gehen Sie den falschen Weg.

Es ist sehr wichtig, die Lösung zu überdenken und einige Dinge zu verallgemeinern, bevor Sie mit dem Aufbau des Systems beginnen. In einer OO-Sprache sollten Sie beispielsweise eine Basisschnittstelle oder eine abstrakte Klasse als Grundlage für alle Ereignisse haben. Diese Klasse sollte Dinge wie Logging / Debugging beinhalten. Möglicherweise möchten Sie auch eine allgemeine Ereignisverwaltungsklasse, um Fehler ordnungsgemäß zu behandeln.

Matt S
quelle
2

Aus der Sicht von jemandem, der einmal ein paar Tage damit verbracht hat, einen ereignisbezogenen Fehler aufzuspüren, ist dies eine sehr schlechte Idee. Sie verstecken Ihren Kontrollfluss, was (wie Sie bemerkt haben) das Debuggen zu einem Albtraum machen kann. Die Situation, in der ich war, entstand, als jemand einen Fehlerbehandlungscode hinzufügte, der ein Steuerelement zurücksetzte. Dies führte zu einer Kette von onPropertyChangeHandlern, die das Steuerelement mit dem Fehlerhandler auffrischten, was dazu führte, dass das andere Steuerelement erneut zurückgesetzt wurde, und so weiter. Grundsätzlich würde die Benutzeroberfläche einfach blockieren, wenn die CPU auf 100% festgelegt wäre.

Wenn Sie auf irgendeine Weise verhindern können, dass Ereignishandler mehr als einmal für dasselbe Stammereignis ausgelöst werden, können Sie dies möglicherweise vermeiden, aber ich kann mir Situationen vorstellen, in denen Sie möglicherweise mehrere Ereignishandleraufrufe wünschen.

TMN
quelle
1
Dies klingt nach einem Problem mit einer bestimmten Implementierung, nicht mit dem Konzept im Allgemeinen.
Matt S
Ich denke, das Problem mit dem nicht deterministischen Kontrollfluss ist dem Design inhärent. Es sei denn, Sie codieren sehr spezifische Flows und verwenden keinen allgemeinen Pub / Sub-Typ-Mechanismus.
TMN
2

Aus den von anderen genannten Gründen ist es schwierig, die Ereignisverkettung gut zu implementieren.

Es ist jedoch auch die Grundvoraussetzung der meisten Regel-Engines. JBoss Drools, IBM jRules, PegaSystems, Corticon und FICO Blaze Advisor sind wichtige Business Rules Management-Systeme (BRMS), mit denen Benutzer Regeln deklarieren können, die aufgrund von Ereignissen in den Systemen ausgelöst werden. Sowohl Vorwärts- als auch Rückwärtsverkettung sind möglich und machbar.

Die Prolog-Sprache und ihre Ableitungen basieren auf demselben Begriff.

Die beteiligten Algorithmen sind nicht einfach, das Debuggen kann mühsam sein, aber das Modell bietet viel Wert.

Matthew Flynn
quelle
1

Ein möglicher Nachteil ist, dass es ziemlich leicht ist, versehentlich Aktualisierungen in einer Schleife durchzuführen. zB A -> B -> C -> A -> B ...

Ein anderer Ansatz besteht darin, zusammengesetzte Ereignisse zu erstellen, die für das Auslösen einer Folge von Ereignissen verantwortlich sind. Das bedeutet, dass Sie nicht in einer Schleife stecken bleiben sollten und nur einen Ort haben, an dem Sie Fehler abfangen können. Ich hatte einige Erfolge damit, obwohl ich es zugegebenermaßen (noch!) Nicht für etwas besonders Kompliziertes verwendet habe.

vaughandroid
quelle