![Page 1: ReactiveX: The observer pattern done rightdelphi.pl › zlot › zlot2017 › prezentacje › ReactiveX_SG.pdf · What is ReactiveX? Observable Pull vs Push Operators Schedulers First](https://reader036.vdocuments.net/reader036/viewer/2022063002/5f28e3f05b42ae2d8e056f2d/html5/thumbnails/1.jpg)
ReactiveX: The observer pattern done right
STEFAN GLIENKE
![Page 2: ReactiveX: The observer pattern done rightdelphi.pl › zlot › zlot2017 › prezentacje › ReactiveX_SG.pdf · What is ReactiveX? Observable Pull vs Push Operators Schedulers First](https://reader036.vdocuments.net/reader036/viewer/2022063002/5f28e3f05b42ae2d8e056f2d/html5/thumbnails/2.jpg)
About me
◦ Experience in Turbo Pascal and Delphi since 1997
◦ Education as software developer
◦ Participation in several open source projects
◦ Embarcadero MVP since 2014 and „MVP of the year“ 2015
◦ Specialized in following areas◦ Development of logic and data layers
◦ Software design and architecture
◦ „Clean code“
◦ Lead developer of Spring4D
![Page 3: ReactiveX: The observer pattern done rightdelphi.pl › zlot › zlot2017 › prezentacje › ReactiveX_SG.pdf · What is ReactiveX? Observable Pull vs Push Operators Schedulers First](https://reader036.vdocuments.net/reader036/viewer/2022063002/5f28e3f05b42ae2d8e056f2d/html5/thumbnails/3.jpg)
Agenda
What is ReactiveX?
◦ Observable
◦ Pull vs Push
◦ Operators
◦ Schedulers
First look at Spring.Reactive
![Page 4: ReactiveX: The observer pattern done rightdelphi.pl › zlot › zlot2017 › prezentacje › ReactiveX_SG.pdf · What is ReactiveX? Observable Pull vs Push Operators Schedulers First](https://reader036.vdocuments.net/reader036/viewer/2022063002/5f28e3f05b42ae2d8e056f2d/html5/thumbnails/4.jpg)
What is ReactiveX?
Reactive Extensions
Reactor Pattern
a combination of the best ideas from ◦ the Observer pattern,
◦ the Iterator pattern,
◦ and functional programming
Polyglot implementation
![Page 5: ReactiveX: The observer pattern done rightdelphi.pl › zlot › zlot2017 › prezentacje › ReactiveX_SG.pdf · What is ReactiveX? Observable Pull vs Push Operators Schedulers First](https://reader036.vdocuments.net/reader036/viewer/2022063002/5f28e3f05b42ae2d8e056f2d/html5/thumbnails/5.jpg)
What’s the observer pattern again?
![Page 6: ReactiveX: The observer pattern done rightdelphi.pl › zlot › zlot2017 › prezentacje › ReactiveX_SG.pdf · What is ReactiveX? Observable Pull vs Push Operators Schedulers First](https://reader036.vdocuments.net/reader036/viewer/2022063002/5f28e3f05b42ae2d8e056f2d/html5/thumbnails/6.jpg)
Iterator + Observable
Single items Multiple items
synchronous T getData() IEnumerable<T> GetData()
asynchronous IFuture<T> getData() IObservable<T> GetData()
![Page 7: ReactiveX: The observer pattern done rightdelphi.pl › zlot › zlot2017 › prezentacje › ReactiveX_SG.pdf · What is ReactiveX? Observable Pull vs Push Operators Schedulers First](https://reader036.vdocuments.net/reader036/viewer/2022063002/5f28e3f05b42ae2d8e056f2d/html5/thumbnails/7.jpg)
Iterator <-> Observable
event Enumerable (pull) Observable (push)
Retrieve data MoveNext + GetCurrent onNext(T)
Discover error Raises exception onError(Exception)
Complete MoveNext returned False onCompleted()
![Page 8: ReactiveX: The observer pattern done rightdelphi.pl › zlot › zlot2017 › prezentacje › ReactiveX_SG.pdf · What is ReactiveX? Observable Pull vs Push Operators Schedulers First](https://reader036.vdocuments.net/reader036/viewer/2022063002/5f28e3f05b42ae2d8e056f2d/html5/thumbnails/8.jpg)
Iterator <-> Observable
Enumerable Observable
for x in getDataFromNetwork doProcess(x);
getDataFromNetwork.Subscribe(Process);
![Page 9: ReactiveX: The observer pattern done rightdelphi.pl › zlot › zlot2017 › prezentacje › ReactiveX_SG.pdf · What is ReactiveX? Observable Pull vs Push Operators Schedulers First](https://reader036.vdocuments.net/reader036/viewer/2022063002/5f28e3f05b42ae2d8e056f2d/html5/thumbnails/9.jpg)
The contracts
![Page 10: ReactiveX: The observer pattern done rightdelphi.pl › zlot › zlot2017 › prezentacje › ReactiveX_SG.pdf · What is ReactiveX? Observable Pull vs Push Operators Schedulers First](https://reader036.vdocuments.net/reader036/viewer/2022063002/5f28e3f05b42ae2d8e056f2d/html5/thumbnails/10.jpg)
Observable
![Page 11: ReactiveX: The observer pattern done rightdelphi.pl › zlot › zlot2017 › prezentacje › ReactiveX_SG.pdf · What is ReactiveX? Observable Pull vs Push Operators Schedulers First](https://reader036.vdocuments.net/reader036/viewer/2022063002/5f28e3f05b42ae2d8e056f2d/html5/thumbnails/11.jpg)
Why use Observable?
Composable
Flexible
Less opinionated
![Page 12: ReactiveX: The observer pattern done rightdelphi.pl › zlot › zlot2017 › prezentacje › ReactiveX_SG.pdf · What is ReactiveX? Observable Pull vs Push Operators Schedulers First](https://reader036.vdocuments.net/reader036/viewer/2022063002/5f28e3f05b42ae2d8e056f2d/html5/thumbnails/12.jpg)
OperatorsCreating
◦ Create, Defer, Empty/Never/Throw, From, Interval, Just, Range, Repeat, Start, Timer
Transforming:◦ Buffer, FlatMap, GroupBy, Map, Scan, Window
Filtering:◦ Debounce, Distinct, ElementAt, Filter, First, IgnoreElements, Last, Sample, Skip, SkipLast, Take, TakeLast
Combining:◦ And/Then/When, CombineLatest, Join, Merge, StartWith, Switch, Zip
![Page 13: ReactiveX: The observer pattern done rightdelphi.pl › zlot › zlot2017 › prezentacje › ReactiveX_SG.pdf · What is ReactiveX? Observable Pull vs Push Operators Schedulers First](https://reader036.vdocuments.net/reader036/viewer/2022063002/5f28e3f05b42ae2d8e056f2d/html5/thumbnails/13.jpg)
Buffer
![Page 14: ReactiveX: The observer pattern done rightdelphi.pl › zlot › zlot2017 › prezentacje › ReactiveX_SG.pdf · What is ReactiveX? Observable Pull vs Push Operators Schedulers First](https://reader036.vdocuments.net/reader036/viewer/2022063002/5f28e3f05b42ae2d8e056f2d/html5/thumbnails/14.jpg)
GroupBy
![Page 15: ReactiveX: The observer pattern done rightdelphi.pl › zlot › zlot2017 › prezentacje › ReactiveX_SG.pdf · What is ReactiveX? Observable Pull vs Push Operators Schedulers First](https://reader036.vdocuments.net/reader036/viewer/2022063002/5f28e3f05b42ae2d8e056f2d/html5/thumbnails/15.jpg)
Window
![Page 16: ReactiveX: The observer pattern done rightdelphi.pl › zlot › zlot2017 › prezentacje › ReactiveX_SG.pdf · What is ReactiveX? Observable Pull vs Push Operators Schedulers First](https://reader036.vdocuments.net/reader036/viewer/2022063002/5f28e3f05b42ae2d8e056f2d/html5/thumbnails/16.jpg)
Schedulers
RX is a free-threaded model
Schedulers are controlling where work is being done
Control over where subscribers are doing their work
![Page 17: ReactiveX: The observer pattern done rightdelphi.pl › zlot › zlot2017 › prezentacje › ReactiveX_SG.pdf · What is ReactiveX? Observable Pull vs Push Operators Schedulers First](https://reader036.vdocuments.net/reader036/viewer/2022063002/5f28e3f05b42ae2d8e056f2d/html5/thumbnails/17.jpg)
IObservable<T> and IObserver<T>
IObservable<T> = interfacefunction Subscribe(const observer: IObserver<T>): IDisposable;
end;
IObserver<T> = interfaceprocedure OnNext(const value: T);procedure OnError(const error: Exception);procedure OnCompleted;
end;
![Page 18: ReactiveX: The observer pattern done rightdelphi.pl › zlot › zlot2017 › prezentacje › ReactiveX_SG.pdf · What is ReactiveX? Observable Pull vs Push Operators Schedulers First](https://reader036.vdocuments.net/reader036/viewer/2022063002/5f28e3f05b42ae2d8e056f2d/html5/thumbnails/18.jpg)
Let‘s look at some code!
![Page 19: ReactiveX: The observer pattern done rightdelphi.pl › zlot › zlot2017 › prezentacje › ReactiveX_SG.pdf · What is ReactiveX? Observable Pull vs Push Operators Schedulers First](https://reader036.vdocuments.net/reader036/viewer/2022063002/5f28e3f05b42ae2d8e056f2d/html5/thumbnails/19.jpg)
Delphi implementation difficulties
All operators need to be implemented on the IObservable<T> interface or via static methods◦ for better support we need interface helpers (aka extension methods)
◦ Please vote!◦ https://quality.embarcadero.com/browse/RSP-10336 (generic type helpers)
◦ https://quality.embarcadero.com/browse/RSP-16763 (interface helpers)
Lifetime management of objects being processed through observables need to be considered◦ ARC vs no ARC
ARC on interfaces is working slightly different than in GC languages◦ Easy to cause circular references especially when using nested observables and anonymous methods
![Page 20: ReactiveX: The observer pattern done rightdelphi.pl › zlot › zlot2017 › prezentacje › ReactiveX_SG.pdf · What is ReactiveX? Observable Pull vs Push Operators Schedulers First](https://reader036.vdocuments.net/reader036/viewer/2022063002/5f28e3f05b42ae2d8e056f2d/html5/thumbnails/20.jpg)
Future plans for Spring.Reactive
Support for all canonical operators of Reactive including extensive unit tests
Implementation of various schedulers for different situations
Pushing the Delphi language evolution ;)
![Page 21: ReactiveX: The observer pattern done rightdelphi.pl › zlot › zlot2017 › prezentacje › ReactiveX_SG.pdf · What is ReactiveX? Observable Pull vs Push Operators Schedulers First](https://reader036.vdocuments.net/reader036/viewer/2022063002/5f28e3f05b42ae2d8e056f2d/html5/thumbnails/21.jpg)
I want to know more about ReactiveX!
ReactiveX page:◦ http://reactivex.io
Introduction to Rx (mostly the C# implementation):◦ http://www.introtorx.com
Video series done by Microsoft developers:◦ https://channel9.msdn.com/Series/Rx-Workshop/Rx-Workshop-Introduction
Spring4D: Email:◦ http://spring4d.org [email protected]
![Page 22: ReactiveX: The observer pattern done rightdelphi.pl › zlot › zlot2017 › prezentacje › ReactiveX_SG.pdf · What is ReactiveX? Observable Pull vs Push Operators Schedulers First](https://reader036.vdocuments.net/reader036/viewer/2022063002/5f28e3f05b42ae2d8e056f2d/html5/thumbnails/22.jpg)
Thank you very much for your attention!
Questions?