Rx la joya oculta de Net

53
#dotNetSpain2016 dotNet Spain Conference 2016

Transcript of Rx la joya oculta de Net

Page 1: Rx la joya oculta de Net

#dotNetSpain2016

dotNet Spain Conference 2016

Page 2: Rx la joya oculta de Net

#dotNetSpain2016

Edin KapićSharePoint Practice Lead @ Sogeti [email protected]

Rx, la joya oculta de NET

Page 3: Rx la joya oculta de Net

Patrocinadores

Colaboradores

#dotNetSpain2016

Page 4: Rx la joya oculta de Net

#dotNetSpain2016

¿Rx?Introducción

RxObservablesSujetosTratamiento de secuencias

¡Rx!Reimaginando nuestro códigoRx en en mundo realMás allá de Rx

Agenda

Page 5: Rx la joya oculta de Net

#dotNetSpain2016

Senior Architect & SharePoint Practice Lead

Edin Kapić

sug.cat

@ekapicwww.edinkapic.com

Presidente

Autor

Page 6: Rx la joya oculta de Net

#dotNetSpain2016

¿Rx?

Page 7: Rx la joya oculta de Net

#dotNetSpain2016

Rx (Reactive eXtensions) es una librería .NET que permite hacer programación reactiva

¿Qué es Rx?

Sí, esto es lo que parece: una anguila eléctrica (Electrophorus electricus)

Page 8: Rx la joya oculta de Net

#dotNetSpain2016

Un modelo de programación orientado a flujos de datos y la propagación de los cambios

https://en.wikipedia.org/wiki/Reactive_programming

¿Qué es programación reactiva?

Esto es un marble diagram (diagrama de canicas)

Page 9: Rx la joya oculta de Net

#dotNetSpain2016

Flujos de datos y Rx

API unificada de consumo de datos

asíncronos

Page 10: Rx la joya oculta de Net

#dotNetSpain2016

Rx = Observables + LINQ + Schedulers

Rx = LINQ-to-Events

IEnumerable = Pull, IObservable = Push

Analogías útiles

Page 11: Rx la joya oculta de Net

#dotNetSpain2016

La arquitectura de Rx• obs.Where(x=>x.ID == 1)• Observable.Create()

Extensiones y LINQ

• IObservable• IObserver• Subject

Flujos y eventos

• IScheduler• Dispatchers• Timers

Concurrencia

Page 12: Rx la joya oculta de Net

#dotNetSpain2016

NuGet Rx-MainNET 4+UWPWindows Phone

NuGet RxJS-MainJavaScript

NPM RxNode.js

¿Cómo obtener Rx?

System.Reactive

Page 13: Rx la joya oculta de Net

#dotNetSpain2016

Rx en otras plataformas

Page 14: Rx la joya oculta de Net

#dotNetSpain2016

Rx

Page 15: Rx la joya oculta de Net

static void Main(string[] args){ IObservable<char> obs = "Hello, world!".ToObservable();  obs.Subscribe(x =>

Console.WriteLine(x));  Console.ReadLine();}

Hello, world con Rx

Page 16: Rx la joya oculta de Net

#dotNetSpain2016

Secuencia (flujo, stream) asíncrona de datosObservable

namespace System{ public interface IObservable<out T> {

IDisposable Subscribe(IObserver<T> observer); }}

Page 17: Rx la joya oculta de Net

#dotNetSpain2016

El consumidor de una secuencia observableObserver

namespace System{ public interface IObserver<in T> {

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

}}

Page 18: Rx la joya oculta de Net

Click icon to add picture

Un momento, ¿esto no es algo parecido a……enumerables?

…eventos?

Page 19: Rx la joya oculta de Net

#dotNetSpain2016

Observable versus EnumerableIObservableSubscribe()

IObserverOnNext()OnCompleted()OnError()

IEnumerableGetEnumerator()

IEnumeratorCurrentMoveNext()Reset()

1…2….3….

Observer

1…2….3….

Enumerator

OnNext()MoveNext()

Push Pull

Page 20: Rx la joya oculta de Net

#dotNetSpain2016

Observable versus EventosObservableObjetos “de primera”Todo son métodos normalesSe pueden hacer consultas históricasCiclo de vida sencillo basado en IDisposable

EventoDifícil de componer varios eventos+= -= no es muy amigableNo hay histórico de eventosDifícil de controlar el ciclo de vida

IObservable = Eventos+++

1 2 HandlerSourceObserverObserverObserver

Page 21: Rx la joya oculta de Net

Click icon to add picture

Vale, seguimos con Rx…

Page 22: Rx la joya oculta de Net

#dotNetSpain2016

Subject es IObservable y IObserver a la vezÚtil para hacer de proxy entre los “clientes” y el “origen” de datos

Subject<T>

var subject = new Subject<string>();subject.Subscribe(value => Console.WriteLine(value));subject.OnNext("a");subject.OnNext("b");subject.OnNext("c");

Page 23: Rx la joya oculta de Net

#dotNetSpain2016

Tipos de Subjects

ReplaySubject<T>

BehaviorSubject<T> AsyncSubject<T>

Reproduce todos los valores de la

secuencia para todos los suscritores

Reproduce el último valor de la secuencia

Publica el último resultado de la

secuencia al acabar

Subject.Create()

Page 24: Rx la joya oculta de Net

#dotNetSpain2016

Ciclo de vida de una suscripciónSuscripciónvar sub = IObservable.Subscribe(…);

Fin de suscripciónsub.Dispose();

Observable ObserverOnNext(1)Subscribe(observe

r)

Subscription: IDisposable

OnNext(2)

1 2

Page 25: Rx la joya oculta de Net

#dotNetSpain2016

Secuencias finitas y los errores

Observable ObserverOnCompleted()Subscribe(observ

er)

Subscription: IDisposable

OnError(exception)

1 2

Page 26: Rx la joya oculta de Net

#dotNetSpain2016

Creación de secuenciasManualmente

Observable.ReturnObservable.EmptyObservable.NeverObservable.RangeObservable.CreateObservable.GenerateObservable.IntervalObservable.Timer

A partir de otras cosas

Observable.StartObservable.FromEventPatternObservable.FromAsyncPattern

Task.ToObservable

IEnumerable.ToObservable

Page 27: Rx la joya oculta de Net

Click icon to add picture

Muy bonito, pero no le veo la utilidad

Page 28: Rx la joya oculta de Net

#dotNetSpain2016

Ejemplo: Búsqueda en redes sociales

SearchObservable

Subscribe()

OnNext(x)

TwitterSrch

FacebookSrch

InstagramSrch

Observable.Merge()

GetResultAsync()

GetResultAsync()

GetResultAsync()

Task<T>.ToObservable()

Inte

rnet

Page 29: Rx la joya oculta de Net

#dotNetSpain2016

¿Qué podemos hacer con las secuencias?

1 2

2

1

2

1 2

Filtrar Combinar

1 2

3

Mapear

1 2

B

Reducir

A

Where(x== 2)Merge()

Select(f(x))

Sum()

Page 30: Rx la joya oculta de Net

• Where• OfType

• GroupBy• Buffer• Window

• Distinct• DistinctUntilChanged

• Skip• Take• SkipUntil• TakeUntil

Operadores LINQFiltrar

Agrupar

Valores únicos

Partición

http://freecontent.manning.com/animated-gifs/?s=reactive-extensions

Page 31: Rx la joya oculta de Net

#dotNetSpain2016

ProyecciónSelect SelectMany

1 2

BA

1 2

A BA

Select(x.ToLetter) Select(x.FromAToLetter)

Page 32: Rx la joya oculta de Net

#dotNetSpain2016

Count, Min, Max, Sum, AverageDevuelven un valor escalar

First, Last, SingleDevuelven un elemento de la secuencia

Aggregate, ScanFunción de reducción

Reducción

1 2

3

Sum()

Page 33: Rx la joya oculta de Net

Click icon to add picture

Un momento, no he visto nada de “secuencias en el tiempo” todavía…

Page 34: Rx la joya oculta de Net

#dotNetSpain2016

Combinar secuenciasConcat Switch

1 2

21

3 4

3 4

Merge1 2

31

3 4

2 4

1 2

3

3 4

4

Page 35: Rx la joya oculta de Net

#dotNetSpain2016

Schedulerspublic interface IScheduler{ DateTimeOffset Now { get; } IDisposable Schedule<TState>(TState state,

Func<IScheduler, TState, IDisposable> action); IDisposable Schedule<TState>(TState state,

DateTimeOffset dueTime, Func<IScheduler, TState, IDisposable>

action); IDisposable Schedule<TState>(TState state,

TimeSpan dueTime, Func<IScheduler, TState, IDisposable>

action);}

Page 36: Rx la joya oculta de Net

#dotNetSpain2016

• new Thread(() => { /* do work */ }).Start()• ThreadPool.QueueUserWorkItem(_ => { /* do work */ }, null)• Task.Factory.StartNew(() => { /* do work */ })• syncCtx.Post(_ => { /* do work */ }, null)• Dispatcher.BeginInvoke(() => { /* do work */ })

Abstracción de concurrencia

• scheduler.Schedule(() => { /* do work */ })

Page 37: Rx la joya oculta de Net

#dotNetSpain2016

La mayoría de las operaciones de Rx usan schedulers

Rx y concurrencia

Page 38: Rx la joya oculta de Net

#dotNetSpain2016

Scheduler como parámetro

Page 39: Rx la joya oculta de Net

#dotNetSpain2016

Tipos de schedulers

• ImmediateScheduler • CurrentThreadScheduler• NewThreadScheduler• EventLoopScheduler• HistoricalScheduler

• ControlScheduler• DispatcherScheduler• SynchronizationContextSchedul

er• TaskPoolScheduler• ThreadPoolScheduler

Genéricos Implementados por la plataforma

Page 40: Rx la joya oculta de Net

#dotNetSpain2016

HistoricalScheduler

http://blogs.msdn.com/b/rxteam/archive/2012/06/14/testing-rx-queries-using-virtual-time-scheduling.aspx

Page 41: Rx la joya oculta de Net

#dotNetSpain2016

SubscribeOnDonde se ejecuta el Observable

ObserveOnDonde se ejecuta el Observer

Cambiando el lugar de la ejecución

Page 42: Rx la joya oculta de Net

#dotNetSpain2016

¡Rx!

Page 43: Rx la joya oculta de Net

#dotNetSpain2016

Código que gestiona llamadas asíncronas o eventos

Código que manipula secuencias asíncronas de datos

¿Dónde aplicar Rx?

https://github.com/AdaptiveConsulting/ReactiveTrader

Page 44: Rx la joya oculta de Net

#dotNetSpain2016

Ejemplo: Sugerencias de búsqueda

Page 45: Rx la joya oculta de Net

#dotNetSpain2016

Rx en el mundo real

Page 46: Rx la joya oculta de Net

#dotNetSpain2016

Ix (Interactive Expressions)Más allá de Rx

Page 47: Rx la joya oculta de Net

#dotNetSpain2016

IQbservable<T>Más allá de Rx

Page 48: Rx la joya oculta de Net

#dotNetSpain2016

Tx Logs y trazas reactivos

Más allá de Rx

Page 49: Rx la joya oculta de Net

#dotNetSpain2016

ReactiveUI UI en Xamarin, UWP y WPF con soporte para Rxhttps://github.com/reactiveui

Más allá de Rx

Page 50: Rx la joya oculta de Net

Click icon to add picture

Recursos

Page 52: Rx la joya oculta de Net

Q&A

#dotNetSpain2016

http://aka.ms/DOTNETT7S5

Page 53: Rx la joya oculta de Net

No olvides realizar la encuesta¡Gracias!

#dotNetSpain2016

Edin KapićSharePoint Practice Lead @ Sogeti [email protected] http://aka.ms/DOTNETT7S5