Programação Orientada a Eventos: entenda o que é

No items found.
4/9/2019
Lucas Gontijo
Lucas Gontijo
Back-End Developer

Entusiasta de arquitetura e design de software.

Está sem tempo para ler? Aperte o play para escutar o artigo.

Antes de entendermos a programação orientada a eventos, precisamos entender o que é um evento. De maneira resumida: em programação, um evento é a indicação de que algo aconteceu, é o resultado de uma ação.

O que é Programação orientada a eventos, afinal?

É um paradigma onde a execução do código é determinada pelo disparo de eventos. 

Na prática: 

Existem rotinas responsáveis por capturar estes eventos e executar determinados comportamentos que são respostas a estes eventos. Ou seja, a ocorrência de um evento pode provocar uma reação que pode ser uma ação (ou um conjunto delas) a ser tomada.

Uma curiosidade deste paradigma é que ele trabalha com o Princípio de Hollywood: “Não nos telefone, nós telefonaremos para você.

Para que serve?

Em aplicações do lado do servidor, já foi bastante comum implementações síncronas onde deve-se esperar o total processamento de uma rotina para termos uma resposta. Com a evolução das aplicações e arquiteturas, o assincronismo provou ser bastante proveitoso, pois o processamento de E/S é normalmente executado por meio de eventos e callbacks, portanto enquanto é aguardado o retorno de uma consulta ou algo similar, ainda poderíamos processar outras rotinas.

O objetivo é tentar trabalhar em um modelo não bloqueante.

Como funciona?

Para contextualizar melhor o conceito realizei uma abordagem baseada em Event Loop.

Para a melhor visualização de um sistema utilizando a abordagem de Event Loop, poderíamos imaginar um cenário de cadastro de clientes, onde há um alto volume de pedidos em uma infraestrutura que não tem poder computacional suficiente para atender à todos os pedidos simultaneamente.

Uma abordagem interessante para solucionar este problema, seria o enfileiramento destes eventos de cadastro para que sejam processados pouco a pouco conforme o poder computacional da infraestrutura for permitindo.

Motor de Eventos

O motor de eventos, possui uma fila para o armazenamento dos eventos que chegam e também para o consumo onde ao invocar o método start() é aberta uma thread que fica infinitamente consumindo a fila. Existe também um mapa que utilizei para registrar os tipos de eventos e um tipo genérico (EventListener) que implementa a ação a ser tomada para aquele tipo de evento.


<p> CODE: https://gist.github.com/Lucasgontijo0/683984cad57ea0f761defec5c5bde3b1.js</p>

Evento

O evento contem um tipo, que nesta implementação usamos para identificar qual implementação de listener irá processá-lo, contem também uma informação que deverá ser computada, no nosso caso payload e também duas abstrações que representam callbacks que é um pedaço de código que é passado como parâmetro e que em algum momento será executado, no nosso caso na falha ou sucesso.


<p> CODE: https://gist.github.com/Lucasgontijo0/ff0b4a46baefe6d5387a97a9fac3896a.js</p>

Callback

Recebe um argumento e deve processá-lo, nesta implementação definimos o conteúdo dos callbacks no RegisterClientListener e o seu comportamento no main, durante o momento da criação do evento.


<p> CODE: https://gist.github.com/Lucasgontijo0/8ee9eb647daf6350b49d38ba85d90858.js</p>

Event Listener

Usado para realizar o polimorfismo no algoritmo do motor, assim nós podemos processar qualquer evento, desde que esteja mapeado.


<p> CODE: https://gist.github.com/Lucasgontijo0/55149d65b9a730fec8562b195b3d044d.js</p>

Registro de Clientes Listener

Implementa a ação do evento, o que deve ser feito. Se houvessem novos eventos iriamos utilizar a interface Event Listener e implementar um comportamento para este novo evento.


<p> CODE: https://gist.github.com/Lucasgontijo0/fb93fdf38dc158824568ebfc3105151c.js</p>

Temos duas classes para representar os clientes a serem cadastrados e uma abstração de repositório onde vamos inserir os clientes que forem chegando.

Cliente

<p> CODE: https://gist.github.com/Lucasgontijo0/c18fbda2dfba44ffcdb318281d588f5e.js</p>

Repositório

<p> CODE: https://gist.github.com/Lucasgontijo0/935fbd4c9ced52e5a9fe935164aad29e.js</p>

Main

Por fim temos a classe Main, onde iniciamos o motor de evento e cadastramos um tipo de evento. Então realizamos o pedido de cadastro de 1 milhão de clientes, onde cada pedido é um evento que contem um tipo para ser identificado, um payload que é a informação a ser processada neste caso é o cliente, e então a implementação de dois callbacks que serão o que deve ser executado no caso de sucesso ou falha e que vai ser publicado na fila do motor para posteriormente ser consumido.


<p> CODE: https://gist.github.com/Lucasgontijo0/ffefada31795fcbac1eb908ccaa187ad.js</p>

É importante lembrar que por ter um motor de eventos que fica o tempo todo consumindo da fila, ao mesmo tempo em que os eventos estão sendo cadastrados, estão também sendo consumidos.

Este é um exemplo básico, mas espero que dê para ter uma ideia do funcionamento deste paradigma.

Ficou com alguma dúvida sobre o assunto? Deixe nos comentários! 😎

Newsletter sobre desenvolvimento

Quer receber os melhores conteúdos sobre desenvolvimento no seu e-mail toda semana? Assine aqui nossa newsletter.

O que você achou deste conteúdo?
Quer receber nossos conteúdos?
Seu cadastro foi efetuado com sucesso! Enviaremos as novidades no seu email.
Oops! Something went wrong while submitting the form.