Pular para o conteúdo principal

Questão de Engenharia de Software — Padrões de Projeto (Engenharia de Software) — FGV 2024

Engenharia de SoftwarePadrões de Projeto (Engenharia de Software)
Código
fg165495
Banca
FGV
Órgão
TRF 1
Ano
2024
Cargo
AJ ( ª Região)

O sistema TRF1Web possui um módulo orientado a eventos, chamado TRF1Sync. No TRF1Sync, há um objeto central que implementa um loop síncrono, responsável por receber eventos de indicação. Ao receber um evento, o objeto central dispara a operação associada mediante um objeto manipulador de evento. Esse comportamento do TRF1Sync é resultado direto da aplicação do seguinte padrão da Pattern-Oriented Software Architecture:

  1. Areactor;
  2. Bproactor;
  3. Cinterceptor;
  4. Dobjeto ativo;
  5. Eobjeto monitor.
Revelar gabarito e comentário

GabaritoA — reactor;

Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.

Padrões de Projeto: Reactor, Proactor e Concorrência Orientada a Eventos

Gabarito: letra A. O comportamento descrito no TRF1Sync — um objeto central com loop síncrono que recebe eventos e dispara a operação associada mediante um manipulador de evento — é a essência do padrão Reactor, da Pattern-Oriented Software Architecture (POSA). O Reactor é o padrão que centraliza o despacho de eventos em um único loop, registrando manipuladores (handlers) para cada tipo de evento, exatamente como o enunciado descreve.

O padrão Reactor é um dos padrões de concorrência mais importantes em sistemas orientados a eventos. Ele resolve um problema fundamental: como lidar com múltiplas fontes de eventos (como conexões de rede, entrada do usuário ou mensagens) de forma eficiente, sem bloquear o sistema ou criar uma thread para cada evento. A solução do Reactor é ter um único componente central — o demultiplexador de eventos — que fica em um loop contínuo, aguardando eventos. Quando um evento chega, esse componente identifica o tipo de evento e o despacha para o manipulador (handler) apropriado, que foi previamente registrado. O manipulador então executa a operação associada.

A grande vantagem do Reactor é que ele permite que um único thread (ou um pequeno número de threads) gerencie muitos eventos, pois o loop central não executa as operações em si — apenas as despacha. Isso é diferente de criar uma thread por evento, que seria caro e ineficiente. O padrão é síncrono no sentido de que o loop central espera (bloqueia) por eventos, mas o processamento é não-bloqueante para o sistema como um todo, pois as operações são delegadas aos manipuladores.

Para entender por que as outras alternativas estão incorretas, é crucial distinguir o Reactor de padrões semelhantes. O Proactor também lida com eventos, mas de forma assíncrona: ele inicia operações de longa duração e é notificado quando elas terminam, em vez de esperar por eventos de entrada. O Interceptor é um padrão que permite modificar ou estender o comportamento de um framework em tempo de execução, sem alterar seu código. O Objeto Ativo separa a execução de um método da sua invocação, usando uma thread própria e uma fila de requisições. O Objeto Monitor é um padrão de sincronização que garante que apenas uma thread por vez execute um método crítico, usando locks e variáveis de condição.

A pegadinha desta questão está em confundir o Reactor com o Proactor, pois ambos lidam com eventos e manipuladores. A diferença crucial é o sincronismo: o Reactor é síncrono (o loop espera o evento e o despacha), enquanto o Proactor é assíncrono (as operações são iniciadas e o resultado é tratado quando chega). O enunciado é explícito ao dizer "loop síncrono", o que elimina o Proactor e aponta diretamente para o Reactor. Guarde essa distinção: Reactor = síncrono, espera o evento; Proactor = assíncrono, inicia e é notificado.

1Reactor
Loop síncrono
Espera o evento
Despacha ao handler
2Proactor
Assíncrono
Inicia operação
Notificado ao concluir
3Objeto Ativo
Thread própria
Fila de requisições
4Objeto Monitor
Exclusão mútua
Locks e variáveis de condição
5Interceptor
Modifica framework
Em tempo de execução
Padrões de concorrência (POSA)
LEVELsoulevel.com.br
Padrões de concorrência (POSA): Reactor (Loop síncrono, Espera o evento, Despacha ao handler); Proactor (Assíncrono, Inicia operação, Notificado ao concluir); Objeto Ativo (Thread própria, Fila de requisições); Objeto Monitor (Exclusão mútua, Locks e variáveis de condição); Interceptor (Modifica framework, Em tempo de execução)

Alternativa A — ✅ Correta ⟵ GABARITO

O padrão Reactor é exatamente o que o enunciado descreve. Ele possui um objeto central (o demultiplexador) que executa um loop síncrono, aguardando eventos. Ao receber um evento, ele identifica o manipulador (handler) associado e dispara a operação correspondente. O termo "loop síncrono" é a pista-chave: o Reactor é o padrão que usa um loop de eventos síncrono para despachar eventos para os manipuladores registrados. É a aplicação direta do padrão da POSA.

Alternativa B — ❌ Incorreta

O Proactor também lida com eventos e manipuladores, mas de forma assíncrona. Ele inicia operações de longa duração (como leituras/escritas de rede) e é notificado quando elas são concluídas, em vez de esperar por eventos de entrada. O enunciado fala em "loop síncrono", o que contradiz a natureza assíncrona do Proactor. A banca troca o padrão síncrono pelo assíncrono para confundir o candidato.

Alternativa C — ❌ Incorreta

O Interceptor é um padrão que permite modificar ou estender o comportamento de um framework em tempo de execução, interceptando chamadas e adicionando funcionalidades. Ele não é um padrão de concorrência nem envolve um loop de eventos. O enunciado descreve um mecanismo de despacho de eventos, não de interceptação de chamadas.

Alternativa D — ❌ Incorreta

O Objeto Ativo é um padrão de concorrência que separa a invocação de um método da sua execução. Ele usa uma thread própria e uma fila de requisições, permitindo que o chamador continue sem bloquear. No enunciado, o objeto central executa um loop síncrono e despacha eventos, mas não há menção a uma fila de requisições nem a uma thread separada para execução. O Objeto Ativo é assíncrono por natureza, enquanto o Reactor é síncrono.

Alternativa E — ❌ Incorreta

O Objeto Monitor é um padrão de sincronização que garante exclusão mútua em métodos críticos, usando locks e variáveis de condição. Ele não é um padrão de despacho de eventos. O enunciado descreve um sistema orientado a eventos com um loop central, não um mecanismo de sincronização entre threads.

Gabarito: letra A — o padrão Reactor, com seu loop síncrono e despacho de eventos para manipuladores, é a resposta correta.

Link permanente: /questoes/fg165495