Reaktivní programování v.net



Podobné dokumenty
Jakub Čermák Microsoft Student Partner

1 - Úvod do platformy.net. IW5 - Programování v.net a C#

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 3.4.

Paralelní dotazy v PostgreSQL 9.6 (a 10.0)

Dynamicky vázané metody. Pozdní vazba, virtuální metody

JAVA Unit testing Java, zimní semestr

Aleš Keprt Univerzita Palackého v Olomouci listopad 2008, listopad 2009 PARALLEL FX A PARALELNÍ PROGRAMOVÁNÍ NA PLATFORMĚ.NET 4.0

Dotazování nad stromem abstraktní syntaxe

PB161 Základy OOP. Tomáš Brukner

První kapitola úvod do problematiky

Jazyk C# (seminář 6)

PG 9.5 novinky ve vývoji aplikací

Jazyk C# (seminář 3)

Úvod Přetěžování Generika Kolekce Konec. Programování v C# Další jazykové konstrukce. Petr Vaněček 1 / 31

Bázové třídy platformy.net

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

Paralelní a asynchronní programování. Zdeněk Jurka

PB161 Programování v jazyce C++ Přednáška 7

Nové prvky v C# 3.0. David Keprt

PB161 Programování v jazyce C++ Přednáška 7

Vlákna a přístup ke sdílené paměti. B4B36PDV Paralelní a distribuované výpočty

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

Datové typy v Javě. Tomáš Pitner, upravil Marek Šabo

CineStar Černý Most Praha

Michal Augustýn Microsoft Most Valuable Professional

4. Rekurze. BI-EP1 Efektivní programování Martin Kačer

PB161 Programování v jazyce C++ Přednáška 9

Základy objektové orientace I. Únor 2010

Java/QE Akademie - Osnova

Jakub Čermák Microsoft Student Partner

Multiple Event Support

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

Java GUI události. Událostmi řízené programování. Zpracování = obsluha událostí

PB161 Programování v jazyce C++ Přednáška 4

Základy datových vazeb Silverlightu. Funkce Silverlightu 2. Podpora jazyků a technologie.net Framework

Enterprise Java (BI-EJA) Technologie programování v jazyku Java (X36TJV)

C# &.NET. Cvičení Mgr. Filip Krijt.

IRAE 07/08 Přednáška č. 7. Začátek (head)

Dynamické datové struktury III.

PL/SQL. Jazyk SQL je jazykem deklarativním, který neobsahuje procedurální příkazy jako jsou cykly, podmínky, procedury, funkce, atd.

Operátory ROLLUP a CUBE

Více o konstruktorech a destruktorech

Příklad aplikace Klient/Server s Boss/Worker modelem (informativní)

Design Patterns. Tomáš Herceg Microsoft MVP (ASP.NET)

Základy informatiky. 06 Databázové systémy. Kačmařík/Szturcová/Děrgel/Rapant

Úvod do programování - Java. Cvičení č.4

Novinky ve Visual Studio Tomáš Kroupa

Dědění, polymorfismus

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

LINQ. (Language integrated query) Prezentace na 3IT353. Zpracovali: Martin Latiak, Michal Pěnka, Petr Spurný

Stream API. Petr Krajča. Základy programovaní 4 (Java) Katedra informatiky Univerzita Palackého v Olomouci

První kroky s METEL IEC IDE

Nejzajímavější jsou události MouseDown a KeyDown.

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 26.3.

Asynchronní programování v.net

Java a XML. 10/26/09 1/7 Java a XML

Komponenty v.net. Obsah přednášky

6 LINQ Strana LINQ Václav Pachta

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Metodický list k didaktickému materiálu

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 12.2.

C++ 0x aka C++11. Základním kamenem je třída std::thread

Operační systémy. Přednáška 4: Komunikace mezi procesy

Jazyk C# - přístup k datům

Observer. Klasifikace. Alias. Smysl. Potřeba sledování změn objektu a notifikace. Obdoba systému událostí (C#, Java) vlastními prostředky

Paralelní a distribuované výpočty (B4B36PDV)

Základy programovaní 3 - Java. Unit testy. Petr Krajča. Katedra informatiky Univerzita Palackého v Olomouci. 26.,27.

Jazyk C# (seminář 3)

1. Programování proti rozhraní

ISZR Referenční agent.net

TimescaleDB. Pavel Stěhule 2018

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

Funkcionální programování v praxi. Tomáš Petříček tomas@tomasp.net

Kolekce, cyklus foreach

NPRG031 Programování II 1 / :25:46

Zapouzdření. Tomáš Pitner, upravil Marek Šabo

NMIN201 Objektově orientované programování 1 / :36:09

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

NAPOJENÍ ZAŘÍZENÍ S KOMUNIKACÍ BELIMO MP-BUS NA SÍŤ AUTOMATŮ MICROPEL

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Koncept pokročilého návrhu ve VHDL. INP - cvičení 2

Software602 Form Designer

Evoluční algoritmy. Podmínka zastavení počet iterací kvalita nejlepšího jedince v populaci změna kvality nejlepšího jedince mezi iteracemi

Google Web Toolkit. Martin Šurkovský, SUR března Katedra informatiky

Webové služby pro. CenovaMapa.cz

Code Contracts. Robert Haken [MVP ASP.NET, MCT] Software architect, Owner at HAVIT, s.r.o. knowledge-base.havit.cz

Programování v jazyce VISUAL BASIC.NET

8 Třídy, objekty, metody, předávání argumentů metod

Platforma.NET 11.NET Framework 11 Visual Basic.NET Základní principy a syntaxe 13

Paralení programování pro vícejádrové stroje s použitím OpenMP. B4B36PDV Paralelní a distribuované výpočty

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 10.4.

KIV/ZIS cvičení 5. Tomáš Potužák

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

ALG 09. Radix sort (přihrádkové řazení) Counting sort. Přehled asymptotických rychlostí jednotlivých řazení. Ilustrační experiment řazení

UJO Framework. revoluční architektura beans. verze

RNDr. Michal Kopecký, Ph.D. Department of Software Engineering, Faculty of Mathematics and Physics, Charles University in Prague

ČESKÉ VYSOKÉ UČENÍ TECHNICKÉ v Praze Ú12110 Ústav přístrojové a řídící techniky

IRAE 07/08 Přednáška č. 1

Transkript:

Reaktivní programování v.net Tomáš Petříček http://tomasp.net/blog tomas@tomasp.net

Co je reaktivní programování? Psaní aplikací které regaují na události» Klasické.NET eventy Například MouseDown, KeyPress, atd...» Asynchronní operace Například dokončení stahování souboru apod. Jak se to dělá v současné době...» Imperativní zápis Přidávání handlerů pomocí +=» Modifikace nějakého lokálního stavu

Jak by to šlo řešit lépe? Deklarativní programování» Obecný přístup k zápisu řešení» Popisujeme co chceme získat a ne jak to udělat» Nemusíme řešit implementační detaily Deklarativní přístup v.netu».net atributy, XAML zápis, data binding,...» LINQ: Language Integrated Query

Agenda Úvod Deklarativní programování v LINQu Microsoft Rx Framework LINQ dotazy pro práci s událostmi Jak jsou reprezentované události? Práce s událostmi pomocí Observable třídy Reaktivní programování v F# Asynchronní programování s událostmi

Deklarativní programování v LINQu var q = from product in db.products where product.price > 100.0 select product.name; Deklarativní zápis dotazů» Popisuje jaké chceme získat výsledky, ne jak» Bere nějaký vstup typu IEnumerable» Generuje nějaké IEnumerable jako výsledek

Agenda Úvod Deklarativní programování v LINQu Microsoft Rx Framework LINQ dotazy pro práci s událostmi Jak jsou reprezentované události? Práce s událostmi pomocí Observable třídy Reaktivní programování v F# Asynchronní programování s událostmi

LINQ dotazy pro události Kdybychom měli IEnumerable<MouseEventArgs> var filtered = from evt in mousedowns where evt.button == MouseButtons.Right select String.Format("Right click: {0}, {1}", evt.x, evt.y); Deklarativní práce se seznamy...» Bereme nějakou kolekci (IEnumerable) jako vstup» Generujeme nějakou kolekci jako výstup» Můžeme ji předat dále nebo zpracovat přes foreach

LINQ dotazy pro události Podobně funguje IObservable<MouseEventArgs> var filtered = from evt in mousedowns where evt.eventargs.button == MouseButtons.Right select String.Format("Right click: {0}, {1}", evt.eventargs.x, evt.eventargs.y); Deklarativní práce se událostmi...» Bereme nějakou událost (IObservable) jako vstup» Generujeme nějakou událost jako výstup» Můžeme ji předat dále nebo zpracovat přes Subscribe

Jak to vypadá celé? Vytváří IObservable z události pomocí reflection var mousedowns = Observable. FromEvent<MouseEventArgs>(btnClick, "MouseDown") Deklarativně vytváří var filtered = vyfiltrovanou událost from evt in mousedowns where evt.eventargs.button == MouseButtons.Right select String.Format("Right click: {0}, {1}", evt.eventargs.x, evt.eventargs.y); filtered.subscribe(msg => MessageBox.Show(msg)); Zaregistrujeme kód pro zpracování filtrované události

Demo Práce s událostmi pomocí LINQu

Agenda Úvod Deklarativní programování v LINQu Microsoft Rx Framework LINQ dotazy pro práci s událostmi Jak jsou reprezentované události? Práce s událostmi pomocí Observable třídy Reaktivní programování v F# Asynchronní programování s událostmi

Co je vlastně IEnumerable? Objekt, který generuje IEnumerator: public interface IEnumerator<T> { T Current { get; } bool MoveNext(); void Reset(); } Rozhraní nám umožňuje následující:» Posunout se na další element» Zjistíme zda další element existuje» Zjistíme hodnotu dalšího elementu

Jak reprezentovat události Objekt, kterému registrujeme IObserver: public interface IObserver<T> { void OnCompleted(); void OnNext(T value); void OnError(Exception exn); } Po registraci bude volat událost jednotlivé metody:» V případě, že je k dispozici další element» V případě, že observable končí» V případě, že došlo k nějaké chybě

IObservable v.netu Lze vytvářet pomocí Observable.FromXyz Standardní události jako například MouseDown» Volají OnNext v případě že se událost stane» Nikdy nekončí, nikdy se nevolá OnCompleted Asynchronní volání a čekání na výsledek» Zavolá OnNext jednou, poté ihned OnCompleted Vlastnost která se může měnit (DependencyProperty)» Může upozorňovat na změny jako události

Registrace IObserver objektů Stejný princip jako IEnumerator a IObserver» Kolekce vracejí hodnoty jako výsledek public interface IEnumerable<T> { IEnumerator<T> GetEnumerator(); }» Reaktivní něco zavolá naší metodu/objekt public interface IObservable<T> { IDisposable Subscribe(IObserver<T> observer); } Matematicky: Reaktivní svět je duální ke kolekcím

Agenda Úvod Deklarativní programování v LINQu Microsoft Rx Framework LINQ dotazy pro práci s událostmi Jak jsou reprezentované události? Práce s událostmi pomocí Observable třídy Reaktivní programování v F# Asynchronní programování s událostmi

Další operátory pro události Běžné metody známé z LINQ dotazů» Aggregate výpočet jedné hodnoty (např. Max, Count) R Aggregate<T, R>(IObservable<T> source, R seed, Func<R, T, R> aggregate);» Merge spojení více událostí stejného typu IObservable<T> Merge<T>(IObservable<T>[] sources);» Take/Skip ignorování nějakých z událostí IObservable<T> Take<T>(IObservable<T> src, int count); IObservable<T> Skip<T>(IObservable<T> src, int count);

Další operátory pro události Další metody vhodné pro události» Scan jako Aggregate, ale hlásí průběžný stav IObservable<R> Scan<T, R>(IObservable<T> src, R seed, Func<R, T, R> accumulator);» Until spojení více událostí stejného typu IObservable<T> Until<T, O>(IObservable<T> src, IObservable<O> other)» Interval generování událostí každých X sekund IObservable<long> Interval(int duration)

Demo Scan a další operátory...

Operace Flatten IEnumerable<IEnumerable<T>> -> IEnuemerable<T>» Spojení všech prvků kolekce kolekcí do jedné... IObservable<IObservable<T>> -> IObservable<T>» Spojení všech událostí generovaných událostí do jedné...

Demo Dotazy s více from klauzulemi

Agenda Úvod Deklarativní programování v LINQu Microsoft Rx Framework LINQ dotazy pro práci s událostmi Jak jsou reprezentované události? Práce s událostmi pomocí Observable třídy Reaktivní programování v F# Asynchronní programování s událostmi

Asynchronní programování Zápis programu tak, aby neblokoval vlákno let http(url:string) = async { let req = HttpWebRequest.Create(url) let! rsp = req.asyncgetresponse() let reader = new StreamReader(rsp.GetResponseStream()) return! reader.asyncreadtoend() } let pages = Async.Parallel [ http(url1); http(url2) ] Lze použít pro různé návrhové vzory» Paralelizace, reaktivní programování atd...

Reaktivní programování s async Paralelní programování pomocí async» Paralelně běžící agenti kteří komunikují» Používají se vlákna z thread pool Reaktivní programování je další návrhový vzor» Používá stejný jazyk, ale jiné knihovny» Více agentů běží na jednom vlákně» Většinou pouze čekají na událost, pak rychle reagují

Příklad: Počítání kliknutí Zobrazujeme a vytváří počet Async<unit> kliknutí levým tlačítkem let rec loop(count) = async { } Bere int jako parametr let! me = Reactive.AwaitEvent(lbl.MouseDown) let add = if me.button = MouseButtons.Left then 1 else 0 lbl.text <- sprintf "Clicks: %d" (count + add) return! loop(count + add) Rekurzivně voláme loop loop(0) > Async.Start Spustí zbytek kódu až když dojde ke kliknutí Vypadá to jako agregace událostí z dřívějška...» V tomto případě lze napsat snadno pomocí Aggregate

Příklad: Počítání kliknutí Změna omezíme počet kliků za vteřinu let rec loop(count) = async { let! me = Reactive.AwaitEvent(lbl.MouseDown) let add = if me.button = MouseButtons.Left then 1 else 0 lbl.text <- sprintf "Clicks: %d" (count + add) let! _ = Reactive.Sleep(1000) return! loop(count + add) } Spustí další část kódu až po 1000 milisekundách loop(0) > Async.Start Jak lze snadno popisovat agenty obecně?

Agent jako stavový automat Vhodné pro (téměř?) všechny složité problémy» Stavy čekání na nějakou událost» Přechody způsobené vyvoláním události start start Waiting after 1000 milliseconds AwaitEvent( ) Sleep(1000) MouseDown occurred MouseMove (button released) Drawing MouseDown MouseMove (with button pushed) Problém do budoucna výběr mezi více přechody

Demo Ukázková reaktivní aplikace v F#

Díky za pozornost» Otázky a v lepším případě i odpovědi... Další informace:» Moje mailová adresa: tomas@tomasp.net» Reactive Framework: http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx