MR. Dev

Blog programisty.

Programowanie Reaktywne - Kombinatorzy - Ambiguous.


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 - Ambiguous Krótko, bardzo krótko dzisiaj. A wszystko przez nadchodzące [devwarsztaty.pl]. Będę debiutował. Stres, strach przed oczami… Bla bla bla pora trochę napisać o Rx tak mało ostatnio poruszałem ten temat na tym blogu;) Dzisiaj kolejny operator związany z kombinowaniem. Zapraszam!

Ambiguous

Kto szybszy ten lepszy. Bywa czasem tak że współzawodnictwo jest nam bardzo na rękę. Z innej strony możemy korzystać ze powielonymi strumieniami danych. Wówczas nie wiadomo który wybrać. Jaki obsługiwać a może nie obsługiwać. W tej sytuacji dzisiejszy bohater Observable.Amb jest odpowiedni. Wybiera strumie który najszybciej dostarcza dane, pozostałe pomija.

Ale najpierw mały refaktor, przeniosłem metodę tworzenia generatorów CreateGenerator do do fabryczki.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
namespace RXLib.Factories
{
	public static class GeneratorFactory
	{
		public static IObservable<int> CreateGenerator(int initialState, int conditionValue, int incrementValue, int periodValue)
		{
			var period = TimeSpan.FromMilliseconds(periodValue);

			var generator = Observable.Generate(
				initialState,
				condition => condition <= conditionValue,
				iterate => iterate + incrementValue,
				resultSelector => resultSelector,
				timeSelector => period
			);

Reactive Extensions - Ambiguous Samo użycie Observable.Amb jest banalnie proste, podajemy po prostu listę strumieni jako parametry. Metody Amb i gotowe. Po zapisie na nowego dostawcę treści. Możemy wypisać cóż tam się na nim znajduje. Publikowane treści oczywiście powinny być tego samego typu.

-Bo inaczej jak u diabła mam wybrać z pośród wszystkich dostarczonych źródełek - powiedział Amb po czym rzucił wyjątkiem, aż sie wszystko w sofcie posypało…

1
2
3
4
5
6
7
8
9
10
11
12
var observableGenerator1 = GeneratorFactory.CreateGenerator(0, 100, 1, 30);
var observableGenerator2 = GeneratorFactory.CreateGenerator(1000, 1050, 1, 20);
var observableGenerator3 = GeneratorFactory.CreateGenerator(10000, 10020, 1, 40);

var observableAmbiguous = Observable.Amb(observableGenerator1, observableGenerator2, observableGenerator3);

var subscribent = observableAmbiguous.Subscribe(
  item =>
  {
    Console.WriteLine($"Amb: {item}");
  },
  exception => Console.WriteLine(exception));

Bardzo banalna metoda, jednak pozwala unikać duplikacji. :)

Zakończenie

To był fast-post. :) Niekiedy takie muszą być. Czasem mam myśli, że już się wyprztykałem i nic więcej nie na piszę. A chce dostarczyć wartość i to może być w takiej sytuacji trudne. Nie mniej jednak liczę skrycie, że ktoś kiedyś wyciągnie coś z tych moich publikacji. Dzięki i zapraszam na kolejne…


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 - Start With

Następny: Programowanie Reaktywne - Kombinatorzy - Merge