MR. Dev

Blog programistyczny.

Programowanie Reaktywne - Kombinatorzy - Repeat.


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 - Repeat Dzisiaj ponownie poruszymy temat kombinowania na strumieniach. Tym razem posłużymy się rozszeżeniem Repeat. Jak sama nazwa wskazuję będziemy się powtarzać :). Operatory są dość proste co nie znaczy, że nie są potężnym narzędziem w całej rodzinie Rx-ów.

Repeat

Przy pomocy tego rozszerzenia możemy zaoszczędzić nieco czasu przy kodowaniu. W odniesieniu do poprzedniego posta na temat Concat i wykorzystania pętli do wygenerowania połączonej sekwencji strumieni. Dzisiaj wystarczyło wykorzystać powtarzacz z parametrem: Repeat(ile razy powtórzyć).

Dodatkowo dzisiejsze przykłady są uboższe w ilość kodu, dzięki zniwelowaniu wykorzystania zmiennej przechowującej sekwencję strumieni.

1
2
3
4
5
6
7
8
9
10
11
12
var twoSecondsTimeSpan = TimeSpan.FromSeconds(2);
var fiveSecondsTimeSpan = TimeSpan.FromSeconds(2);

var observableSequenceTenTimes =
  Observable.Range(1, 5)
  .Delay(fiveSecondsTimeSpan)
  .Repeat(10)
  .Subscribe(item =>
    {
      Console.WriteLine($"Only ten times: {item}");
    },
    exception => Console.WriteLine(exception));

Reactive Extensions - Repeat

Dodatkowo posłużyłem się operatorem Delay jak już wiadomo z postów dotyczących timer-owatych. Efektem będzie 5 sekundowe oczekiwanie między poszczególnymi porcjami danych od połączonych strumieni.

Drugi przypadek jest bardziej rozbudowany, i zawiera w sobie wymyślny (losowy ;)) algorytm sekwencji źródeł danych dla obserwatorów. Między poszczególnymi sekwencjami także wykorzystałem Delay.

Co tutaj jest takiego wyjątkowego? Repeat bez parametrów, czyli ciągłe powtarzanie zbudowanej sekwencji. Można to z powodzeniem wykorzystać przy sterowaniu lampkami na choince w Boże Narodzenie przy pomocy PC ;).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var observableSequenceContinually =
  Observable.Range(1, 5)
  .Delay(twoSecondsTimeSpan)
  .Concat(CreateGenerator(100, 200, 10, 500))
  .Delay(twoSecondsTimeSpan)
  .Concat(Observable.Range(100, 5))
  .Delay(twoSecondsTimeSpan)
  .Concat(CreateGenerator(1000000, 2000000, 10000, 100))
  .Delay(fiveSecondsTimeSpan)
  .Repeat()
    .Subscribe(item =>
      {
        Console.WriteLine($"Continually: {item}");
      },
      exception => Console.WriteLine(exception));

Ten skrócony zapis jest bardzo elegancki.

Zakończenie

Kończąc na dzisiaj wnioskiem powtarzajmy do skutku aż zapamiętamy co chcieliśmy przyswoić. Żartuję. Jednak powtarzanie zachowuje się nieco inaczej aniżeli np. Interval. Samo w sobie publikuje już konkretny algorytm i w ten sposób możemy dostarczyć do naszego programu pewien szkielet sterowania zachowaniem.

Dziękuję i zapraszam do dalszego czytania:).


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 - Kombinatorzy - Concat

Następny: Programowanie Reaktywne - Kombinatorzy - Start With