Programação
Reativa e Funcional e
extensões para PHP
#darkmiraTour
@jchahoud

Maio 2017
ReactiveX ou Rx
X
X
Juliana Chahoud
@jchahoud
Mobile Developer
Scala
Scala RxSwift RxJAVA
Rx e funcional são uma arquitetura?
Um pattern?
Não.. são outros paradigmas de
programação
1. Concorrência de maneira fácil !

2. Fácil de testar

3. Fácil de ler e entender os resultados 

4. Evitar problemas confusos e erros no código

5. Código conciso (Menos é mais)
Mas porque raios me importar?
Mas melhor
do que acreditar
em mim…
66%
34%
Netflix Resto
34% de todo
tráfego de internet
na América do
Norte
Uma historinha de como o Netflix, Microsoft e outros
resolveram
GRANDES problemas de "assincronia"
… pensando diferente sobre EVENTOS
Tudo no Netflix é
assíncrono
• Startup
• Players
• Acesso a dados
• Animações
• etc…
Um inferno
chamado Async!!
• Memory leaks
• Condições de corrida
• Callbacks "aninhados
• Máquinas de estados
complexas
• etc…
Imperativo X Reativo
Pensando de maneira "Reativa"
Então o que é programação reativa?
programar com fluxos(streams) de
dados assíncronos
fluxo (streams) de dados assíncronos
sequência de eventos que ocorrem
em um período de tempo
X
Indica um evento,
com algum valor
Indica um erro
Indica fim do
stream
Três coisas podem ser emitidas
X
Subscribe !
X
function ($x) {
//do something
}
function (Exception $e) {
….},
function () {
//completou
}
X
Observers
Observable
(algo observável)
function ($x) {…}
function () {…}
Observer
Stream
Observer Design Pattern
Observable
programação funcional
RxPHP, RxNet, RxJava, RxJS, RxSwift, etc
1 2 3 4
Ex: Stream (Observável)
a partir de um array
$stream = RxObservable ::fromArray([1, 2, 3, 4]);
1 2 3 4
“Subscribing" representado por…
$stream->subscribe
$stream = RxObservable::fromArray([1, 2, 3, 4]);
$stream->subscribe(
function ($x) {
echo 'Next: ', $x, PHP_EOL;
},
function (Exception $ex) {
echo 'Error: ', $ex->getMessage(), PHP_EOL;
},
function () {
echo 'Completed', PHP_EOL;
}
);
• Criar streams
• Transformar
• Filtrar
• etc
Caixa de ferramentas para…
Aqui entra a “mágica" do funcional
1 2 3
Map
map( x => 10*x)
10 20 30
$observable = RxObservable::fromArray([1, 2, 3]);
$observable
->map(function ($elem) {
return $elem * 10;
})
->subscribe($stdoutObserver);
Nos permite encadear funções como:
Stream.map(f).scan(g)…
Imutabilidade
1 2 3
Reduce
(acumulador ou agregador)
reduce ( (x,y) => x+y)
6
$source = RxObservable::fromArray([1,2,3]);
$subscription = $source
->reduce(function ($x, $y) {
return $x + $y;
})
->subscribe($createStdoutObserver());
O poder do Rx!
OK! Quero outro
exemplo da vida real
Mantra do Rx:
(quase) tudo pode ser um stream
Observable a partir de uma request
response
RxReactHttp::get('https://www.google.com/');
$observableRequest = RxReactHttp::get('https://
www.google.com/');
$observableRequest->subscribe(
function ($data) {
echo $data, PHP_EOL;
}
);
Observable a partir de uma request
Observable a partir de uma request
RxReactHttp::get('https://www.google.com/');
Múltiplas requests
Será que é possível…
Criar um stream de observables?
Consolida “emissões” em "galhos"…
… em uma única stream
Múltiplas requests
$requests = RxObservable::fromArray
(['https://api.xxx','https://api.xx2']);
$responseStream = $requestStream
->flatMap(function ($requestUrl) {
return RxReactHttp::get($requestUrl);
});
$responseStream->subscribe(
//reage de acordo
);
• http://reactivex.io

• https://github.com/RxPHP

• https://medium.com/netflix-techblog/reactive-programming-in-
the-netflix-api-with-rxjava-7811c3a1496a

Mais sobre Rx e Funcional
Obrigada!
#darkmiraTour
@jchahoud

Programação Reativa e Funcional e extensões para PHP