Ir para o conteúdo

Estudo Dirigido - GRAPS

General Responsibilty Assignment Software Patterns (ou principles), também conhecido como GRASPS, são padrões que procuram fornecer diretrizes para construção de aplicações bem estruturadas e que possam ser facilmente adaptáveis diante da necessidade de mudanças. Esses padrões buscam atribuir responsabilidade a classes e objetos em projetos que seguem a POO, tendo como consequência direta das recomendações propostas por estes patterns: um código melhor organizado, de fácil manutenção e ainda, capaz de ser compreendido por diferentes desenvolvedores sem grandes dificuldades.

Glossário

Palavra/Conceito Descrição
Pattern É um conjunto de recomendações voltadas à resolução de uma necessidade específica e, por vezes, recorrente na área de desenvolvimento.
POO Programação Orientada à Objetos - Seu objetivo é realizar uma maior abstração de estruturas do mundo real ao manuseio de programas e códigos.
RDD Metáfora que leva ao raciocínio de projetos de software orientados a objetos sob o ponto de vista do conceito de responsabilidade.
GUI "Graphical User Interface" ou Interface Gráfica do Usuário, consiste em um modelo de interface que permite a interação com dispositivos digitais através de elementos gráficos.
MVC Padrão arquitetural dividida em 3 componentes estruturais: Model, View, Controller, responsável por contribuir na otimização da velocidade entre as requisições feitas pelo comando dos usuários.

Sumário

1. Padrões GRASP e o conceito de responsabilidade

2. GRASPS estudados

1. Padrões GRASP e o conceito de responsabilidade

Se tratando de padrões GRAPS o conceito de responsabilidade deve ser voltado às obrigações que um objeto tem dentro de um contexto específico e suas interações com os demais objetos.

Quando utilizamos uma implementação de soluções focada na POO abordando o conceito de responsabilidade, papel e colaboração estamos fazendo uso RDD (Responsibility Driven Design). Proposta por Rebecca Wirfs-Brock e Brian Wilkerson, ela cita:

Pense em objetos como pessoas com responsabilidades que colaboram com outras pessoas para fazer coisas. RDD enxerga projeto OO como uma comunidade de objetos colaborativos e responsáveis.

Basicamente RDD nos diz que há dois tipos de responsábilidade: - Saber. - Fazer.

Responsabilidades do tipo Fazer de um objeto inclui: - Fazer algo por si próprio, tal como criar um objeto ou fazer um cálculo. - Iniciando ação em outros objetos. - Controlar e coordenar, atividades em outros objetos. Responsabilidades do tipo Saber de um objeto inclui: - Conhecimento sobre encapsulamento de dados privados. - Conhecimento sobre objetos relacionados. - Conhecimento sobre coisas que podem ser derivadas e calculadas.

2. GRASPS estudados

2.1 Criador ou Creator

Esse modelo é estudado após o questionamento sobre quais classes possuem a atribuição de criar instâncias de outros elementos. Seu objetivo é definir o objeto que que precise ser conectado ao objeto criado em algum evento.

Atribua à classe B a responsabilidade de criar uma nova instância da classe A se um ou mais dos itens seguintes for verdade:

  • B agrega objetos de A.
  • B "contém" objetos de A.
  • B registra intâncias de Objetos de A.
  • B usa objetos de A de maneira próxima.
  • B tem os dados de inicialização que serão passados para A quando ele for criado (Assim, B é um especialista com relação à criação de A).

Se mais de uma opção for aplicada, prefira uma classe B que agrega ou contém a classe A.

Com isso, o código está menos acomplado se a relação for de agregação, e se for de composição, a parte só existe se o todo existir.

Benefícios

  • Favorece o acomplamento fraco

Rastreamento com o projeto

  • É possível adaptar a forma de organização do nosso projeto a esse padrão?
    • Sim
  • Quais documentos necessitam de refatoração para a implementação desse padrão?
    • Diagrama de classes.

2.2 Especialista

O padrão especialista tem como preocupação a distribuição coesa de responsabilidades entre as classes, o que tende a fazer um projeto ser mais fácil de entender, manter e estender, além de aumentar as oportunidades de reutilização.

Com isso é recomendavel a implementação de métodos em classes que detenham as informações necessárias para a execução dos mesmos.

Benefícios

  • Encapsulamento da informação
  • Baixo acoplamento
  • Alta coesão

Rastreamento com o projeto

  • É possível adaptar a forma de organização do nosso projeto a esse padrão?
    • Sim, os conceitos do padrão especialista já foram pensados no escopo do nosso projeto.
  • Quais documentos necessitam de refatoração para a implementação desse padrão?
    • Diagrama de Classes

2.3 Alta Coesão

A alta coesão ou High Cohesion é um padrão que se refere a criação de classes com assuntos bem específicos e definidos. Um elemento com responsabilidades amplamente relacionadas e que não realiza uma tremenda quantidade de trabalho tem alta coesão. Esses elementos incluem classes, subsistemas e afins. Uma classe com baixa coesão trata de diversos assuntos o que dificulta muito a sua manutenibilidade. Tais classes devem ser evitadas e geram problemas como: - Difícil compeensão.

  • Difícil de se reutilizar.

  • Instáveis e constantemente afetados por mudanças. Vale lembrar que a Alta Coesão também suporta Baixo Acoplamento.

Benefícios

  • Fácil compreensão do design.
  • Manutenção e melhorias se tornam mais simples.
  • Apoio ao baixo acoplamento.
  • Facilita o reuso pois uma classe coesiva pode ser usada por um propósito específico.

Rastreamento com o projeto

  • É possível adaptar a forma de organização do nosso projeto a esse padrão?
    • Sim. Conforme estamos desenvolvendo o projeto estamos buscando a criação de classes coesas.
  • Quais documentos necessitam de refatoração para a implementação desse padrão?
    • Conforme ocorre o desenvolvimento do projeto e caso surjam novas classes, acredita-se que haverá necessidade de alterações nos documentos de classe, comunicação e sequência.

2.4 Baixo Acoplamento

Acoplamento é a medida de quão um elemento esta conectado com outro, isto é, um elemento com baixo acoplamento é um elemento que não depende de muitos outros elementos. Essa medida de "muitos outros" é dependente do contexto a ser analizado.

Um extremo caso de baixo acoplamento acontece quando não há acoplamento entre as classes. Porém um baixo acoplamento nesse nivél não é desejável, porque representa um projeto incoerente, inchado e com objetos complexos que fazem todo o trabalho. Então um moderado grau de acoplamento é normal e necessário para um sistema que tenha uma boa colaboração entre seus objetos.

Benefícios

  • Mudanças em uma classe não causam mudanças em diversas outras;
  • Fácil entendimento de uma classe isolada;
  • Fácil reuso, pois não será necessária a presença das dependências.

Rastreamento com o projeto

  • É possível adaptar a forma de organização do nosso projeto a esse padrão?
    • Sim, já foi aplicado os conceitos de baixo acoplamento no nosso projeto.
  • Quais documentos necessitam de refatoração para a implementação desse padrão?
    • Nenhum

2.5 Controladora ou Controller

Este padrão define a quem cabe a responsabilidade de tratamento de um evento em um sistema. Uma controladora é um objeto que não é de interface GUI. Se costuma ser atribuida a uma classe que:

  • Represente todo o sistema, um dispositivo ou subsistema como um todo. (Controlador fachada).
  • Represente um cenário de um caso de uso dentro do qual ocorra um evento. Classe geralmente denomidada por "\Handler" ou "\Controller".

Corolário: Note que classes "window", "applet", "widget", "view" e "document" não devem cumprir tarefas associadas a eventos do sistema, elas tipicamente recebem esses eventos que são em seguida delegados a uma controladora.

Benefícios

  • Ajuda a verificar a sequência de operações do sistema através dos estados do controlador.
  • Amplia a possibilidade de reutilizar classes.
  • Aumenta a possibilidade de interfaces "plugáveis".

Rastreamento com o projeto

  • É possível adaptar a forma de organização do nosso projeto a esse padrão?
    • Sim, com o modelo MVC, haverá a presença de classes controladoras para diversos eventos do sistema.
  • Quais documentos necessitam de refatoração para a implementação desse padrão?
    • Possivelmente alterações no diagrama de sequência, e de componentes para adequar corretamente a esse padrão.

2.6 Polimorfismo

Sobrescrita de métodos de classes abstratas; Este padrão define quem é o responsável quando o comportamento varia de acordo com o tipo (classe). Com isso, é atribuída a responsabilidade pelo comportamento - usando operações polimórficas - para as classes cujo comportamento varia. Isso resulta em seções de código menos acopladas e mais coesas.

Corolário: Não teste o tipo de um objeto, e nem use a lógica condicional (if ou switch) para excutar várias alternativas com base no tipo.

Benefícios

  • Acoplamento de código
  • Fácil manutenção
  • Reuso de código

Rastreamento com o projeto

  • É possível adaptar a forma de organização do nosso projeto a esse padrão?
    • Sim, já temos métodos que usam esse padrão de relacionamento entre objetos.
  • Quais documentos necessitam de refatoração para a implementação desse padrão?
    • Diagrama de classes

2.7 Invenção Pura ou Fabricação Pura

Uma classe com métodos que, apesar do GRASP Especialista recomendar a sua implementação na propria classe, podem vir a ter baixa coesão por possuir métodos que tratam questões técnicas não pertencentes do domínio do objeto no mundo real. Com isso há a criação de uma classe artificial ou conveniente, que não representa um conceito de domínio do problema, mas para melhor distribuir esses métodos. Se usada demasiadamente, a Fabricação Pura pode levar a vários objetos que dependem de informações de outros objetos para o seu funcinameto, afetando assim o acoplamento.

Benefícios

  • Alta coesão;
  • Baixo acoplamento;
  • Reuso de metódos.

Rastreamento com o projeto

  • É possível adaptar a forma de organização do nosso projeto a esse padrão?
    • Sim. Algumas das classes que criamos demonstram potencial para classes do tipo Invenção Pura, como a de Eventos.
  • Quais documentos necessitam de refatoração para a implementação desse padrão?
    • Diagrama de classes

2.8 Indireção

Este padrão irá atribuir a responsabilidade a um objeto intermediário para fazer a comunicação entre outros componentes ou serviços que não sejam diretamente acoplados. O intermediário cria uma indireção entre os outros componentes, com isso, os componentes que estão entre o intermediário não dependem mais um do outro, mas sim da indireção.

"A maior parte dos problemas em Ciência da Computação pode ser resolvida por um nível adicional de indireção." Larman, p 427.

Benefícios

  • Uma classe fracamente acoplada não é afetada (ou pouco afetada por mudanças em outras classes).
  • Fácil entendimento
  • Reuso facilitado de código

Rastreamento com o projeto

  • É possível adaptar a forma de organização do nosso projeto a esse padrão?
    • Sim, esse padrão já está sendo utilizado em nosso projeto.
  • Quais documentos necessitam de refatoração para a implementação desse padrão?
    • Diagrama de classes e de atividades.

2.9 Variações Protegidas

Padrão responsável por auxiliar na identificação de variações previsíveis ou instabilidade, além de atribuir responsabilidade para a criação de interfaces mais estáveis. Pode-se dizer que ele é uma forma de indireção, porém focada no aspecto de proteção, garantido que por exemplo um código da parte B esteja protegida contra mudanças do código da parte A.

Sua proposta de solução também envolve:

  • Encapsulamento, interfaces, polimorfismo, indireção e uso de outros padrões;
  • Não haver comunicação entre objetos muitos distantes.

Benefícios

  • Garante a produção de interfaces mais estáveis (Que sofrem pouca ou quase nenhuma mudança caso ocorra alteração no código).
  • Fácil compreensão.
  • Reuso do código.

Rastreamento com o projeto

  • É possível adaptar a forma de organização do nosso projeto a esse padrão?
    • Sim
  • Quais documentos necessitam de refatoração para a implementação desse padrão?
    • Semelhante ao de Indireção, acreditamos que ocorrá alteração nos diagramas de classe, sequência, comunicação e diagramas referentes ao banco de dados.

Histórico de Versão

Data Versão Descrição Autor(es)
11/09/2021 0.1 Criação do documento e elaboração dos tópicos 1, 2, 2.3 e 2.4 Antonio Ruan, Vinicius Vieira, Victor Samuel
12/09/2021 0.2 Elaboração dos demais subtópicos do tópico 2 Antonio Ruan, Vinicius Vieira, Victor Samuel
15/09/2021 0.3 Revisão textual, atualização de conteúdo e correções de formatação do documento Gabriela Pivetta, Arthur Sena

Referências

GROFFE, Renato. Desenvolvimento com qualidade com GRASP. DevMedia, 2013. Disponível em Acesse aqui. Acesso em: 11 de Setembro de 2021.

HENRIQUE, João. POO: O que é programação Orientada à Objetos?. Alura. 2019. Disponível em: Acesse aqui . Acesso em: 11 de Setembro de 2021.

BASSETTO, Nelson. – Responsibility Driven Design e GRASP – General Responsibility Assignment Software Principles. Arquitetura de Software e Afins. 10 de dezembro de 2011. Disponível em Acesse aqui Acesso em: 11 de setembro de 2021.

LARMAN, Craig. Applying UML and Patterns: An Introduction to Object-Oriented Analysis and Design and the Unified Process (PDF) (2nd ed.). Prentice Hall. ISBN 0-13-092569-1. Acesso em: 11 de setembro de 2021.

SERRANO, Milene. Arquitetura e Desenho de Software: AULA - GRASP_A - COMPLEMENTAR. 66 slides. Disponível em: Acesse aqui. Acesso em: 12 de Setembto de 2021.

LIMA, Edirlei. Análise e Projeto Orientados por Objetos: Aula 03 – Padrões de Projeto GRASP. 52 slides. Disponível em: Acesse aqui. Acesso em: 12/09/2021.