Artykuł ten jest częścią serii artykułów na temat Programowania reaktywnego.
Zapraszam na GitHub-a.
Tematy
- Wstęp
- Zabawa z czasem - Timer
- Kto za tym stoi? - Scheduler
- Nie zapominaj - Subscribe
- Zabawa z czasem - Interval
- Zabawa z czasem - Buffer
- Zabawa z czasem - Delay
- Zabawa z czasem - Sample
- Zabawa z czasem - Throttle
- Zabawa z czasem - Timestamp/TimeInterval
- Tworzymy dane - Generators
- Tworzymy dane - Własna klasa publikująca
- Marudzimy - Skip
- Marudzimy - Take
- Łap To! - ConsoleKey
- Kombinatorzy - Concat
- Kombinatorzy - Repeat
- Kombinatorzy - Start With
- Kombinatorzy - Ambiguous
- Kombinatorzy - Merge
- Kombinatorzy - Zip
- Kombinatorzy - Switch
- Kombinatorzy - When-And-Then
- Kombinatorzy - Combine Latest
- Transformers - Select
- Transformers - OfType and Cast
- Transformers - Metadata
- Bileciki do kontroli - Unit Tests of Interval
- Bileciki do kontroli - Unit Tests of Observer Interval
- Bileciki do kontroli - Unit Tests of Create Cold/Hot Observable
- Szpryca - AutoFac
Wstęp
Jeżeli lubisz sobie porzucać przedmiotami? Albo pobawić się w magika zamieniając chusteczki w gołębie? Ten post jest zdecydowanie dla Ciebie. Jak i w naszym społeczeństwie, tak samo na Cybertron-ie, czasem trzeba czymś cisnąć by wszyscy zrozumieli ideę…
OfType i Cast
Biblioteka Rx-owa zrodziła w sobie dwa operatory ciskające głazami. Niestety nie każdy głaz może zostać rzucony. Musi on być odpowiedniego typu: object. Jeżeli ten jeden warunek zostanie spełniony to wówczas można rzucić delikwenta.
Na samym początku troche biurokracji, trzeba przygotować bazę wypadową. Tym zajmuje się kod poniżej.
1
2
3
4
5
6
7
static void Main(string[] args)
{
var subscribents = new List<IDisposable>();
AddGeneratedStream(subscribents);
ManualStream(subscribents);
Do zobrazowania wykorzystania rzucania, przygotowałem dwa przykłady. Jeden to także coś nowego: Subject. Z tą klasą możemy zbudować prymitywny manualnie sterowany strumień. Dodatkowo należy wskazać jaki typ będzie znajdował się w strumieniu. Następnie korzystamy już ze znanych metod do sterowania:
- OnNext - wprowadzanie na strumień nowych danych,
- OnCompleted - poinformowaniu o końcu strumienia.,
Do dyspozycji mamy dwóch miotaczy:
- OfType - bardziej doświadczony miotacz, zanim czymś rzuci to sprawdzi czy to czym rzuca jest odpowiedniego typu,
- Cast - nie patrzy łapie i rzuca, jest niebezpieczny czasem może przeforsować się i walnąć wyjątkiem (jak w przykładzie ;)).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private static void ManualStream(ICollection<IDisposable> subscribents)
{
var manualStream = new Subject<object>();
subscribents.Add(manualStream
.OfType<byte>()
.DefaultPrint("OfType"));
subscribents.Add(manualStream
.Cast<byte>()
.DefaultPrint("Cast"));
for (byte i = 0; i < 127; i++)
{
manualStream.OnNext(i);
}
manualStream.OnNext("4");
manualStream.OnNext("5");
manualStream.OnCompleted();
Powyższy manualnie sterowany przykład, przedstawia użycie miotaczy. Wszystko będzie działać prawidłowo do momentu gdy na strumień wprowadzimy ciąg znaków (“4”, “5”). Wówczas OnType przejdzie bez problemu. Natomiast Cast będzie chciał użyć nieodpowiedniego typu i wypluje wyjątek.
Drugi przykład korzysta z Generator-a, jednak jak wcześniej wspomniałem bazą rzutu jest typ object. Dlatego w celach doświadczalnych wykonałem przed rzutowanie z wykorzystaniem Select.
Dzięki takiemu zabiegowi otrzymujemy strumień zawierający typ object. I tak właśnie możemy już wykorzystać miotaczy…
1
2
3
4
5
6
7
8
9
10
11
12
private static void AddGeneratedStream(ICollection<IDisposable> subscribents)
{
var observableStream = GeneratorFactory.CreateGenerator(100, 200, 1, 50)
.Select(item => (object) item);
subscribents.Add(observableStream
.OfType<int>()
.DefaultPrint("OfType"));
subscribents.Add(observableStream
.Cast<int>()
.DefaultPrint("Cast"));
Zakończenie
Jeżeli ktoś chce się pobawić w łapanie rzuconych piłeczek, to zapraszam do zabawy. W przeciwnym wypadku warto zrobić unik;).
Nie mniej jednak czasem rzucić trzeba by wyładować stres. Kończąc na dzisiaj, zapraszam do jutra na kolejny post.
Kod z Wami!.
Jest to post wchodzący w skład podjętego wyzwania ogłoszonego przez MIROBURN we vlogu z dnia 3 lutego 2018 roku.
Celem wyzwania jest systematyczne działanie w ciągu 30 dni.
Postanowiłem pisać post dziennie o tematyce Programowania Reaktywnego dla platformy .NET.
Wszelkie źródła związane z postami znajdują się na repozytorium GitHub.
Stan obecny wyzwania: 30 z 30 dni.
Referencje:
- MSDN - Getting Started with Rx,
- MSDN - Reactive Extensions,
- 101 Rx Samples,
- ReactiveX,
- Code Project,
- GitHub
Wcześniejszy: Programowanie Reaktywne - Transformers - Select
Następny: Programowanie Reaktywne - Transformers - Metadata