Kdyby/Events. @ProchazkaFilip



Podobné dokumenty
Objektově orientované programování v PHP 5. Martin Klíma

CMS LARS VIVO VERZE 1.2 Z POHLEDU VIVOJÁŘE

Platforma Java. Petr Krajča. Katedra informatiky Univerzita Palackého v Olomouci. Petr Krajča (UP) KMI/PJA: Seminář V. 27. říjen, / 15

Technologie JavaBeans

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

Enterprise Java Beans 3.0

Lambda funkce Novinky v interfaces Streamy Optional - aneb zbavujeme se null. Java 8. Ondřej Hrstka

Spring framework 2.0. Roman Pichlík CZJUG

Semin aˇr Java N avrhov e vzory Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Duben 2009 Radek Koˇc ı Semin aˇr Java N avrhov e vzory 1/ 25


Dědění, polymorfismus

KIV/PIA 2013 Jan Tichava

Objekty v PHP 5.x. This is an object-oriented system. If we change anything, the users object.

Java Enum Java, zimní semestr ,2017 1

Iterator & for cyklus

IoC/DI. Tomáš Herceg Microsoft MVP (ASP.NET)

Principy objektově orientovaného programování

GUI v Javě (připomínka) Návrhář GUI Příklad aplikace MVC Model-View-Controller Události Vnitřní třídy. MVC Model-View-Controller

Obsah přednášky. GUI v Javě a událostmi řízené programování. Základní prvky grafického rozhraní. Základní komponenty.

GUI v Javě a událostmi řízené programování

návrhový vzor Singleton.

WPA - Konfigurace Java EE aplikace (Maven, struktura war arch. kontejnerem Tomcat 8

Obsah přednášky. GUI v Javě a událostmi řízené programování. Základní prvky grafického rozhraní. Základní komponenty.

GUI v Javě a událostmi řízené programování

public class Karel { private int position; public boolean issmiling; public int getposition() { return position;

GUI v Javě a událostmi řízené programování

Java - výjimky. private void vstup() throws IOException {... }

Architektura softwarových systémů

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

public static void main(string[] args) { System.out.println(new Main().getClass().getAnnotation(Greet.class).text());

Semin aˇr Java N avrhov e vzory Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Duben 2008 Radek Koˇc ı Semin aˇr Java N avrhov e vzory 1/ 24

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

Třídy a objekty. Třídy a objekty. Vytvoření instance třídy. Přístup k atributům a metodám objektu. $z = new Zlomek(3, 5);

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

GUI. JavaFX. Java UI, letní semestr 2017/2018 1

Programování v Javě I. Únor 2009

RMI Remote Method Invocation

Distribuované systémy a výpočty

Object-relational mapping (JPA, Hibernate)

Programování v Javě I. Leden 2008

Rezervační systém Tvorba WWW stránek

Představujeme vám nový objednávkový a platební systém

Aplikační vrstva. Úvod do Php. Ing. Martin Dostal

Anotace a Hibernate. Aleš Nosek Ondřej Vadinský Daniel Krátký

Model-View-Controller architektura PHP frameworks

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

Softwarové komponenty a Internet

RMI - Distribuované objekty v Javě

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

Algoritmy a datové struktury

George J. Klir. State University of New York (SUNY) Binghamton, New York 13902, USA

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Objektově orientované programování

Webové služby a XML. Obsah přednášky. Co jsou to webové služby. Co jsou to webové služby. Webové služby a XML

JAVA JavaBeans Java, letní semestr 2018

Objekty a OOP KAPITOLA 3. První kroky s OOP. V této kapitole: První kroky s OOP. Rozšiřujeme třídy Šablony Soubory projektu

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

Verzování a publikace dat na webu za pomoci PostgreSQL

JAVA JavaBeans Java, letní semestr

JAVA. Aspekty (AOP) AspectJ

ROZJED TO. NABER SMeR

Abstraktní datové typy: zásobník

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

Java Managenent Extension JMX

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

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

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

Obsah přednášky. Technologie. Enterprise Java Beans. Enterprise Java Beans. EJB kontejner. Enterprise Java Beans (EJB)

Parametrizované třídy Generics generické třídy. JDK zavádí mimo jiné tzv. parametrizované třídy - generics

Při studiu tohoto bloku se předpokládá, že student je zvládá základy programování v jazyce Java s využitím vývojového prostředí NetBeans.

DPKOM_06 Dědičnost entit a zpětná volání posluchači

Návrhové vzory Design Patterns

Hiearchical MVC (Model-view-controller) vs. PAC (Presentation-abstraction-control)

Java Výjimky Java, zimní semestr

RUP - Disciplíny. Jaroslav Žáček jaroslav.zacek@osu.cz

1. Téma 12 - Textové soubory a výjimky

KTE / ZPE Informační technologie

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

J z a yk y PH P P P p o p k o r k.

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

Chain of responsibility

Výchozí a statické metody rozhraní. Tomáš Pitner, upravil Marek Šabo

Abstraktní třída a rozhraní

Vybrané partie z jazyka Java Spring a Enterprise JavaBeans (EJB)

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Čipové karty Lekařská informatika

Vláknové programování část V

JavaScript v praxi: Sokoban (5. přednáška)

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

zhav ME sledovan dilu BOLEST

JSR tutorial 1 Úvod do JSR-184

Jini (pronounced GEE-nee) Cvičení 8 - DS 2006

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

ROZJED TO. NABER SMeR

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Skriptovací jazyky. Obsah

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Plánování a vývoj základního frameworku

Session Beans. Petr Aubrecht CA. Vtipy budou tentokrát o krizi:

Transkript:

Kdyby/Events @ProchazkaFilip

Co si povíme? teorie kolem eventů jak to funguje v Nette Kdyby/Events prakticky diskuze? připravte si otázky!

Teorie kolem eventů

Co jsou eventy/hooky? modulárnost rozšiřitelnost znovupoužitelnost

Eventy v Nette? class Circle extends Nette\Object { public $onchange = []; public function setradius($radius) { $this->radius = max(0, $radius); $this->onchange($this, $this->radius); }

Eventy v Nette? $circle = new Circle; $circle->onchange[] = function($circle, $newvalue) { echo 'there was a change!'; }; $circle->setradius(10);

Nette magic class Nette\Object { public function call($name, $args) { foreach ($this->{"on$name"} as $cb) { call_user_func_array($cb, $args); } }

Naco další event systém? není to lazy kompatibilita s otatními systémy doctrine\orm symfony\event-dispatcher

Lazy eventy? $circle->onchange[] = function($arg) use ($foo) { $foo->hardwork($arg); }; $circle->onchange[] = function($arg) use ($bar) { $bar->hardwork($arg); };

Doctrine ORM? class Listener implements EventSubscriber { function getsubscribedevents() { return ['onfoo', 'onbar']; } function onfoo($args) { } //...

Doctrine ORM? $evm = new EventManager(); $evm->addeventsubscriber( new Listener() );

Doctrine ORM? $evm->dispatch( 'onfoo', new Args($foo, $radius) );

Symfony? class Listener implements EventSubscriberInterface { function getsubscribedevents() { return ['onfoo', 'onbar']; } function onfoo($args) { //... }

Symfony? $evd = new EventDispatcher(); $evd->addsubscriber( new Listener() );

Symfony? $evm->dispatch( 'onfoo', new Event($foo, $radius) );

Co takhle, Kdyby se všechny systémy daly používat dohromady?

xkcd.com/927

Kdyby/Events = Nette events (+ Doctrine EventManager)? (+ Symfony EventDispatcher)?

Pojďme vyřešit problém z praxe class OrderProcess { function openorder(); function additem($item); function finish(order $order);

Přidáme posílání emailů... public function construct( EntityManager $em, Nette\Security\User $user, Nette\Http\Session $session ){

Požadavek: Po dokončení objednávky se bude posílat email

Přidáme posílání emailů... public function construct( EntityManager $em, Nette\Security\User $user, Nette\Http\Session $session, Nette\Mail\IMailer $mailer ){

Požadavek: Přidej mi tam kredity za objednávky

Přidáme kredity.. public function construct( EntityManager $em, Nette\Security\User $user, Nette\Http\Session $session, Nette\Mail\IMailer $mailer, My\CreditsRewarder $rewarder ){

Požadavek: Jeden partner chce objednávky posílat do svého pokladního systému

Externí pokladní systém.. public function construct( EntityManager $em, Nette\Security\User $user, Nette\Http\Session $session, Nette\Mail\IMailer $mailer, My\CreditsRewarder $rewarder, Partner\CashRegisterClient $partner ){

Požadavek: Budeme posílat smsky

Posílání smsek... public function construct( EntityManager $em, Nette\Security\User $user, Nette\Http\Session $session, Nette\Mail\IMailer $mailer, My\CreditsRewarder $rewarder, Partner\CashRegisterClient $partner, My\Sms\Sender $smssender ){

Požadavek: V příštích 6 hodinách vracej 50% hodnoty objednávky v kreditech, za všechny objednané burgery

SRP (Single Responsibility Principle)

Vraťme se na začátek... public function construct( EntityManager $em, Nette\Security\User $user, Nette\Http\Session $session ){

a přidejme si jeden event class OrderProcess public $onfinish = []; function finish(order $order) { //... $this->onfinish($this, $order); }

a napíšeme si listenery class OrderMailerListener implements Subscriber { function getsubscribedevents() { return [ 'OrderProcess::onFinish' ]; }

a napíšeme si listenery class OrderMailerListener function construct(imailer $mailer); function onfinish(order $order) { //.. $this->mailer->send($message); }

a napíšeme si listenery class CreditsRewardListener function construct( Rewarder $r, User $user); function onfinish(order $order) { $this->rewarder->reward( $this->user->id, $order->price * 0.05); }

a napíšeme si listenery class SmsSenderListener function construct(sms\sender $sender); function onfinish(order $order) { //.. $this->sender->send($message); }

Nezapomenout registrovat events: subscribers: - OrderMailerListener - CreditsRewardListener - SmsSenderListener

Profit!

Poslední nejasnosti Jak se $onfinish dostane k listenerům? Nemělo to být lazy? Můžu naslouchat na více událostí v jednom listeneru? - Jistě!

A co nějaké nevýhody? Nevíme vůbec co se zavolá IDE s tím neumí pracovat

PhpStorm Kdyby/Events & @juznacz FTW!

Dejte @juznacz follow je to borec

A co ty message queue?

Závěrem? Eventy nejsou silver bullet, užívejte s rozumem.

Dotazy?

Díky za pozornost! filip-prochazka.com Follow me maybe? @ProchazkaFilip