Skip to content

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]:

  • B contém ou agrega A
  • B registra a existência de A
  • B usa A
  • B tem os dados necessários para a inicialização de A que serão passados ao construtor de A
  • 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.

    Figura 1: Estrutura de arquivos na camada Backend
    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.

    Figura 1: Aplicação do controller no projeto

    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&section=4. Acesso em: 15 mar. 2022.