środa, 28 grudnia 2011

[RX 5] Tworzymy obserwowalne kolekcje w Reactive Extensions [PL]

Tak jak pisałem we wcześniejszych częściach ([RX 1], [RX 2], [RX 3], [RX 4]), Reactive Extensions dla .NET oferują mnóstwo pomocniczych rozszerzeń pozwalających na proste tworzenie obserwowalnych kolekcji.

Przyjrzyjmy się tym najbardziej podstawowym.

Najprymitywniejsze kolekcje obserwowalne

Poniższa tabela przedstawia najprymitywniejsze (lub inaczej najprostsze) kolekcje obserwowalne. Dla każdego przykładu oprócz funkcji generującej obserwowalną kolekcję, podano również odpowiednik w postaci kolekcji, która mogłaby być przeglądana w sposób "klasyczny", przez zwykły iterator.

Funkcja RX

Przykład RX

Komentarz

Reprezentacja graficzna

Kolekcja klasyczna

Przykład dla kolekcji klasycznej

Observable.Empty<T>()

Observable.Empty<int>()

Obserwowalna kolekcja informuje, że już jest skończona.

Pusta tablica.

new int[0]

Observable.Return<T>(T element)

Observable.Return(777)

Obserwowalna kolekcja zwraca jeden element i informuje, że już jest skończona.

Tablica jednoelementowa.

new int[]{777}

Observable.Throw<T> (Exception e)

Observable.Throw<int> (new Exception("msg"))

Obserwowalna kolekcja informuje o tym, że miał miejsce błąd.

Iterator rzuca Exception.


Observable.Never<T>()

Observable.Never<int>()

Obserwowalna kolekcja o niczym nie informuje.

Iterator zawiesił się.


Observable.Range(begin, end)

Observable.Range(0,2)

Obserwowalna kolekcja zwraca wartości z pewnego zakresu i informuje, że już jest skończona.

Kolekcja (np. Tablica) z zakresem wartości.

Enumerable.Range (0,2)

Observable.Interval (

TimeSpan t);

Observable.Interval (

TimeSpan.FromMilliseconds (100));

Nowa wartość co pewien czas.


Nowa wartość co pewien czas.

Nowa wartość co 100 ms

Przedstawione powyżej metody tworzenia obsesjonalnych są bardzo proste, ale można je traktować jako komponenty (lub też składowe) służące do budowy bardziej skomplikowanych kolekcji (kompozycji będzie poświęcony osobny wpis na blogu).

ToObserwable

Funkcja rozszerzająca "ToObservable" jest najprostszym sposobem na zamianę "zwykłej" kolekcji, na kolekcję obserwowalną. Wystarczy na kolekcji (np. na tablicy) wywołać rozszerzenie ToObservable, by uzyskać obiekt spełniający interfejs IObservable. Przykład wykorzystania podawany był już wcześniej we wpisie p.t.: "Reactive Extensions pierwszy kontakt z kodem (czyli artykułu cz. 3)".

Observable.Generate

Observable.Generate pozwala na wygenerowanie obserwowalnej kolekcji w postaci sekwencji, która iterowana jest tak długo, aż pewien warunek przestanie być spełniany. Dla przykładu zauważmy, że kolekcja obserwowalna wytworzona przez kod:

Observable.Generate( 
  0, 
  i => i < 10, 
  i => i + 1, 
  i => i);

Będzie odpowiadała kolekcji tradycyjnej wytworzonej przez:

for(int i=0;i<10;i++)
  yield return i;

Dostępna jest również odmiana funkcji Generate, w której jednym z parametrów jest przedział czasowy, ustawienie którego spowoduje, że kolejne elementy będą generowane co wskazany czas.

Observable.Create

Observable.Create pozwala na najbardziej elastyczne tworzenie kolekcji obserwowalnej. Do funkcji tej przekazujemy delegat o parametrze IObservable, następnie działamy na przekazanej instancji obiektu wspierającego IObservable, by na końcu zwrócić delegat, który będzie wykonany w momencie Dispose. Dla przykładu, poniższy kod wytworzy kolekcję obserwowalną zwracającą jeden element (liczbę 77) i kończącą się (w momencie Dispose nic nie zostanie wykonane):

Observable.Create<int>(
  observer =>
  {
    observer.OnNext( 77 );
    observer.OnCompleted();
    return ( () => { } );
  } );

Podsumowanie

Reasumując, Reactive Extension dla .NET, dostarcza wiele funkcji wspierających tworzenie obserwowalnych kolekcji, wśród których wymienić należy: Empty, Return, Throw, Never, Range, Interval, Generate, Create.

Tych, których nie znudziła ta kolejna, dość teoretyczna część, zapraszam do przeczytania już wkrótce kolejnych części artykułu.

Promuj

Brak komentarzy:

Prześlij komentarz

Posty powiązane / Related posts