Wo die Linie mit reaktiver Programmierung gezeichnet wird [geschlossen]

8

Ich benutze RxJava seit ungefähr einem Jahr in meinem Projekt. Mit der Zeit habe ich es sehr geliebt - jetzt denke ich vielleicht zu viel ...

Die meisten Methoden, die ich schreibe, haben jetzt eine Form von Rx, was großartig ist! (bis es nicht ist). Ich stelle jetzt fest, dass einige Methoden eine Menge Arbeit erfordern, um die verschiedenen beobachtbaren Produktionsmethoden zu kombinieren. Ich habe das Gefühl, dass, obwohl ich verstehe, was ich jetzt schreibe, der nächste Programmierer es wirklich schwer haben wird, meinen Code zu verstehen.

Bevor ich zur unteren Zeile komme, lassen Sie mich ein Beispiel aus meinem Code in Kotlin geben (Tauchen Sie nicht zu tief hinein):

%Vor%

Kurz gesagt, was das ist:

  • Abrufen einiger zeitgestempelter Daten aus dem Speicher
    • Wenn Daten nicht neu sind, rufen Sie Daten aus dem Netzwerk ab
      • Synchronisieren Sie die Netzwerkdaten erneut mit dem Speicher (um sie zu aktualisieren)
    • Wenn ein Netzwerkfehler aufgetreten ist, rufen Sie die älteren Daten und den Fehler
    • erneut ab

Und hier kommt meine eigentliche Frage: Reaktive Programmierung bietet einige wirklich mächtige Konzepte. Aber wie wir wissen with great power comes great responsibility .

Wo zeichnen wir die Grenze? Ist es in Ordnung, unsere gesamten Programme mit fantastischen reaktiven Oneliner zu füllen oder sollten wir es nur für wirklich alltägliche Operationen speichern?

Offensichtlich ist das sehr subjektiv, aber ich hoffe, dass jemand mit mehr Erfahrung sein Wissen und seine Fallstricke teilen kann. Lass es mich besser ausdrücken

  

Wie gestalte ich meinen Code so, dass er reaktiv und dennoch leicht zu lesen ist?

    
maxandron 13.03.2016, 18:28
quelle

2 Antworten

15

Wenn du Rx nimmst, wird es zu diesem tollen glänzenden Hammer und alles sieht aus wie ein rostiger Nagel, der nur wartet damit du hineinknallst.

Persönlich denke ich, dass der größte Hinweis im reaktiven Framework liegt. Bei einer Anforderung müssen Sie darüber nachdenken, ob eine reaktive Lösung wirklich Sinn macht.

In jedem Rx-Vorschlag möchten Sie einen oder mehrere Ereignisströme einführen und als Reaktion auf ein Ereignis eine Aktion ausführen.

Ich denke, es gibt zwei Schlüsselfragen zu stellen:

  • Haben Sie die Kontrolle über den Ereignisstrom?
  • Bis zu welchem ​​Grad müssen Sie die Antworten mit der Rate des Ereignisstroms ausfüllen?

Wenn Sie nicht die Kontrolle über den Ereignis-Stream haben und Sie müssen mit der Rate des Ereignisstrom dann Rx ist ein guter Kandidat.

In jedem anderen Fall ist es wahrscheinlich eine schlechte Wahl.

Ich habe viele Beispiele gesehen, wo Leute durch die Reifen gesprungen sind, um die Illusion eines Kontrollmangels zu erzeugen, um Rx zu rechtfertigen - was mir verrückt vorkommt. Warum geben Sie die Kontrolle auf, die Sie haben?

Einige Beispiele:

  1. Sie müssen Daten aus einer festen Liste von Dateien extrahieren und in einer Datenbank speichern. Sie beschließen, jeden Dateinamen in einen Betreff zu schieben und eine reaktive Pipeline zu erstellen, die jede Datei öffnet und die Daten projiziert, dann die Daten auf irgendeine Weise verarbeitet und sie schließlich in die Datenbank schreibt.

    Dies schlägt den Kontrolltest und den Geschwindigkeitstest fehl. Es wäre viel einfacher, über die Dateien zu iterieren und sie zu ziehen und so schnell wie möglich zu verarbeiten. Der Ausdruck "entscheide dich, um zu drücken" ist das Werbegeschenk hier.

  2. Sie müssen die Aktienkurse von einer Börse anzeigen lassen.

    Offensichtlich ist dies eine gute Wahl für Rx. Wenn Sie nicht mit dem Preisniveau im Allgemeinen Schritt halten können, sind Sie geschraubt. Es könnte der Fall sein, dass Sie Preise zusammenführen (vielleicht, um ein Update nur einmal jede Sekunde zur Verfügung zu stellen) - aber das qualifiziert noch als das Aufrechterhalten. Die einzige Sache, die Sie nicht tun können, ist, die Börse zu verlangsamen.

Diese (realen) Beispiele fallen ziemlich genau an entgegengesetzten Enden des Spektrums und haben nicht viel Grauzone. Aber da draußen gibt es viele Grauzonen, in denen die Kontrolle nicht klar ist.

Manchmal trägst du den Client-Hut in einem Client / Server-System und es kann leicht sein, in die Falle zu geraten, Kontrolle zu opfern oder die Kontrolle an die falsche Stelle zu setzen - was einfach mit dem richtigen Design behoben werden kann. Bedenken Sie Folgendes:

  1. Eine Client-Anwendung zeigt Updates von einem Server an.

    • Nachrichtenupdates werden jederzeit an den Server gesendet und in großem Umfang erstellt.
    • Der Client sollte in einem vom Client festgelegten Intervall aktualisiert werden.
    • Das Aktualisierungsintervall kann jederzeit geändert werden und der Benutzer kann jederzeit eine sofortige Aktualisierung anfordern.
    • Der Client zeigt nur Updates an, die mit bestimmten Schlüsselwörtern versehen sind, wie vom Benutzer angegeben.
    • Die Nachrichtenaktualisierungen sind manchmal langwierig und der Client sollte nicht den vollständigen Inhalt von Nachrichtenaktualisierungen speichern, sondern stattdessen die Überschrift und die Zusammenfassung anzeigen.
    • Auf Benutzeranfrage kann der gesamte Inhalt eines Artikels angezeigt werden.

Hier hat die Häufigkeit der Nachrichtenaktualisierungen keine Kontrolle über den Client. Aber die gewünschte Aktualisierungsrate und die Tags von Interesse sind.

Damit der Client alle Nachrichtenaktualisierungen erhält, wenn sie ankommen und sie filtern, wird die Client-Seite nicht funktionieren. Aber es gibt viele Möglichkeiten:

  • Soll der Server einen Datenstrom von Updates senden, der die Aktualisierungsrate des Clients berücksichtigt? Was passiert, wenn der Client offline geht?
  • Was ist, wenn es Tausende von Kunden gibt? Was ist, wenn der Client eine sofortige Aktualisierung wünscht?

Es gibt viele gültige Möglichkeiten, dieses Problem anzugehen, die mehr oder weniger reaktive Elemente enthalten. Eine gute Lösung sollte jedoch die Kontrolle der Tags und der gewünschten Aktualisierungsrate durch den Kunden sowie die fehlende Kontrolle über die Häufigkeit der Nachrichtenaktualisierung (nach Client oder Server) berücksichtigen. Möglicherweise möchten Sie, dass der Server auf Änderungen im Kundeninteresse reagiert, indem er die Ereignisse aktualisiert, die er an den Client sendet - nur so lange, wie der Client zuhört (wird über einen Heartbeat erkannt). Wenn der Benutzer einen vollständigen Artikel wünscht, würde der Kunde den Artikel herunterziehen

In der Rx-Community wird viel über Gegendruck diskutiert. Dies ist die Idee, dass der Client den Server informieren soll, wenn er überlastet ist und der Server antwortet, indem er den Ereignisstrom irgendwie reduziert. Ich denke, das ist ein fehlgeleiteter Ansatz, der zu verwirrenden Designs führen kann.

Sobald ein Kunde dieses Feedback geben muss, hat er den Response-Rate-Test nicht bestanden. An dieser Stelle befinden Sie sich nicht in einer reaktiven -Situation, Sie befinden sich in einer asynchronen aufzählbaren -Situation. d.h.Der Client sollte "Ich bin bereit" sagen, wenn er für mehr bereit ist und dann auf eine nicht blockierende Weise darauf wartet, dass der Server antwortet.

Dies wäre angemessen, wenn das erste Szenario so geändert würde, dass Dateien in einem Drop-Ordner ankommen, die unterschiedlich lang und komplex zu verarbeiten sind. Der Client sollte für die nächste Datei einen nicht blockierenden Aufruf durchführen, ihn verarbeiten und wiederholen. (Fügen Sie nach Bedarf Parallelität hinzu) - und reagieren nicht auf einen Datenstrom von Ereignissen, die bei der Datei angekommen sind.

Nachbearbeitung

Ich habe bewusst andere gültige Bedenken wie Wartbarkeit des Codes, Leistung von Rx selbst usw. vermieden. Die meisten, weil sie woanders angesprochen werden und wichtiger, weil ich denke, dass die Ideen hier spalterischer sind als diese Bedenken.

Wenn Sie also in Ihrem Szenario über die Elemente control und response rate reflektieren, bleiben Sie wahrscheinlich auf dem richtigen Weg.

Das Problem mit der Antwortquote kann subtil sein - und der Aspekt Grad ist wichtig. Die Ankunftsrate kann schwanken, und es wird ein akzeptables Maß an Fluktuation der Antwortquote geben - klar, wenn Sie letztendlich keine Möglichkeit haben, "aufzuholen", dann wird der Kunde irgendwann explodieren.

    
James World 17.03.2016, 12:02
quelle
3

Ich finde, dass es zwei Dinge gibt, an die ich denke, wenn ich Rx schreibe (oder irgendeine milde, ausgereifte / neue Technologie)

  1. Kann ich es testen?
  2. Kann ich einfach jemanden einstellen, der es aufrechterhalten kann? Nicht kämpfen, um es aufrecht zu erhalten, aber wird gut in Ruhe gelassen, um es zu erhalten?

Zu diesem Zweck finde ich auch, dass Sie, weil Sie können, nicht immer meinen, dass Sie sollten. Als Leitfaden versuche ich, Abfragen zu vermeiden, die über 7 Zeilen Code hinausgehen. Bei Abfragen, die größer sind, versuche ich mich in Unterabfragen zu trennen, die ich komponiere.

Wenn Code, den Sie bereitgestellt haben, der Kern der Codebasis ist und sich am äußersten Ende der Komplexität befindet, dann ist es vielleicht in Ordnung. Wenn Sie jedoch feststellen, dass Ihr gesamter Rx-Code so komplex ist, können Sie Schwierigkeiten haben, mit der Codebasis zu arbeiten.

    
Lee Campbell 14.03.2016 07:40
quelle