MR. Dev

Blog programisty.

Programowanie Reaktywne - Wstęp.


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

Wyścig do sekcji krytycznej! 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

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


Następny: Programowanie Reaktywne - Zabawa z czasem - Timer.