UnBArqDsw2023-1/2023.1_G5_ProjetoRiHappy

[PADRÃO DE PROJETO] Comunicação do Backend com camada de Persistência

Closed this issue · 15 comments

Contexto

Comunicação do backend com a camada de dados (englobando as classes models, a criação da comunicação com o backend e os serviços de persistência: criação, deleção etc)

Tarefas

  • Revisitar o Diagrama de Classes:
    • Ajustes do feedback pós-entrega
    • Inclusão das classes de comunicação com o Banco de Dados
  • Revisitar o Diagrama de Pacotes
    • Ajustes do feedback pós-entrega
    • Inclusão dos pacotes usados na modelagem
  • Definir um padrão GoF: proxy
  • Definir um padrão GRASP, a partir do GoF
  • Esboço individual da modelagem
  • Parear para modelar o problema

Para o momento inicial, eu e o @nszchagas decidimos por fazer algumas correções no diagrama de classes (sinalizamos em vermelho em primeiro momento) para que possamos futuramente melhor trabalhar com os modelos. Segue o link para o diagrama
https://lucid.app/lucidchart/4dd6a296-dbea-46b7-8bb7-b515fbc1fb05/edit?viewport_loc=347%2C-428%2C1480%2C621%2CHWEp-vi-RSFO&invitationId=inv_32177c76-50f9-40b1-95df-7711173e673f

deixei uma branch com o nome de "ComunicaçãoBackendPersistência" para trabalharmos no pages caso quisermos já documentar lá dentro

Dos padrões que eu estudei (Decorator e Proxy), o que mais faz sentido para o nosso contexto é o Proxy, caso nosso sistema tenha a necessidade de manter algo meio que em cache, como o login, informações do banco de dados, etc.

Acredito que não utilizaremos o decorator mesmo, vista que não vejo alterarmos vários objetos dinâmicamente em nosso escopo (talvez para o pessoal do Front)

Dos padrões GRASP que estudei, acredito que usar o Baixo Acoplamento (Low Coupling) e a Alta Coesão (High Cohesion) podem ser aplicados como base nas modificações do diagrama de classes, já que eles colocam pontos importantes nas mudanças

Boa noite pessoal! Estou dando mais uma mexida no diagrama de classes, dei uma revisada na classe Avaliacao e ficou dessa forma:

image

Já comecei a esbarrar nos problemas resolvidos pelo GRASP, criei essa classe mídia, a ser especializada em vídeo, foto (e talvez áudios?), e aí me surgiu a dúvida: quem cria a mídia? Na hora que criarmos a avaliação, a mídia já será criada?

E temos outro problema, o usuário pode ou não estar logado pra fazer a avaliação, então eu pensei em criarmos uma classe Autor pra avaliação, com a seguinte estrutura:

image

Mas algo me soa errado nessa implementação, vocês tem alguma sugestão?

Acredito que o autor e usuário talvez possam ter uma classe pai, em que eles herdam atributos em comum, não vejo como uma agregação, porque o autor não depende de um usuário cadastrado

Dei mais uma mexida nas classes, pra ir adequando pro diagrama de pacotes e o modelo MVC que estamos utilizando:

Controller

A camada controller possui uma BaseService pra padronizar as comunicações dos serviços com o Banco de Dados, ela é herdada pelas três classes de serviço que precisamos para gerenciar as avaliações, produtoService, avaliacaoService e compraService. Todas as services tem as operações do CRUD, abstratas na classe Pai e sobrescritas nas classes filhas.

image

Model

Tem uma BaseEntidate (usada na BaseService), que é estendida pelas models Produto, Avaliacao e Compra. Ainda não consegui visualizar o que as models tem em comum, mas provavelmente terão em comum o id, para quando a gente utilizar o "deletar(id)" poder pegar o id da BaseEntidade.

image

Além disso, há também as classes de mídias, que havia citado antes:
image

Autenticação

Para resolver nossos problemas com autorização, quem pode autorizar avaliação, quem pode criar, e onde a gente pode definir uma classe pai para usuário e autor, igual a @luiza-esteves sugeriu, agrupei essas classes mais relacionadas nesse pacote autenticação
image

Tirei todos os relacionamentos porque acho válido repensá-los com essas últimas mudanças, acabou que ficou um pouco confuso, igual a agregação que estava ali no usuário.

Criei duas branches pra gente dividir o trabalho e minimizar os conflitos: back-gof e back-grasp

Padrões de Projeto GRASP

Realizei uma análise inicial dos Padrões de Projeto GRASP e como eles podem se encaixar no escopo de nosso projeto

image

Considerações iniciais dos membros

image

Considerações adicionais

image

Obs.: Dentro do contexto citado pelo Nicolas anteriormente nessa Issue, talvez realmente a utilização do padrão GRASP Especialista faça sentido mesmo.

Boa tarde pessoal, depois de uns diálogos com o Luquinhas pensei em uma modelagem em baixa fidelidade das classes do proxy em relação ao usuário:

image

Casa bem com a modelagem que temos no pacote de segurança, a implementação do proxy é por meio de uma interface realizada por duas classes, uma proxy e uma "real", e no proxy há um controle de acesso. Pensei em fazer esse controle de acesso com um enum, e a depender do valor do enum retornarmos só os dados de usuário necessários para a ação. Aí lá no construtor do AvaliacaoService pegaremos os dados do usuário utilizando a interface do usuário.

O que acham? Estando ok passo essa modelagem para a versão digital para incluirmos na documentação.

@nszchagas Acho que está OK, so falta adicionar o TipoAcesso tipoAcesso ali no usuário da direita, que pode ser renomeada para UsuarioImplementado para nao confundir com a interface Usuário

@nszchagas Acho que está OK, so falta adicionar o TipoAcesso tipoAcesso ali no usuário da direita, que pode ser renomeada para UsuarioImplementado para nao confundir com a interface Usuário

Com isso, o método checarAcesso ja vai estar "implementado" quando instanciar o UsuarioProxy

Tamos com uma base um pouco mais consolidada relacionada a implementação dos GOFs, vamos ter que fazer uma força tarefa maior relacionada ao Grasp agora.

Bom dia pessoal!

Aqui está a modelagem do proxy, caso queiram alterar algo me avisem para eu gerar a imagem novamente para a documentação. Já inseri no documento também, e estou escrevendo a parte de modelagem e participantes.

image

https://lucid.app/lucidchart/80524b3d-d277-42d2-b140-8f208e9fc0b1/edit?viewport_loc=-747%2C-303%2C3183%2C1479%2C0_0&invitationId=inv_30f96e43-5e8a-4152-9ebd-a8f120368754