2013-08-16 21 views
5

Also, wenn ich eine Erweiterungsmethode für einen Typ in einer anderen Bibliothek schreibe, die diesen Typ in eine Rx konvertiert IObservable<T>, was genau ist die Konvention? Ich frage, weil ich dachte AsObservable war der Weg zu gehen, aber ich habe auch ToObservable gesehen. Es ist mir unklar, was wann verwendet wird, oder ob es überhaupt eine echte Konvention gibt.Namenskonvention für Rx-Erweiterungsmethoden?

Könnte es sein ToObservable reserviert ist etwas für das Drehen, dass ein einzelnes Ereignis in ein IObservable<T> wo man Produkt wird voraussichtlich als AsObservable reserviert ist etwas für die Umwandlung, die erwartet wird, eine Folge von Ereignissen in eine IObervable<T> zu produzieren?

+0

Siehe auch [Bart De Smet on * Beobachtungen auf IQbservable - Das Dual von IQueryable * bei ~ 12: 55] (https://channel9.msdn.com/Shows/Going+Deep/Bart-De-Smet-Observations -on-IQbservable-Der-Dual-of-IQueryable), wobei er über das 'To'-Präfix spricht. – Whymarrh

Antwort

5

Wenn Sie nicht einen sehr guten Grund haben, Ihre eigenen Cross-Dualität-Operatoren zu schreiben, müssen Sie im Umgang mit Enumerables und Observables kein "To" Postfix schreiben.

Beachten Sie die folgenden Wahrheiten:

  • ToObservable wird erwartet pull-basierte Sequenzen in Push-basierte Sequenzen zu konvertieren.
  • ToEnumerable wird erwartet, Push-basierte Sequenzen in Pull-basierte Sequenzen zu konvertieren.
  • AsObservable wird voraussichtlich ein Push-basierte Typ wie IObservable<T> zu wickeln.
  • AsEnumerable wird erwartet, dass ein Pull-basierte Typ wie IEnumerable<T> zu wickeln.

Daher sollte To verwendet werden, wenn Sie eine Methode gerade schreiben, die die Dualität der Quelle schaltet, und As sollte verwendet werden, wenn die resultierende Dualität die gleiche wie die Quelle des ist.

In den meisten Fällen verwenden Sie As für Ihre eigenen Methoden, weil die Kreuzdualitätsoperatoren ToObservable und ToEnumerable bereits für Sie geschrieben wurden.

Quellen: Persönliche Erfahrung, MSDN-Dokumentation (oben), Erik Meijer selbst.

+3

Ich würde weiter verallgemeinern, indem Sie darauf hingewiesen, AsObservable wurde früher Hide.Es ist nützlich, um den zugrunde liegenden Typ zu verbergen, vor allem, wenn der zugrunde liegende Typ ein ISubject ist Rückgabe eines Subjekts über eine Methode, die IObservable'1 ist, könnte zurück in Subjekt umgewandelt und manipuliert werden. Hide/AsObservable verhindert diese Manipulation.In Anbetracht dessen würde ich alles nennen, was von einem nicht IObservable zu einem IObservable 'ToObservable' projiziert enthält IEnumerable-Quellen –

+0

Genau! Ich habe die Antwort aktualisiert, um die Formulierung "wraps ... as" anstelle von "casts ... to" zu verwenden, um dies deutlicher zu machen. –

5

Ich kenne keine offizielle Anleitung, aber die wichtigste Metrik, die ich verwenden würde, ist die Menge der Arbeit, die Sie tun. In den meisten Fällen gibt es eine nicht unerhebliche Menge an Arbeit (die an sich subjektiv ist), wie zum Beispiel ein IEnumerable in ein IObservable umzuwandeln, und ich würde ToObservable verwenden. Wenn die Methode ziemlich triviale Arbeit leistet, wie bei der Erweiterungsmethode Observable.AsObservable, scheint AsObservable die bessere Wahl zu sein. Ein weiterer bemerkenswerter Unterschied zwischen diesen beiden Methoden ist, dass AsObservable nicht viel mehr als eine Typumwandlung ist und keine wirklichen Änderungen am Verhalten des Arguments macht, aber Observable.ToObservable(IEnumerable<T>) gibt ein Objekt mit signifikant unterschiedlicher Semantik zurück.

+1

Guter Rat. Ich würde weiter gehen und sagen, dass AsXxx nur eine Besetzung sein sollte (um den Compiler zu zwingen, die gewünschte Erweiterungsmethode zu wählen: vgl.LINQ AsQueryable/AsEnumerable oder das Schlüsselwort C# "as", während alles, was eine Konvertierung betrifft, ToXxx oder FromXxx (z. B. FromAsyncPattern) bevorzugen sollte. Dies passt zu Observable.AsObservable, dessen einzige wirkliche Verwendung es ist, den Compiler zu zwingen, eine IObservable (clientseitige) Erweiterungsmethode über das IQbservable (serverseitige) Äquivalent zu wählen. – itowlson

+1

Gute Punkte, aber nicht ganz zutreffend über den "..nur realen Gebrauch (von AsObservable ...". Ich würde argumentieren, dass es primäre Rolle ist, Sie vor den Verbrauchern zu schützen, die Ihren zugrundeliegenden Typ manipulieren, dh Ihren Typ zurückwerfen können zu einem Thema und dann OnNext/OnError/OnComplete darauf On. –