GRASPS
Histórico de Versão
Data | Versão | Descrição | Autor(es) |
---|---|---|---|
20.03.2022 | 0.1 | Criação do Documento | Lucas Lima |
21.03.2022 | 0.2 | Adição da introdução | Lucas Lima |
21.03.2022 | 0.3 | Adição de Alta Coesão | Caio Martins Yuri Alves Lucas Lima |
21.03.2022 | 0.4 | Adição de Baixo Acoplamento | Henrique Amorim Lucas Lima |
21.03.2022 | 0.5 | Adição de Controlador | Jonathan Jorge Peniel Etèmana Lucas Lima |
21.03.2022 | 0.6 | Adição de Criador | Lucas Melo Nilvan Peres Lucas Lima |
21.03.2022 | 0.7 | Adição das Referências | Lucas Lima |
21.03.2022 | 1.0 | Revisão do documento | Jonathan Jorge |
21.03.2022 | 1.1 | Revisão do documento | Lucas Lima |
Introdução
GRASP, que é uma sigla para General Responsability Assignment Software Patterns e em português teria como resultado padrões de software em atribuição geral de responsabilidade. É interessante que se tenha um contexto com a abordagem em alto nível para que se entenda a utilização destes GRASP, as conhecidas RDD, que em inglês significa Responsability driven development e em português teria como resultado projeto guiado por responsabilidades.
Seguindo o pensamento já definido em Larman onde a ideia principal RDD é uma forma de pensar em projetos orientados a objetos com a características de abstração do sistema. Ainda de acordo com Larman é possível basear o RDD em duas camadas de abstração de fazer e a de conhecer. Seguindo que o GRASP é um conjunto de princípios de paradigmas da orientação orientada a objeto, focando em Alta coesão com objetos bem focados e compreensíveis servindo de suporte para baixo acoplamento e outras alternativas o de baixa coesão com elementos de responsabilidades distintas e não relacionadas.
Com isso podemos concluir que os GRASP's tem como objetivo promover uma estrutura para software que tem como paradigma a Orientação a objetos. Ele busca sempre a produção de um código robusto e de fácil adaptabilidade diante novos requisitos, tão quanto a organização entre os módulos, manutenibilidade e uma boa compreensão de todo projeto por todos os interessados.
Criador
Introdução
Creator ou Criador é um dos padrões de Projeto GRASP, que assim como os outros tentam atribuir responsabilidades, papéis e colaborações. A criação de desenho de software desse padrão foca em identificar os responsáveis ideais para criação de objetos. Essa atribuição de obrigações de criação de objetos é de extrema importância para a modelagem do domínio, pois permite que a construção do software reduza acoplamentos desnecessários, além de facilitar o encapsulamento e reutilização do software. [2]
Metodologia
Determinar isso pode não ser uma tarefa tão simples, por isso é importante analisar bem. Uma forma para determinar o responsável pela criação desses objetos é verificando da seguinte forma, supondo que temos uma classe A e B. A classe A cria a classe B se[1]:
Conclusão
Especialista
Introdução
Especialista na informação, ou apenas Expert, é um dos princípios básicos dentre os 9 GRASP’s existentes, em que visa uma abordagem genérica que atribui a responsabilidade de fazer ou conhecer algo, assim, basicamente o padrão de projeto Especialista se preocupa em atribuir responsabilidades para entidade do projeto.
Primeiramente, para esta atribuição é importante seguir um caminho objetivo onde defini-se quais são as informações necessárias para se concluir uma tarefa obrigatória do sistema. Após a identificação é preciso avaliar qual é a camada que concentra o maior conhecimento acerca da tarefa em específica. Ao fim, com os módulos mapeados e levantados, aquele que possuir o maior conhecimento da tarefa é o forte candidato para especialista.
Aplicação
A partir da definição do padrão, trazemos como exemplo analisado a API do Backend do projeto Ki-Limpinho.
Autor: Davi Matheus, 2022.
Conclusão
Na figura anterior, vemos que o projeto é feito em node.js e evidenciamos que os especialistas são separados em diretórios, onde cada um possuem arquivos característicos para as suas respectivas funções, sendo elas:
auth
, responsável pela a autenticação do projeto, controlando as rotas e os controllers.helpers
, responsável por ajudar e complementar algumas functios que o sistema percise;tests
, responsável pela implementação dos testes;user
, responsável por mapear e implementar os endpoints e os metodos dos users, como as rotas as models os controlleres e etc;
Alta Coesão
Definição
Alta coesão é um principio avaliativo que prega a divisão de responsabilidades entre as classe. Isso é, uma classe coesa é aquela que lhe foi delegada apenas as suas responsabilidades que estão fortemente relacionadas e altamente focadas. Classes com baixa coesão frequentemente são de difícil compreensão, difíceis de se reutilizar, manter ou alterar.
Utilização
Utilização da alta coesão deve estar presente durante todo o projeto para garantir que cada classe possua um única responsabilidade, dessa forma deixando-a compreensível, reutilizável e enxuta. Dessa maneira tornando as interfaces de comunicação mais claras, enquanto deixa as classes mais legíveis e amigáveis a expansões e alterações mantendo a complexidade gerenciável.
Conclusão
Com o presente documento é possível demonstrar a importância dos padrões de projeto GRASP dentro da construção da base do código, isto é, ser capaz de se identificar quais são as atribuições e responsabilidades de cada um dos componentes presentes.
Baixo Acoplamento
Definição
Para definir o princípio do Baixo Acoplamento, antes é preciso definir em termos palpáveis o que é acoplamento: Larman define o acoplamento como uma métrica para mensurar o quão fortemente conectado se encontra o estado de um código específico, isto é, o quão dependente a camada de conhecer está entre os diversos componentes do sistema [1]. A partir disso, o princípio do baixo acoplamento fornece a visão necessária para a decisão da melhor forma de implementação que satisfaça:
- a menor dependência entre as classes;
- menor impacto por mudanças em classes existentes;
- maior potencial de reutilização de código.
Utilização
Ao utilizarmos os padrões já estabelecidos por uma REST API usando express, mongoose em NodeJS(ES6), já estamos utilizando as práticas de Baixo acoplamento, visto que cada um dos arquivos tem sua própria responsabilidade e seus próprios métodos definidos. Desta forma, a própria ferramenta já proporciona um nível adequado de conexão entre os componentes do código e também de modularização e reutilização do código.
Conclusão
Após todo o conteúdo explicitado neste documento, é possível evidenciar a importância dos padrões de projeto GRASP dentro da construção da base de código do projeto, isto é, é capaz de se identificar quais são as atribuições e responsabilidades de cada um dos componentes presentes no código.
Controlador
Definição
O grasp controller ou controlador delega a responsabilidade pelo tratamento de evento do sistema à classes diferente da interface do usuário, ele delega o trabalho que precisa ser feito para outros objetos. Entre as normas que fazem parte desse padrão temos o Controller sobre qual estaremos falando.
Metodologia
O controlador é a camada responsável por receber as entradas que os usuários fazem através da interface do usuário e tratar desses eventos, geralmente é a camada intermediária entre as requisições dos atores e o backend que responde às requisições dessas requisições. Essa camada é responsável por entender as requisições dos usuários e logo em seguida redireciona essa requisição para o elemento no backend responsável por tratá-la. Em nosso código usamos muito o padrão controller e abaixo temos um exemplo de sua implementação. A metodologia que utilizaremos seria os controllers(controladores) do nosso projeto.
Utilização
Aqui temos cinco classes onde são implementados os controllers, uma para alguns dos principais objetos do sistema. O diagrama completo do projeto está disponível no diagrama do classes.
Conclusão
Este padrão, trabalha como uma camada de indireção para acontecimentos do projeto. Deixando os eventos causados pela Interface desacoplados dos objetos responsáveis por tratar a requisição, tornando o sistema mais flexível de fácil manutenção.
Referências
[1] Larman, C. 2005. Applying UML and Patterns – An Introduction to Object-Oriented Analysis and Design and Iterative Development 3rd ed. New Jersey.
[2] Desenvolvimento com qualidade com GRASP. DevMedia. Disponível em: https://www.devmedia.com.br/desenvolvimento-com-qualidade-com-grasp/28704 (Último acesso em 11/03/2022).
[3] SERRANO, Milene. Arquitetura e Desenho de Software AULA – GRASP – PARTE I. 36 slides. Disponível em: https://aprender3.unb.br/pluginfile.php/897140/mod_label/intro/Arquitetura%20e%20Desenho%20de%20Software%20-%20Aula%20GRASP%20BASE%20Parte%20I%20-%20Profa.%20Milene.pdf (Último acesso em 11/03/2022).
[4] SERRANO, Milene. Arquitetura e Desenho de Software AULA – GRASP_A - COMPLEMENTAR – PARTE I. 66 slides. Disponível em: https://aprender3.unb.br/pluginfile.php/897140/mod_label/intro/Arquitetura%20e%20Desenho%20de%20Software%20-%20Aula%20GRASP_A%20-%20Profa.%20Milene%20-%20Complementar.pdf (Último acesso em 11/03/2022).
[5] Larman, C. 2005. Applying UML and Patterns – An Introduction to Object-Oriented Analysis and Design and Iterative Development 3rd ed. New Jersey.
[6] BOAS, Leandro Vilas. Padrões GRASP - Padrões de Atribuir Responsabilidades. Disponível em: https://medium.com/@leandrovboas/padr%C3%B5es-grasp-padr%C3%B5es-de-atribuir-responsabilidades-1ae4351eb204. Acesso em 15, de Março de 2022.
[7] Universidade Federal de Uberlândia. Padrões GRASP. Disponível em: http://www.facom.ufu.br/~bacala/ESOF/05a-Padr%C3%B5es%20GRASP.pdf. Acesso em 15, de Março de 2022.
[8] Controller – Padrões GRASP . Disponível em: https://www.ramonsilva.net/post/controller-padr%C3%B5es-grasp. Acesso em 15, de Março de 2022.
[9] GRASP: Designing Objetos com Responsabilidades. [s.l: s.n.]. Disponível em: https://www.ic.unicamp.br/~ariadne/mc436/1s2017/Lar16GRASP.pdf. Acesso em: 13 mar. 2022.
[10] SERRANO, Milene. Módulo de padrões de projeto GRASPs. 07a -VídeoAula - GRASP Criador. Disponível em: https://aprender3.unb.br/course/view.php?id=11018§ion=4. Acesso em: 15 mar. 2022.