Os eventos são usados apenas para programação de GUI?

57

Os eventos são usados apenas para programação de GUI?

Como você lida na programação de back-end normal quando algo acontece com essa outra coisa?

    
por user3093620 20.06.2016 / 00:40
fonte

8 respostas

106

Não. Eles são realmente úteis para implementar observadores e garantir que as classes sejam fechadas para modificação.

Digamos que tenhamos um método que registre novos usuários.

public void Register(user) {
    db.Save(user);
}

Então alguém decide que um email deve ser enviado. Nós poderíamos fazer isso:

public void Register(user) {
    db.Save(user);
    emailClient.Send(new RegistrationEmail(user));
}

Mas acabamos de modificar uma classe que deveria estar fechada para modificação. Provavelmente bom para este pseudo-código simples, mas provavelmente o caminho para a loucura no código de produção. Quanto tempo até esse método é 30 linhas de código que mal estão relacionadas com o propósito original de criar um novo usuário ??

É muito melhor deixar a classe executar sua funcionalidade principal e criar um evento informando quem está ouvindo que um usuário foi registrado e pode executar qualquer ação que precise executar (como enviar um email).

public void Register(user) {
    db.Save(user);

    RaiseUserRegisteredEvent(user);
}

Isso mantém nosso código limpo e flexível. Uma das partes frequentemente negligenciadas da OOP é que as classes enviam mensagens umas para as outras. Eventos são essas mensagens.

    
por 20.06.2016 / 02:56
fonte
53

Não.

Um exemplo clássico de eventos usados em lógica não-GUI são os acionadores de bancos de dados.

Triggers são códigos que são executados quando um determinado evento acontece (INSERT, DELETE, etc). Parece um evento para mim.

Esta é a definição da Wikipédia de evento:

In computing, an event is an action or occurrence recognized by software that may be handled by the software. Computer events can be generated or triggered by the system, by the user or in other ways. Typically, events are handled synchronously with the program flow, that is, the software may have one or more dedicated places where events are handled, frequently an event loop. A source of events includes the user, who may interact with the software by way of, for example, keystrokes on the keyboard. Another source is a hardware device such as a timer. Software can also trigger its own set of events into the event loop, e.g. to communicate the completion of a task. Software that changes its behavior in response to events is said to be event-driven, often with the goal of being interactive.

Nem todos os eventos são gerados pelo usuário. Alguns são gerados por um temporizador como um crontab de um banco de dados INSERT como eu mencionei antes.

A definição também afirma que alguns programas ou sistemas são "orientados a eventos, muitas vezes com o objetivo de serem interativos" , dos quais se pode derivar que o propósito ou a utilidade dos eventos não são unicamente, mas, muitas vezes, para fornecer interatividade (como GUIs, embora não necessariamente GUIs, pois os programas CLI também podem ser interativos).

    
por 20.06.2016 / 01:27
fonte
28

A programação baseada em eventos também é usada para programação de servidores de alto desempenho.

Em uma carga de trabalho típica do servidor, a maior parte do tempo em que o processamento de um resultado é realmente proveniente de E / S. Por exemplo, retirar dados de uma unidade de disco rígido (7200 RPM) pode levar até 8,3 ms. Para um processador moderno de GHz, isso equivaleria a ~ 1 milhão de ciclos de clock. Se uma CPU esperasse os dados a cada vez (sem fazer nada), perderíamos MUITOS ciclos de clock.

Técnicas de programação tradicional contornam isso introduzindo vários tópicos . A CPU tenta executar centenas de threads simultaneamente. No entanto, o problema desse modelo é que, cada vez que uma CPU muda de thread, são necessários centenas de ciclos de clock para o switch de contexto . Uma alternância de contexto ocorre quando a CPU copia a memória local do encadeamento para os registradores da CPU e também armazena o registro / estado do segmento antigo na RAM.

Além disso, cada thread deve usar uma certa quantidade de memória para armazenar seu estado.

Hoje, houve um push para servidores que possuem um único thread, que é executado em um loop. Em seguida, peças de trabalho são colocadas em uma bomba de mensagens , que atua como uma fila para o segmento único (muito parecido com uma interface de usuário fio). Em vez de esperar que o trabalho termine, a CPU define um evento de retorno de chamada, para coisas como o acesso à unidade de disco rígido. Que reduz a troca de contexto.

O melhor exemplo de tal servidor é o Node.js , que demonstrou ser capaz de lidar com 1 milhão de conexões simultâneas com hardware modesto, enquanto um servidor Java / Tomcat teria dificuldades em alguns milhares.

    
por 20.06.2016 / 09:18
fonte
10

Os eventos também são muito usados na programação de rede (por exemplo, Nginx) para evitar loops dispendiosos de espera ocupada e fornecem uma interface limpa para saber exatamente quando uma determinada operação está disponível (I / O, urgente dados etc). Esta é também uma solução para o problema C10k .

A idéia básica é fornecer ao SO um conjunto de soquetes (ou seja, conexões de rede) para monitorar eventos, todos eles ou apenas alguns dos quais você está particularmente interessado (dados disponíveis para leitura, por exemplo); Quando tal atividade for detectada pelo sistema operacional em um dos sockets da lista, você receberá uma notificação do evento que estava procurando pela API, que terá que resolver de onde ela vem e agir de acordo. .

Agora, essa é uma visão abstrata e de baixo nível, além disso, é difícil conseguir escalar bem. No entanto, há muitos frameworks de nível mais alto que lidam com isso de uma forma multi-plataforma: Twisted for Python, Boost.Asio para C ++ ou libevent para C vêm à minha mente.

    
por 20.06.2016 / 17:48
fonte
5

Sistemas embarcados são quase sempre inerentemente orientados a eventos, mesmo que não sejam programados explicitamente como tal.

Esses eventos vêm de coisas como interrupções de hardware, pressionamentos de botão, leituras de período analógico-digital, expirações de temporizador, etc.

Sistemas embarcados de baixa potência são ainda mais propensos a serem orientados a eventos; eles passam a maior parte do tempo dormindo (CPU dormindo em um modo de baixo consumo), esperando que algo aconteça (aquele "algo" é um evento).

Um dos frameworks mais comuns e populares para sistemas embarcados baseados em eventos é o Quantum Platform (QP) (o QP também funciona sob Linux, Windows e qualquer sistema operacional semelhante a unix.) As máquinas de estado são um ajuste natural para programação orientada a eventos, já que o programa não é "seqüencial" no sentido típico, é um conjunto de "callbacks" são chamados dependendo do estado do sistema e do evento atual.

    
por 20.06.2016 / 23:21
fonte
3

Mensagens de eventos Gregor Hohpe.

Arquiteturas orientadas a eventos Gregor Hohpe.

arquitetura SEDA , galês, Culler, cervejeiro.

how do you handle in normal backend programming when something happens do this other thing?

Máquina de estados finitos é uma abordagem comum

Given(State.A)
When(Event.B)
Then(State.C)
    .and(Consequences.D)
    
por 20.06.2016 / 02:48
fonte
0

Em sistemas embarcados, os eventos ocorrem durante as interrupções. Existem muitas fontes de interrupções, de temporizadores a E / S.

Além disso, o RTOS também pode ter eventos. Um exemplo é aguardar uma mensagem de outra tarefa.

    
por 20.06.2016 / 21:56
fonte
0

Para sistemas não incorporados, mas algo que eu estava fazendo em C # era o sistema SCADA. Houve muitos eventos ligados ao que estava acontecendo no armazém quando a carga foi descarregada parte do evento gerado pelo sistema e outra parte estava escrevendo novo estado para o banco de dados. É claro que tínhamos algum cliente de GUI, mas era apenas para mostrar o estado do banco de dados que estava refletindo o estado do warehouse. Portanto, era um software de servidor de back-end baseado em eventos e encadeamentos. Muito desafiador para desenvolver.

link

    
por 24.06.2016 / 13:30
fonte