IntroduzioneaReactiveX
Andrea Ceroni
andrea.ceroni@elfo.net
@andrekiba6
Sponsored by
28 aprile
2016
Relatore
Introduzione aReactiveX
Tipo disessione: Frontale
Durata sessione: 45min
Argomenti
ReactiveProgramming
observablestream
IObservable eIObserver
Pullmodelvs Push model
Coldvs Hotobservables
ReactiveX
classeObservable
Operatori
1/18
Code Q & AIntro
2/18
3/18
Cosa significa
Reactive Programming?
paradigma di programmazione dichiarativa
in cui l’applicazione reagisce adeventi
non necessariamente concorrente
4/18
What's the difference between anarray
and events?
Erik Meijer
[ 16, 2, 5, 6, 4, 11, 7 ] Where(x=> IsPrime(x)) [ 2, 5, 11, 7 ]
timex=6
y= 6
x=22
y= 116
x=7
y= 91
x=33
y= 4
Where(e=> e.X > 20)
timex=22
y= 116
x=33
y= 4
5/18
observable= stream di eventi
è possibilecreare facilmentedata stream di qualsiasi cosa, nonsoloeventi
glistream sonopoco costosiintermini di risorse epossono stare ovunque
6/18
Come recuperiamo i dati?
Single Multiple
Sync T GetData() IEnumerable<T> GetData()
Async Task<T> GetData() IObservable<T>GetData()
e sevogliamoprocessarein asincronouna collection
senza attendere di avere tuttiidati?
e se nonsappiamo a prioriquando dovremo farlo?
7/18IEnumerable<T>
Il metodo IEnumerable.GetEnumerator()ritornaun oggettodi tipo IEnumeratorcheci permettedi iterare su una
collectionehaquesti metodieproprietà:
• bool MoveNext():avanza all’elementosuccessivoeritornatrue o false (se esiste o no)
• T Current{ get; }: ritorna l’elementocorrente
• throwsException:la chiamataaCurrent può generare eccezionesel’elementononesiste
• void Dispose() : rilascia le risorse utilizzate dall’enumerator
pull model
8/18esempio
varenumerator = newList<int> { 1, 2, 3 }.GetEnumerator();
while(enumerator.MoveNext())
{
Console.WriteLine(enumerator.Current);
}
enumerator.Dispose();
9/18IObserver<T>
Ogni metododiIEnumeratorha il suo duale nell’interfaccia IObserver :
• void OnCompleted(): notifical’osservatore cheil provider hafinito di mandare dati
• void OnNext(T): rende disponibile un nuovo elemntoall’osservatore
• void OnError(Exception):notifical’osservatore chec’èstato un errore
pushmodel
x time
10/18esempio
public static IObservable<int>GetData()
{
return Observable.Create<int>(o => {
o.OnNext(1);
o.OnNext(2);
o.OnNext(3);
o.OnCompleted();
return Disposable.Empty;
});
}
11/18Confronto
IEnumerable IObservable
pull push
bool MoveNext() voidOnCompleted()
T Current { get; } void OnNext()
throws Exception void OnError(Exception)
12/18
IObservable<T> e IObserver<T>
interface IObserver<inT>
{
voidOnNext(T item);
voidOnCompleted();
voidOnError(Exception error);
}
interface IObservable<outT>
{
IDisposableSubscribe(IObserver<T> observer);
}
13/18
Cold
• iniziaademettere item soloquandovienesottoscritta
• gliitem emessinon sono condivisitragliosservatori
Hot
• emette item indipendentementedall’esistenzadiun osservatore
• gliitem sonocondivisitratutti gliosservatori
Cold vs Hot observables
14/18
ReactiveX
Rxis a library for programming with
asynchronousdata streams.
It is a combination of thebest ideas from
theObserver pattern,theIterator pattern,
and functionalprogramming
15/18
mette a disposizionelaclasseObservablechein unasingolaastrazionecipermette
digestire qualsiasistream
possiamotrattare stream dieventicomenormalicollection
componibile:le queryutilizzano diversioperatorie sipossonocomporre, ilflussoè chiaro
dichiarativa:specificacosafailcodice,non comelofa
trasformativa:lequery possonotrasforamre datidaun tipoadun altro
dalpuntodivistadell’observer l’implementazionenon importa à disaccoppiamento
Quali vantaggi?
16/18
Observable.Just(code)
17/18
Riassunto
che cosaè un’ observable
differenza tra push modelepull model
differenza tra coldehotobservables
wrappare un evento inuna observable
comeconcatenare operatori Rx per
modificare i dati
18/18questions
.ToObservable()
.Subscribe(q=> {
if(iKnowTheAnswer)
Answer(q);J
});
Grazie!

Introduzione a ReactiveX