Introdução à Programação Reativa
Published: 2023-06-09 13:30:20

Quando você entra no mundo da programação, há um universo inteiramente novo de métodos e possibilidades de utilização de diferentes linguagens, criação de novos conceitos, o que praticamente obriga o programador a estudar e aprender constantemente. Nesse sentido, é inevitável que você chegue ao ponto de discutir sobre modelos ou paradigmas da programação, não somente entre diferentes abordagens, mas também se a própria abordagem se adequa mais a um conceito ou outro. 

Temos grandes discussões, como a utilização de Programação Orientada a Objetos vs. Programação Funcional, Monolitos vs. Arquitetura de Microsserviços, e uma menor, mas que não passa despercebida pelo mundo dev, é se a programação reativa é um modelo ou paradigma da programação. De forma simplificada, um modelo é criado para resolver problemas de forma estruturada e com consistência, seguindo a definição de diferentes padrões e princípios, possibilitando assim o envolvimento de diferentes paradigmas de programação. Um paradigma, por sua vez, generaliza a forma de pensar sobre estruturas, utilizando de técnicas para solucionar problemas de maneira igualmente consistente, mas dentro de suas próprias restrições. 

Com a programação reativa, o fato de aparentar estarmos em uma extensão de paradigmas pré-existentes, mas também termos mudanças expressivas no modo de interagir e transformar dados, pode gerar conflitos até nos devs menos criteriosos, e de conflito entendemos bem, rs. 



![Meme de dois devs resolvendo conflitos de branch com um mata-leão](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1kef2fcpnauqe4hi2bua.png)




## E então o que seria de fato a programação reativa?

Podemos entender esse conceito com o uso da palavra "reativa", que nos dá a capacidade de enxergar o termo como uma programação baseada em "reação". Mas sobre o que ele reage? Eventos e fluxos de dados assíncronos (**streams**). Tudo isso faz com que a abordagem seja particularmente boa também em cenários onde programamos com informações em tempo real, ex.: serviços de streaming, sistemas de automação e controle etc.

O que é **stream**? Um dos exemplos claros é você imaginar sua própria vida. Você não pode sair do ciclo, e ele eventualmente chega a um fim, porém você pode realizar diversas ações de transformação contínua. Se alimentar para crescer, definir um estilo de vida, e utilizar das mais variadas técnicas para efetivar mudanças. Uma stream seria uma versão bem simplificada da vida, sendo uma abordagem técnica para modificar dados e eventos no universo da computação.

## <u>Manifesto Reativo</u>

Em 2014, foi publicado um manifesto que descreve particularidades de sistemas para que sejam descritos como reativos. Em sua concepção, devem seguir 4 conceitos:

### **_Responsivo_**
A resposta sistemática, seguindo o conceito geral de responsividade, deve não somente ser consistente e eficaz, mas também evitar demoras demasiadas na resposta. 

### **_Resiliente_**
Capacidade de recuperação automática de um sistema, e de adequação a falhas. É importante manter a funcionalidade da operação independente de uma quebra, e para isso, há isolamento de possíveis falhas em componentes separados, enquanto que as recuperações de erros são delegadas a outros componentes externos.

### **_Elástico_**
A ideia de elasticidade vem da maneira que o sistema se comporta perante variações de demanda/carga. O mesmo não deve ter algum tipo de contenção, permitindo que a responsividade do sistema atenda a escalabilidade dos algoritmos, garantindo um bom desempenho em tempo real.

### **_Guiado por mensagem (Message driven)_**
Significa que não há orientação baseada em threads síncronas, e sim eventos, com comunicação assíncrona entre componentes, trazendo flexibilidade e eficiência.


## <u>Principais conceitos</u>

Temos vários conceitos que permeiam o universo da programação reativa, porém dois deles são chaves que contornam a ideia de reatividade.


![Diagrama Programação Reativa (Observables e Subscribers)](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gtx1yt3r7zwuw108b9o1.png)



### **_Observables (Observáveis)_**

De forma resumida, observables são geradores de **streams** de eventos, mantendo um fluxo de dados que serão trabalhados pelos inscritos no método. Esse processo facilita a ação de operações simultâneas, visto que não há necessidade de bloqueio no aguardo de eventos.

### **_Subscribers (Assinantes)_**

Quase como os clientes do método, os assinantes irão se inscrever nas streams de dados para receber eventos, sendo notificados automaticamente pelo observable a cada emissão.

## Referências

* Doc ReactiveX (https://reactivex.io/)
* Flutterando - Programação Reativa (https://www.youtube.com/watch?v=nArCLxKBd1Q&ab_channel=Flutterando)
* Manifesto Reativo (https://www.reactivemanifesto.org/pt-BR)