Capa do livro

Página Principal | Modo Dark

Engenharia de Software Moderna

Marco Tulio Valente

Perguntas Frequentes sobre Padrões de Projeto

Neste artigo, respondemos perguntas sobre temas relacionados com padrões de projeto, isto é, sobre o Capítulo 6 do livro.

Segue a lista atual de perguntas:

  1. Qual a diferença entre um Proxy e um Decorador?
  2. Qual a diferença entre um Proxy e um Adaptador?
  3. Qual a diferença entre Strategy e Template Method?
  4. O que é uma especificação (specification)?
  5. ´Qual a diferença entre uma Fachada e um API Gateway?

1. Qual a diferença entre um Proxy e um Decorador?

A diferença principal é a seguinte:

2. Qual a diferença entre um Proxy e um Adaptador?

Suponha um objeto que tenha uma interface I.

3. Qual a diferença entre Strategy e Template Method?

Suponha uma classe X:

4. O que é uma especificação (specification)?

Uma especificação é um padrão proposto por Eric Evans e Martin Fowler no seguinte artigo. Ele é também comentado no livro sobre Domain-Driven Design do Evans.

Conceitualmente, uma especificação é um predicado lógico – isto é, uma função que retorna verdadeiro ou falso – e que encapsula uma regra de negócio importante e complexa.

Uma especificação testa se um objeto está em um certo estado. Seja, por exemplo, uma fábrica que recebe pedidos de clientes para produção de certos itens. Suponha ainda que a regra para determinar se um Pedido está atrasado, em relação ao seu prazo planejado de entrega, é complicada. Por exemplo, ela pode depender dos itens que foram pedidos, da capacidade de produção da fábrica, do tempo que leva para entregar o pedido para o cliente, etc. Veja ainda que essas condições são dinâmicas, pois o estoque da fábrica muda diariamente.

Logo, podemos criar uma classe para encapsular a verificação de pedidos atrasados:

class EspecificacaoPedidosAtrasados {
   boolean pedidoEstaAtrasado(Pedido p) {
     // regra que verifica se "p" está atrasado  
   }    
}

Ou seja, a regra para determinar se um pedido está atrasado é complexa a ponto de justificar sua especificação em uma classe a parte. E, então, Pedido referencia essa nova classe:

class Pedido {
  ...
  EspecificacaoPedidoAtrasado espec = new EspecificacaoPedidoAtrasado();
  ...
}

Resumindo, especificação é o nome que se dá para classes que apenas implementam métodos booleanos que testam se um dado objeto atende a uma regra de negócio mais complexa. Logo, uma especificação torna a classe que usa a regra de negócio (no nosso exemplo, Pedido) mais simples e mais leve, isto é, com menos dependências. Fica também mais fácil criar regras de negócio alternativas. Por exemplo, uma segunda regra pode verificar se pedidos expressos estão atrasados.

5. Qual a diferença entre uma Fachada e um API Gateway?

Na verdade, essa diferença é pequena e sutil. Para explicá-la, vamos primeiro reproduzir a definição de Fachada, que usamos no Capítulo 6:

Uma Fachada é uma classe que oferece uma interface mais simples para um sistema. O objetivo é evitar que os usuários tenham que conhecer classes internas desse sistema; em vez disso, eles precisam interagir apenas com a classe de Fachada. As classes internas ficam encapsuladas por trás dessa Fachada.

Já API Gateway é um conceito parecido, porém mais usado no contexto de arquiteturas de software, particularmente arquiteturas baseadas em microsserviços. Segue uma definição adaptada do seguinte artigo:

Um API Gateway é um ponto de entrada único de um sistema e responsável por rotear as requisições dos clientes para os microsserviços apropriados, podendo interagir com múltiplos microsserviços e também combinar os resultados de tais interações. Um API Gateway pode ser também responsável por converter protocolos e implementar lógica relacionada com autenticação, limites de taxas de requisições e balanceamento de carga.

Veja então que essas últimas funcionalidades – conversão de protocolos, autenticação, balanceamento de cargas, etc – não são comuns em Fachadas.


Voltar para a página principal.