Introduzione a ReactiveX

21
Introduzione a ReactiveX Andrea Ceroni [email protected] @andrekiba6 Sponsored by 28 aprile 2016 Relatore

Transcript of Introduzione a ReactiveX

Page 1: Introduzione a ReactiveX

Introduzione a ReactiveX

Andrea [email protected]

@andrekiba6

Sponsored by

28 aprile 2016

Relatore

Page 2: Introduzione a ReactiveX

Introduzione a ReactiveX

Tipo di sessione: Frontale

Durata sessione: 45min

Page 3: Introduzione a ReactiveX

Argomenti

Reactive Programming

observable stream

IObservable e IObserver

Pull model vs Push model

Cold vs Hot observables

ReactiveX

classe Observable

Operatori

1/18

Page 4: Introduzione a ReactiveX

Code Q & AIntro

2/18

Page 5: Introduzione a ReactiveX

3/18Cosa significa

Reactive Programming?

paradigma di programmazione dichiarativain cui l’applicazione reagisce ad eventi

non necessariamente concorrente

Page 6: Introduzione a ReactiveX

4/18What's the difference between an array and events?

Erik Meijer

[ 16, 2, 5, 6, 4, 11, 7 ] Where(x => IsPrime(x)) [ 2, 5, 11, 7 ]

timex =6y= 6

x =22y= 116

x =7y= 91

x =33y= 4

Where(e => e.X > 20)timex =22

y= 116x =33y= 4

Page 7: Introduzione a ReactiveX

5/18

observable = stream di eventi

è possibile creare facilmente data stream di qualsiasi cosa, non solo eventi

gli stream sono poco costosi in termini di risorse e possono stare ovunque

Page 8: Introduzione a ReactiveX

6/18Come recuperiamo i dati?

Single Multiple

Sync T GetData() IEnumerable<T> GetData()

Async Task<T> GetData() IObservable<T> GetData()

e se vogliamo processare in asincrono una collectionsenza attendere di avere tutti i dati?

e se non sappiamo a priori quando dovremo farlo?

Page 9: Introduzione a ReactiveX

7/18IEnumerable<T>Il metodo IEnumerable.GetEnumerator() ritorna un oggetto di tipo IEnumerator che ci permette di iterare su una collection e ha questi metodi e proprietà:

• bool MoveNext() : avanza all’elemento successivo e ritorna true o false (se esiste o no)• T Current{ get; } : ritorna l’elemento corrente• throws Exception : la chiamata a Current può generare eccezione se l’elemento non esiste• void Dispose() : rilascia le risorse utilizzate dall’enumerator

pull model

Page 10: Introduzione a ReactiveX

8/18esempiovar enumerator = new List<int> { 1, 2, 3 }.GetEnumerator();

while (enumerator.MoveNext()){

Console.WriteLine(enumerator.Current);}enumerator.Dispose();

Page 11: Introduzione a ReactiveX

9/18IObserver<T>Ogni metodo di IEnumerator ha il suo duale nell’interfaccia IObserver :

• void OnCompleted(): notifica l’osservatore che il provider ha finito di mandare dati• void OnNext(T) : rende disponibile un nuovo elemnto all’osservatore• void OnError(Exception) : notifica l’osservatore che c’è stato un errore

push model

x time

Page 12: Introduzione a ReactiveX

10/18esempiopublic static IObservable<int> GetData(){

return Observable.Create<int>(o => {o.OnNext(1);o.OnNext(2);o.OnNext(3);o.OnCompleted();return Disposable.Empty;

});}

Page 13: Introduzione a ReactiveX

11/18ConfrontoIEnumerable IObservable

pull push

bool MoveNext() void OnCompleted()

T Current { get; } void OnNext()

throws Exception void OnError(Exception)

Page 14: Introduzione a ReactiveX

12/18IObservable<T> e IObserver<T>

interface IObserver<in T> {

void OnNext(T item);void OnCompleted();void OnError(Exception error);

}

interface IObservable<out T> {

IDisposable Subscribe(IObserver<T> observer); }

Page 15: Introduzione a ReactiveX

13/18

Cold

• inizia ad emettere item solo quando viene sottoscritta• gli item emessi non sono condivisi tra gli osservatori

Hot

• emette item indipendentemente dall’esistenza di un osservatore• gli item sono condivisi tra tutti gli osservatori

Cold vs Hot observables

Page 16: Introduzione a ReactiveX

14/18ReactiveX

Rx is a library for programming withasynchronous data streams.

It is a combination of the best ideas fromthe Observer pattern, the Iterator pattern,

and functional programming

Page 17: Introduzione a ReactiveX

15/18

mette a disposizione la classe Observable che in una singola astrazione ci permettedi gestire qualsiasi stream

possiamo trattare stream di eventi come normali collection

componibile: le query utilizzano diversi operatori e si possono comporre, il flusso è chiaro

dichiarativa: specifica cosa fa il codice, non come lo fa

trasformativa: le query possono trasforamre dati da un tipo ad un altro

dal punto di vista dell’observer l’implementazione non importa à disaccoppiamento

Quali vantaggi?

Page 18: Introduzione a ReactiveX

16/18

Observable.Just(code)

Page 19: Introduzione a ReactiveX

17/18

Riassunto

che cosa è un’ observable

differenza tra push model e pull model

differenza tra cold e hot observables

wrappare un evento in una observable

come concatenare operatori Rx per modificare i dati

Page 20: Introduzione a ReactiveX

18/18questions.ToObservable().Subscribe(q => {

if(iKnowTheAnswer)Answer(q); J

});

Page 21: Introduzione a ReactiveX

Grazie!