"
Reactive Extensions " ist mehr als ein Framework. Zumindest, weil es für jedes beliebte YP eine nahezu identische Implementierung gibt (angepasst an die spezifischen Sprachfunktionen und die entsprechenden Optimierungspraktiken). Yesenin behauptet, dass "der Große aus der Ferne gesehen wird". In dieser Notiz werde ich mich auf verschiedene "Entfernungen" zurückziehen und beschreiben, was ich sehe.
Zen zuerst
Ich sehe eine Push-Version des klassischen
Iterators 'eine GoF-Implementierung. Ich habe daher bereits ohne Details darüber geschrieben.
Eine kurze Nacherzählung für diejenigen, die zu faul zum Lesen sindDer
Punkt ist, dass
Observer ein (fast) "Spiegelbild" der klassischen Implementierung von Iterator ist. Warum "fast" - erklärt in einem Beitrag auf dem zuvor angegebenen Link. Wichtiger Hinweis: „Spiegelreflexion“ ist eine mathematische Definition ohne fünf Minuten und kann
streng formalisiert werden .
In dieser Entfernung ist der Unterschied zwischen Push- und Pull-Systemen deutlich sichtbar. Nach einer solchen Inspiration verursacht jeder Git Push und Git Pull fast ehrfürchtige Ehrfurcht. Sie beginnen, im Code zu stöbern und heilige Fragen zu Duals zu stellen.
Zen Sekunde
"Etwas geht weiter" (nächste Methode), "etwas endete" (abgeschlossene Methode), "alles lief schief" (Fehlermethode) - drei Aussagen, die jeden Prozess beschreiben können, der sich im Laufe der Zeit entwickelt. Darüber hinaus ist es leicht, von der physischen Zeit zu abstrahieren und sie durch eine „Folge von Zuständen“ zu ersetzen (in denen sich das System befindet). Mit Rx können Sie eine Vielzahl von Algorithmen auf eine einzige Schnittstelle reduzieren (im Sinne einer "Übereinstimmung" des Programmierers mit anderen Programmierern und vor allem mit der Maschine), ohne die Ausdruckskraft (Anzahl der möglichen Zustände) oder (optional: synchron) einzuschränken , asynchrone oder Multithread-Ausführung).
Daraus folgt die wichtigste Schlussfolgerung: Ein Empfang ist ein Prozess. Und wenn ein komplexer Prozess aus n Unterprozessen besteht, dann ... ein RX "höherer Ordnung", der die Operation von N RX "erster Ordnung" steuert. In Analogie zu
Funktionen höherer Ordnung .
Zen Dritter
In Analogie zu Funktionen? Ja, Funktionen. Die letzte und mächtigste Erkenntnis ist, dass rx nur die Dekoration eines Funktionsprogrammierers ist, nicht mathematisch: Letztere leben außerhalb der Zeit; Eine reguläre Funktion kann ein Ergebnis zurückgeben. nur einmal. Und als nächstes (Ergebnis); - Dies ist eine "wiederverwendbare" Version der Rückgabe. Daher die wichtigste Schlussfolgerung: Alles, was mit mathematischen (reinen) und gewöhnlichen OOP-Funktionen (einschließlich
Currying ,
Komposition und vielem mehr, dem dieser Aufsatz nicht gewidmet ist) gemacht werden kann, kann mit rx gemacht werden. Funktionen sind blockierend und asynchron: auch rx. Funktionen können Funktionen zurückgeben: rx auch. Funktionen können rekursiv sein: auch rx. Funktionsberechnungen können zwischengespeichert werden: auch in rx.
Es ist merkwürdig, dass Sie in dieser Phase des Verstehens unfreiwillig zur ... funktionalen Programmierung zurückkehren. Nicht aus Gründen der Aussagekraft, nicht aus Gründen der Immunität - dies sind alles (optionale) Boni. Im "Funktionalen", weil es gezwungen ist, in Funktionen und deren Zusammensetzung zu denken; und nach dem unveränderlichen Gesetz „ein Empfang ist ein Prozess“ werden Funktionen (keine Klassen, abstrakten Klassen, Schnittstellen oder was auch immer) zum „Ausgangspunkt“ im Design.
Ich habe alles