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 conteúdo voltado para “Programação orientada a eventos? Deixe nos comentários!
Newsletter sobre desenvolvimento
Quer receber os melhores conteúdos da Zup no seu e-mail toda semana? Assine aqui nossa newsletter.