Vorteile .NETTO-Rx über die klassische Ereignisse?
.NET 4.0 beta 2 hat eingeführt die IObservable und IObserver Schnittstellen.
Was sind die Vorteile im Vergleich zu klassischen .NET-events? Dies nicht dasselbe problem zu lösen?
- Von einem cross-Technologie-Perspektive, Rx kann (und hat) umgesetzt, um die gleichen Konzepte, Sprachen und Laufzeitumgebungen, die nicht unterstützen, die Ereignisse aus der box; Java und JavaScript als offensichtliche Kandidaten. Ich denke, es ist ein gutes Beispiel für die Vertrautheit, die über Fähigkeiten
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie IObservable als ein Ereignis, ersetzen von code, der Ereignisse verfügbar, die mit den Eigenschaften von Typ IObservable, aber das ist nicht wirklich der Punkt.
Gibt es zwei wichtige Dinge zu verstehen, über IObservable:
Es vereint zwei Konzepte, dass wir nicht wissen, wie zu vereinheitlichen, bevor: asynchrone Operationen (die in der Regel einen einzelnen Wert zurückgeben) und Aktionen (die in der Regel gehen auf ewig).
Es ist composable. Im Gegensatz zu CLR-Ereignisse, IAsyncResult, oder INotifyCollectionChanged es uns ermöglicht, zu bauen, die bestimmte Ereignisse aus der Allgemeinen Ereignisse und asynchrone Operationen.
Hier ist ein Beispiel ich lief in bei der Arbeit nur am Nachmittag.
In Silverlight gibt es einige Effekte, die Sie anwenden können, um ein Bild-Steuerelement, das nicht angewendet werden kann, um eine normale Kontrolle. Um diese Einschränkungen zu umgehen, wenn ein Steuerelement den Inhalt geändert wird, ich kann warten, für seine visuelle Darstellung aktualisiert werden, und nehmen Sie einen screenshot davon. Dann will ich verstecken Ihre visuelle Darstellung, ersetzen Sie es mit der snapshot, und wenden Sie die visuellen Effekte das Bild. Jetzt kann ich anwenden von Bild-Effekten zu Steuern (vorausgesetzt, es ist nicht interaktiv).
Dieses Programm wäre trivial, aber für die Tatsache, dass es sein muss asynchron. Ich muss warten, bis zwei aufeinanderfolgende asynchrone Vorgänge abgeschlossen sind, bevor ich mich bewerben kann Effekte auf das Bild:
Hier ist, wie ich dieses problem beheben, indem Rx:
Diesem Beispiel ist besonders einfach, da es nur zwei aufeinander folgenden Operationen zur Folge. Sogar in diesem einfachen Beispiel wenn wir sehen, dass der Rx-Wert hinzufügt. Ohne ihn hätte ich haben verwendet state-Variablen zu gewährleisten, wurden die Ereignisse auslösen in einer bestimmten Reihenfolge. Ich würde auch habe zu schreiben hatte einige ziemlich hässlichen code ausdrücklich zu trennen von dem LayoutUpdated Ereignis.
Wenn Sie die Programmierung mit Rx der trick ist, zu denken, "Welche Veranstaltung will ich meinen Rahmen?" und dann gehen Sie ihn erstellen. Wir sind ausgebildet, um zu denken über die Ereignisse als einfache input-driven Dinge ("mouseover", "Mausklick", "keyup", etc). Aber es gibt keinen Grund, die Ereignisse nicht sehr Komplex und speziell auf Ihre app ("GoogleMsdnMashupStockDataArrived", "DragStarting" und "ImageContentChanged"). Wenn Sie die Struktur Ihrer Programme auf diese Weise (erzeugen genau die Veranstaltung, die ich brauche und dann darauf zu reagieren, indem Staatliche) werden Sie feststellen, dass Sie weniger Staat bugs, werden mehr bestellt, und sind insgesamt mehr selbst beschreibt.
Habe? 🙂
Ich bin mir nicht sicher über die Vorteile, aber ich sehe folgende Unterschiede mit klassischen .NETZ-events:
Fehlermeldungen
Classic-Ereignisse erfordern eine separate Veranstaltung für dieses, oder ein
EventArgs
Klasse mit einemError
Eigenschaft, die geprüft werden muss.end-of-Benachrichtigungen Benachrichtigung
Classic-Ereignisse erfordern eine separate Veranstaltung für dieses oder ein
EventArgs
Klasse mit einemFinal
Eigenschaft, die geprüft werden muss.Es ist nur eine Erweiterung, um die Ereignis-basierte Programmierung-Modell. Sie schaffen etwas, was implements IObserver, und im Grunde sagst du "hier ist, was ich will, geschehen wird, wenn etwas in der Sammlung-änderungen". So, es ist nur eine Standardisierung, was wir alle gewartet haben zu tun mit Ereignissen.
Üben Sie Druck aus, wie es ist eine große Kehrtwende im Vergleich mit der IEnumerable-Muster. IEnumerable ist "ziehen", in der Erwägung, dass IObservable ist "push".
Der einzige Vorteil, den ich sehe über straight-events ist, dass es eine standardisierte Schnittstelle. Ich sehe eine große überlappung mit ObservableCollection hier aber (und INotifyCollectionChanged). Vielleicht sind Sie versuchen zu verabschieden, das PERL-motto mit .NET: "es gibt mehr als einen Weg, es zu tun".
Sollten Sie auf jeden Fall beobachten Rx-Workshop: Observablen versus Ereignisse video-und
vervollständigen Sie den beigefügten Herausforderung