MR. Dev

Blog programisty.

Programowanie Reaktywne - Transformers - OfType and Cast.


Artykuł ten jest częścią serii artykułów na temat Programowania reaktywnego.

Zapraszam na GitHub-a.

Tematy

  1. Wstęp
  2. Zabawa z czasem - Timer
  3. Kto za tym stoi? - Scheduler
  4. Nie zapominaj - Subscribe
  5. Zabawa z czasem - Interval
  6. Zabawa z czasem - Buffer
  7. Zabawa z czasem - Delay
  8. Zabawa z czasem - Sample
  9. Zabawa z czasem - Throttle
  10. Zabawa z czasem - Timestamp/TimeInterval
  11. Tworzymy dane - Generators
  12. Tworzymy dane - Własna klasa publikująca
  13. Marudzimy - Skip
  14. Marudzimy - Take
  15. Łap To! - ConsoleKey
  16. Kombinatorzy - Concat
  17. Kombinatorzy - Repeat
  18. Kombinatorzy - Start With
  19. Kombinatorzy - Ambiguous
  20. Kombinatorzy - Merge
  21. Kombinatorzy - Zip
  22. Kombinatorzy - Switch
  23. Kombinatorzy - When-And-Then
  24. Kombinatorzy - Combine Latest
  25. Transformers - Select
  26. Transformers - OfType and Cast
  27. Transformers - Metadata
  28. Bileciki do kontroli - Unit Tests of Interval
  29. Bileciki do kontroli - Unit Tests of Observer Interval
  30. Bileciki do kontroli - Unit Tests of Create Cold/Hot Observable
  31. Szpryca - AutoFac

Wstęp

Reactive Extensions - OfType 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);

Reactive Extensions - Cast 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:


Wcześniejszy: Programowanie Reaktywne - Transformers - Select

Następny: Programowanie Reaktywne - Transformers - Metadata