Padrões de Projeto - GoF
Closed this issue · 11 comments
Feature
Descrição dos padrões de projeto GOF utilizados no projeto. A entrega mínima consiste na aplicação de um dos padrões GOF, dentre:
Criacional:
- Singleton @nszchagas
- Abstract Factory @pedroblome
- Builder @pedroblome
- Prototype @lucasfs1007
- Factory Method @zjosuez
Estruturais
- Decorator @lucasgcaldas
- Proxy @lucasgcaldas
- FlyWeigth @daves22
- Facade @guivilela7
- Composite @MariaAbritta
- Bridge
- Adapter @nszchagas
Comportamental
- Template Method - @zjosuez
- Visitor @lucasgabriel-2
- Command @lucasfs1007
- Strategy
- Chair of Responsibility @guivilela7
- Iterator
- Mediator @lucasgabriel-2
- Memento @lucasgabriel-2
- Interpreter @MariaAbritta
- State
- Observer @nszchagas
Tarefas
- Alocar os membros da equipe em estudos sobre um ou mais padrões.
- Separar material de estudo
- Estudar o assunto
- Definir quais padrões fazem sentido no escopo do trabalho
Vou estudar os padrões Singleton, Adapter e Observer.
Vou estudar os padrões Bridge e Strategy
Vou estudar os padrões Factory Method e Template Method
estou estudando também o padrão prototype e comand
vou estudar os padrões Decorator e Proxy do Estruturais
vou estudar os padrões Builder e Abstract factory
Estudando o padrão FlyWeigth do Estruturais
Como amo esse assunto eu fiz um resuminho pra estudar e aproveitei pra ligar com os problemas que podemos resolver no projeto.
Singleton
O padrão de projeto singleton visa garantir que uma classe só possa ter uma instância, fornecendo um acesso global à essa instância.
Problema Resolvido
O padrão de projeto singleton resolve os seguintes problemas:
- Como controlar o acesso à recursos compartilhados entre as classes, como banco de dados e conexão com a API, por exemplo?
- Como manter um acesso global à mesma instância desse objeto?
Estrutura
- O construtor deve ser privado, para evitar que outras classes instanciem objetos usando
new
- Deve existir um método estático retornando a instância da classe, se existir. Se não existir, esse próprio método a criará.
Exemplos de implementação em Java
Relação com o Projeto
Penso que poderíamos usar Singletons nos seguintes contextos:
- Comunicação com o Banco de Dados: Uma classe DBConnection responsável por estabelecer a comunicação das Controllers com o Banco de Dados.
- Comunicação via API do frontend com backend: Uma classe APIService responsável por estabelecer a comunicação entre a camada View e a Controller, via API.
- Serviço de envio de email: Uma classe EmailController responsável por estabelecer a comunicação com o serviço provedor de email, para notificar avaliações recebidas na plataforma, notificar o sistema de avaliação de notificações e assim por diante.
Adapter
Essa imagem ilustra bem o propósito do Adapter, que é prover uma comunicação entre objetos incompatíveis.
Problema Resolvido
Esse padrão pode ser utilizado quando os dados vêm de lugares diferentes, em formatos diferentes, por exemplo.
Estrutura
- A classe Adapter implementa a interface de uma das classes e têm a outra como atributo.
Relação com o Projeto
- A partir de uma análise das requisições do site da Ri Happy na página de avaliações descobri que eles usam um serviço terceirizado de avaliações, o yourviews. Nesse contexto seria interessante uma classe AvaliacaoAdapter que recebe uma resposta da requisição pra API do serviço e faz o tratamento nos dados para exibição na plataforma.
Exemplos de implementação em Java
Observer
Permite a definição de um mecanismo de "inscrição" para notificar múltiplos objetos sobre um evento que ocorre no objeto observado.
Problema Resolvido
Resolve o problema que ocorre quando as alterações em um objeto exigem alterações em outro, como uma atualização em objetos ou renderização de componentes no frontend, por exemplo. Em javascript/typescript o observer é muito usado, com o subscribe
.
Estrutura
Esse padrão é composto por um publisher, quem emite o evento, e os subscribers, que observam. Nesse exemplo o publisher é o Editor e os Listeners são EmailAlertListener e LoggingListener, por meio da interface EventListeners. A gerência da lista de inscrições é feita pela classe EventManager.
Relação com o Projeto
- Notificações por email quando uma nova avaliação for enviada
- Atualizações de página no frontend de acordo com as alterações na avaliação
Exemplos de implementação em Java
Referências
Tentei aplicar algumas dessas ideias na modelagem de classes que possuímos, mas percebi que teremos que revisitar nossa modelagem, fiz um esboço inicial, sem muita fidelidade aos rigores da UMl, para organizar as ideias:
Vou estudar Facade e Chair of Responsibility
Finalizados os estudos agora partimos para a implementação no projeto.