Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Introduzione a ReactiveX

Introduzione a ReactiveX

Introduzione a Reactive Programming utilizzando C# e ReactiveX

Andrea Ceroni

April 28, 2016
Tweet

More Decks by Andrea Ceroni

Other Decks in Programming

Transcript

  1. Argomenti ReactiveProgramming observable stream IObservable eIObserver Pullmodel vs Push model

    Coldvs Hot observables ReactiveX classe Observable Operatori 1/18
  2. 3/18 Cosa significa Reactive Programming? paradigma di programmazione dichiarativa in

    cui l’applicazione reagisce ad eventi non necessariamente concorrente
  3. 4/18 What'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 ] time x =6 y= 6 x =22 y= 116 x =7 y= 91 x =33 y= 4 Where(e => e.X > 20) time x =22 y= 116 x =33 y= 4
  4. 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
  5. 6/18 Come 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 collection senza attendere di avere tutti i dati? e se non sappiamo a priori quando dovremo farlo?
  6. 7/18 IEnumerable<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
  7. 8/18 esempio var enumerator = new List<int> { 1, 2,

    3 }.GetEnumerator(); while (enumerator.MoveNext()) { Console.WriteLine(enumerator.Current); } enumerator.Dispose();
  8. 9/18 IObserver<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
  9. 10/18 esempio public static IObservable<int> GetData() { return Observable.Create<int>(o =>

    { o.OnNext(1); o.OnNext(2); o.OnNext(3); o.OnCompleted(); return Disposable.Empty; }); }
  10. 11/18 Confronto IEnumerable IObservable pull push bool MoveNext() voidOnCompleted() T

    Current { get; } void OnNext() throws Exception void OnError(Exception)
  11. 12/18 IObservable<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); }
  12. 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
  13. 14/18 ReactiveX Rxis a library for programming with asynchronous data

    streams. It is a combination of the best ideas from the Observer pattern, the Iterator pattern, and functional programming
  14. 15/18 mette a disposizione la classe Observable che in una

    singola astrazione ci permette di gestire qualsiasi stream possiamo trattare stream di eventi comenormali 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?
  15. 17/18 Riassunto che cosa è un’ observable differenza tra push

    model e pull model differenza tra colde hotobservables wrappare un evento in una observable come concatenare operatori Rx per modificare i dati