Come, quando e perché usare le Reactive Extensions

Documenti analoghi
UI Test Automation with Xamarin

WPC074 - SQL Server monitoring con DMVs, Powershell e Python

Tutti per uno e Swagger per tutti!

Visual Studio 2015 Le novità dell IDE

Algoritmi di Ricerca. Esempi di programmi Java

Variabili e Metodi di classe Interfacce e Package Gestione di File in Java

Concetti base programmazione. Antonio Gallo

Eccezioni Precisazioni e approfondimenti

AMBIENTI DI PROGRAMMAZIONE

Descrivono la collaborazione di un gruppo di oggetti per implementare collettivamente un comportamento

Java Virtual Machine. Indipendenza di java dalla macchina ospite. I threads in Java

Ereditarietà. Ereditarietà. Ereditarietà. Ereditarietà

Interfacce. Un interfaccia Java è una collezione di metodi astratti (e di costanti) Un metodo astratto è un metodo non implementato

18 - Classi parzialmente definite: Classi Astratte e Interfacce

C# delegates. Vittorio Maniezzo Università di Bologna. Vittorio Maniezzo Università di Bologna 1. Delegate

Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014

JDBC. Marco Tessarotto Programmazione dei Web Server Anno Accademico

Tabella 1 Parametri del generatore di traffico

Uso di metodi statici. Walter Didimo

Programmazione orientata agli oggetti Classi astratte e interfacce

18 - Vettori. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Design Patterns. Introduzione 2. Introduzione 3

La classe java.lang.object

Programmazione Orientata agli Oggetti. Emilio Di Giacomo e Walter Didimo

Esercitazione sui Design Pattern

Node.js + Drupal. Luca Lusso. giovedì 1 dicembre 11

Design Principle. immagini da SOLID Motivational Posters, by Derick Bailey

Macchine Astratte. Nicola Fanizzi Dipartimento di Informatica Università degli Studi di Bari. Linguaggi di Programmazione feb, 2016

Programma del corso. Elementi di Programmazione. Introduzione agli algoritmi. Rappresentazione delle Informazioni. Architettura del calcolatore

Laboratorio di Programmazione Lezione 2. Cristian Del Fabbro

Il linguaggio C Il linguaggio C. Caratteristiche del C. Caratteristiche del C. Linguaggi di Programmazione I. Ferdinando Cicalese

Ereditarietà (ultima)

24 - Possibili approfondimenti

Linguaggi di Programmazione

Corso di Laurea in Matematica Corso di Informatica Prova d Esame del 02/02/2010

Fondamenti di Informatica. Algoritmi di Ricerca e di Ordinamento

Non si deve fare ALCUN riferimento alla parte specifica di JDBC.

14 - Metodi e Costruttori

Thread in Java. Thread = flusso di esecuzione indipendente nel codice del programma

Esempi al calcolatore su: 1) Costruttori ed ereditarietà 2) Subtyping e polimorfismo

Sistemi Operativi. Sistemi I/O SISTEMI DI INPUT/OUTPUT. Hardware di I/O. Interfaccia di I/O per le applicazioni. Sottosistema per l I/O del kernel

Proprietà delle Classi e degli Oggetti in Java

MapServer. Marco Negretti

Esercizio 1: archivio CD e DVD

SCHEMA ER. Tutti i dati del carrello acquisti sono memorizzati nel database e quindi può essere costruito con più query.

Programmazione ad Oggetti. Programmazione ad Oggetti. JUnit è un ambiente di test per programmi Java. Sviluppato da Kent Beck

Streaming Tool per CoFFEE

Alcuni diagrammi. OCL (Object Constraint Language)

LINGUAGGI DI ALTO LIVELLO

Ingegneria del Software

Programmazione Java Struttura di una classe, Costruttore, Riferimento this

Strumenti per l automazione del testing di applicazioni web Javascript-based

Java: loading dinamico e reflection

Service discovery nella API Java Bluetooth JSR-82

Programmazione orientata agli oggetti Oggetti Composti. Oggetti composti

Sequential Functional Chart

Laboratorio di Progettazione di Sistemi Software UML per Design Patterns e Refactoring

Esercitazioni di PROGETTAZIONE DEL SOFTWARE A.A

Collaudo del software

Oggetti Composti (1) Oggetti Composti (2)

Fondamenti di Informatica T1 Mappe

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

Java: Definire Classi e Creare Oggetti

MapServer. Marco Negretti. Politecnico di Milano Polo Regionale di Como

Fondamenti di Informatica T-1

DA DEFINIRE Sede del corso: Presso GI Formazione in Piazza IV novembre 5, Milano Orari dalle 9.00 alle e dalle alle 18.

LE TABELLE. Le liste permettono di avere una sequenza di righe In alcune applicazioni è però necessario visualizzare le informazioni anche in colonne

Primi passi con JFlex

Analizzatore lessicale o scanner. Lo scanner rappresenta un'interfaccia fra il programma sorgente e l'analizzatore sintattico o parser.

Ingegneria degli Algoritmi (II parte pratica)

Agenti Mobili in Java RMI

22 - Strutture Dati (Java Collections Framework)

Riferimenti ad oggetti: Fondamenti di Informatica L-B Esercitazione n 4 Java: I/O, Costruttori e altro. Riferimenti ad oggetti: (Esempio)

Esercitazione n 1. Obiettivi

Macchine astratte, linguaggi, interpretazione, compilazione

Classi astratte e progettazione OOP Esempio: l enciclopedia degli animali

Gli EJB offrono vari vantaggi allo sviluppatore di una applicazione

Classi astratte e progettazione OOP Esempio: l enciclopedia degli animali. Esempio Animali

AXO - Architettura dei Calcolatori e Sistema Operativo. organizzazione strutturata dei calcolatori

Informatica. Dipartimento di Economia. Ing. Cristiano Gregnanin. 20 ottobre Corso di laurea in Economia

Il Pattern PROXY. Ex presentazione realizzata dallo studente Paolo Melchiori (matricola 65734) nell a.a

JavaScript Core Language. Prof. Francesco Accarino IIS Atiero Spinelli Sesto San Giovanni via leopardi 132

Corso sul linguaggio Java

Programmazione con Java

appunti delle lezioni Architetture client/server: applicazioni server

I processi di innovazione

Entity Framework & SQL Server - Better Together

LA SINTASSI DEI LINGUAGGI DI PROGRAMMAZIONE. Ivan Lanese

Analizzatori Lessicali con JLex. Giuseppe Morelli

Java Le stringhe. Stringhe

LE TABELLE. Le liste permettono di avere una sequenza di righe In alcune applicazioni è però necessario visualizzare le informazioni anche in colonne

TIPI PRIMITIVI: LIMITI

CORSO MOC20488: Developing Microsoft SharePoint Server 2013 Core Solutions

Classi astratte e progettazione OOP Esempio: l enciclopedia degli animali. Esempio Animali

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Capitoli 8 e 9. SQL embedded. Applicazioni tradizionali Applicazioni Internet. Sistemi di basi di dati Raghu Ramakrishnan, Johannes Gehrke

SAX e DOM. Analisi di un documento

D B M G Il linguaggio HTML

MANUALE MODULO WIDGET EVENT TRACKING LICENZA SaaS

Programmazione ad oggetti

Transcript:

presenta Come, quando e perché usare le Reactive Extensions Raffaele Rialdi - MVP Developer Security @raffaeler raffaeler@vevy.com www.wpc2015.it info@wpc2015.it - +39 02 365738.11 - #wpc15it 1

I principi della programmazione reattiva Composizione Asincrona di Eventi usando Sequenze Osservabili Quando sono utili? Quando è necessario processare eventi Più in generale quando è utile usare il pattern Publisher-Subscriber Il Framework.NET definisce le due interfacce base nella BCL IObservable<T> viene implementata dal publisher IObserver<T> rappresenta i subscriber Le Reactive extensions sono una delle possibili implementazioni del pattern basato su queste due interfacce Non è quasi mai necessario implementare IObservable e IObserver Offrono degli extension methods che mimano il comportamento di Linq Libreria di funzionalità molto estesa www.wpc2015.it info@wpc2015.it - +39 02 365738.11 4

Linq + dimensione del tempo = Reactive Extensions Una query Linq viene eseguita in un istante "t" su un set di dati Al momento della query, il set di dati è invariante (non cambia durante la query stessa) Le reactive extensions estendono Linq aggiungendo la dimensione del tempo Gli eventi accadono lungo una linea temporale I «Marble Diagrams» permettono di visualizzare meglio questo approccio Linq classico 3 1 2 20 30 10 Reactive Linq 10 1 20 2 30 3 source.where(x => x % 2 == 0) observable.where(x => x % 2 == 0) 2, 10, 20, 30 10 20 2 30 www.wpc2015.it info@wpc2015.it - +39 02 365738.11 5

Cos'è un «Observable» Rappresenta una sorgente, un generatore di sequenze osservabili Può essere un oggetto che implementa IObservable (raramente è utile) Può essere un oggetto che traduce occorrenze asincrone in IObservable Eventi, delegate, timer La logica è totalmente capovolta Una sorgente dati normalmente la si accede in "pull" si prendono attivamente i dati Un Observable è invece in push i dati vengono mandati dalla sorgente verso il client In termini di Linq, IObservable<T> è l'equivalente di IEnumerable<T> È Lazy (in funzione del tempo) È componibile (Select, Where, GroupBy, ma anche molti altri nuovi operatori) Cold: sono le sequenze erogate "On Demand" (all'arrivo di un Subscriber) Hot: sono le sequenze che producono dati a prescindere dai Subscribers www.wpc2015.it info@wpc2015.it - +39 02 365738.11 6

Cos'è un «Observer» Rappresenta un possibile sottoscrittore dell'observable interessato a fruire dei dati Il sottoscrittore è "passivo" (es: non ha possibilità di controllare la velocità dei dati) Il sottoscrittore comunica le tre "callback" che servono a ricevere i dati oppure var disposable = observable.subscribe( m => Console.WriteLine(m), // OnNext e => Console.WriteLine(e.Message), // OnError () => Console.WriteLine("OnCompleted")); // OnCompleted var observer = GetObserver<long>(); var disposable = observable.subscribe(observer); public IObserver<T> GetObserver<T>() { return new AnonymousObserver<T>( m => Console.WriteLine(m), e => Console.WriteLine(e.Message), () => Console.WriteLine("End")); } La «OnError» termina la sequenza (è necessario ri-eseguire la Subscribe) www.wpc2015.it info@wpc2015.it - +39 02 365738.11 7

Creare un Observable A partire da una Action Mimando un "for loop" IObservable<string> Generate() { return Observable.Generate<int, string>( 0, // initial state x => x < 10, x => x + 1, x => x.tostring(), x => TimeSpan.FromSeconds(x)); } Come fosse un timer Observable.Interval(TimeSpan.FromSeconds(1)); Observable.Timer(TimeSpan.Zero, TimeSpan.FromSeconds(1)); Da un set di dati: Observable.Range(1, 10); Molti altri. IObservable<T> Gen<T>(Func<T> producer) { return Observable.Create<T>(obs => { Timer _timer; _timer = new Timer(500); _timer.enabled = true; } }); _timer.elapsed += (o, e) => { var t = producer(); obs.onnext(t); }; return () => { _timer.enabled = false; _timer.dispose(); }; www.wpc2015.it info@wpc2015.it - +39 02 365738.11 8

Creazione di Observable semplici Observable<string>() Viene chiamata OnCompleted Observable.Return(10) Viene chiamata OnNext(10) e OnCompleted Observable.Throw<long>(exception) Viene chiamata OnError(exception) Observable.Never<int>() Non viene chiamato nulla www.wpc2015.it info@wpc2015.it - +39 02 365738.11 9

Generare Observable a partire da eventi Observable.FromEventPattern converte un evento in Observable IObservable<EventPattern<MouseEventArgs>> mousedownobservable = Observable.FromEventPattern<MouseEventHandler, MouseEventArgs>( h => this.mousedown += h, h => this.mousedown -= h); Esiste anche Observable.FromEvent per eventi non-standard Cioè quando la firma è diversa da (object sender, EventArgs args) Gli eventi possono essere "projected" come fosse una query Linq IObservable<Point> mousedownobservable = Observable.FromEventPattern<MouseEventHandler, MouseEventArgs>( h => this.mousedown += h, h => this.mousedown -= h).select(e => e.eventargs.location); www.wpc2015.it info@wpc2015.it - +39 02 365738.11 10

Subject<T> public sealed class Subject<T> : ISubject<T>, ISubject<T, T>, IObserver<T>, IObservable<T>, IDisposable {... } Il Subject è un oggetto che si comporta sia come Observable che come Observer In altre parole si comporta come un Proxy È molto comodo per generare delle sequenze var subject = new Subject<string>(); var observable = subject as IObservable<string>; var disposable = observable.subscribe(s => Console.WriteLine(s)); Consuma dati for (int i = 0; i < 10; i++) { subject.onnext(i.tostring()); } Genera dati ReplaySubject<T> è una versione «cached» del Subject In alternativa si può usare l'extension method "Replay" su una qualsiasi Observable Mantiene i valori storici che verranno mandati all'observer alla sottoscrizione www.wpc2015.it info@wpc2015.it - +39 02 365738.11 12

Condividere una sola Subscription con più subscribers L'extension method Publish trasforma IObservable<T> in IConnectableObservable<T> I dati diventano disponibili ai sottoscrittori attuali appena viene invocato Connect() In altre parole Connect sposta il ciclo di vita della connessione alla sorgente sottostante www.wpc2015.it info@wpc2015.it - +39 02 365738.11 13

Operatori interessanti Throttle, Buffer, Combine, CombineLatest, Zip, Merge, Take, Skip, TimeStamp,... Esempio Autocomplete Observable.FromEventPattern<EventHandler, EventArgs>( h => textbox1.textchanged += h, h => textbox1.textchanged -= h).select(e => ((TextBox)e.Sender).Text).Throttle(TimeSpan.FromMilliseconds(200)).Where(t => t.length > 2).DistinctUntilChanged().ObserveOn(this).Subscribe(x => Suggest(x))); www.wpc2015.it info@wpc2015.it - +39 02 365738.11 14

Reactive in action Disponibile su nuget Rx-Main: package principale usato tipicamente nelle app server Rx-Winforms: referenzia Rx-Main e aggiunge helpers per facilitare Control.Invoke Rx-WPF: Come per Winforms, ma per WPF Rx-WindowStoreApps: Idem ma per le Apps Disponibile per C++, Javascript, Ruby, Python, Java, etc. etc. www.wpc2015.it info@wpc2015.it - +39 02 365738.11 15

Scenari dinamici Non esiste una IObservable non tipizzata Negli scenari dinamici è una limitazione (anche se superabile) I dati che fluiscono tramite le RX possono essere trasformati "On Demand" Richiede la creazione dinamica delle Expression che fungono da Projection Il filtraggio dei dati è più efficiente se viene eseguito prima possibile La Where deve essere quanto più vicina alla sorgente La creazione della Where via Expression è una soluzione efficiente Se siete interessati a questi scenari, vi aspetto alla prossima sessione su Metaprogramming in C# (sala Verde) www.wpc2015.it info@wpc2015.it - +39 02 365738.11 16

Domande e Risposte Q & A www.wpc2015.it info@wpc2015.it - +39 02 365738.11 - #wpc15it 17

OverNet Education info@overneteducation.it www.overneteducation.it Tel. 02 365738 Contatti OverNet Education @overnete www.facebook.com/overneteducation www.linkedin.com/company/overnet-solutions www.wpc2015.it www.wpc2015.it info@wpc2015.it - +39 02 365738.11 - #wpc15it 19