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
Od dawien dawna, tworzenie oprogramowania zwłaszcza związanego z graficznymi interfejsami użytkownika (na potrzeby uproszczenia będę odnosił się właśnie do problemów z GUI). Boryka się z problemem, zacinania, lagów, przechodzenia programów w stan nieokreślony aż do momentu zakończenia przetwarzania pewnego obszaru w kodzie.
Z pomocą przyszła wielowątkowość… Do dyspozycji mamy pewną zmienną ilość rdzeni w procesorze. Daje to możliwość odseparowania wykonywania czasochłonnych operacji na inny wątek i tym samym nieblokowanie GUI.
Niestety nie ma róży bez kolców. I tak jest w przypadku wielowątkowości. Programowanie jest trudniejsze i niesie ze sobą wiele pułapek wynikających z potrzeby jednoczesnego dostępu do tzw. sekcji krytycznej.
Programowanie reaktywne
I o to nowa myśl i idea przychodzi z pomocą: Programowanie reaktywne. Jest to jeden z paradygmatów programowania opierający się kontrolowanie przepływu w programach przy pomocy asynchronicznych strumieni. Owe strumienie są miejscem styku, do którego są publikowane dane oraz z którego poprzez zapisanie się na listę rozsyłane są komunikaty do zainteresowanych obserwatorów.
Drążąc głębiej tematykę, jest to po prostu implementacja wzorca projektowego Obserwator. Gdzie implementujemy dwóch aktorów: Obserwatora i Obserwowanego. Wówczas obserwowany poprzez swoje działanie rozsyła komunikaty do wszystkich zapisanych na wewnętrznej liście obserwatorów.
Taki wzorcowy Big Brother
Słynna firma z Redmond udostępnia nam już istniejący mechanizm owego wzorca, jaki możemy implementować we własnych rozwiązaniach o nazwie Reactive Extensions (RX). Na bazie tej biblioteki mamy możliwość użycia kilku sztuczek:
- pozbycie się problematycznych event-ów (+/-= new EventXXXX()) z kodu,
- wykorzystanie jako odmierzacze czasu (Timery), lub wątki (Thread),
- implementację własnych rozwiązań na bazie interfejsów IObservable, IObserver.
Więcej o sztuczkach w kolejnych postach.
A wszystko to z wykorzystaniem słynnego LINQ oraz lambdy.
Biblioteczki jakie należy zainstalować by korzystać z Reactive Extensions w przypadku Visual Studio:
- Install-Package System.Reactive,
- Install-Package System.Reactive.Linq,
- Install-Package System.Reactive.Core,
- Install-Package System.Reactive.Providers.
W zasadzie pierwsza pozycja powinna zainstalować wymagane zależności.
Zakończenie
Trochę teorii się przyda. W kolejnych postach będę przekazywał bardziej praktyczne przykłady okraszone kodzikiem….
Zapraszam do śledzenia, komentowania.
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
Następny: Programowanie Reaktywne - Zabawa z czasem - Timer.