Princípios GRASP Flashcards
Os principais princípios GRASP são:
- Criador (Creator);
- Especialista na Informação (Information Expert);
- Controlador (Controller);
- Polimorfismo (Polymorphism);
- Alta Coesão (High Cohesion);
- Baixo Acoplamento (Low Coupling);
- Variações Protegidas (Protected Variations);
- Indireção (Indirection);
- Fabricação/Invenção Pura (Pure Fabrication).
Os princípio GRASP (General Responsibility Assignement Software Patterns):
São um conjunto de padrões de design e heurísticas para atribuição de responsabilidades em classes e objetos durante o desenvolvimento de software orientado a objetos.
- Os princípios GRASP ajudam os desenvolvedores a tomar decisões de design consistentes e coerentes, visando criar um software mais robusto, flexível e fácil de manter.
Criador (Creator):
Atribui a responsabilidade de criar uma instância de uma classe a uma classe relacionada que tem conhecimento detalhado ou utiliza frequentemente a classe a ser instanciada.
- Exemplo: Uma classe “Pedido” que cria e gerencia instâncias de uma classe “ItemPedido”
Especialista na Informação (Information Expert):
Atribui responsabilidades a classes que possuem as informações necessárias para executar determinada tarefa ou tomar decisões.
- Exemplo: Uma classe “Funcionario” que possui informações sobre salário e pode calcular o salário líquido.
Controlador (Controller):
Atribui a responsabilidade de lidar com eventos do sistema e coordenar o fluxo entre objetos a uma classe que representa uma entidade do domínio ou um subsistema de alto nível.
- Exemplo: Uma classe “GerenciadorDePedidos” que coordena a criação e atualização de pedidos entre outras classes.
Polimorfismo (Polymorphism):
Atribui responsabilidades a classes abstratas ou interfaces, permitindo que diferentes implementações sejam usadas de forma intercambiável.
- Exemplo: Uma classe abstrata “Animal” com subclasses “Cachorro”, “Gato” e “Pássaro”, cada uma com sua própria implementação do método “emitirSom”.
Alta Coesão (High Cohesion):
Mantém as classes e objetos focados e com um propósito bem definido, evitando responsabilidades não relacionadas.
- Isso resulta em um código mais fácil de entender, manter e reutilizar.
- Exemplo: Separar a lógica de processamento de pagamentos em uma classe “ProcessadorDePagamentos” e a lógica de gerenciamento de produtos em uma classe “GerenciadorDeProdutos”.
Baixo Acoplamento (Low Coupling):
Reduz as dependências entre classes e objetos, tornando o código mais flexível e menos propenso a erros.
- Exemplo: Usar interfaces ou classes abstratas para definir dependências entre classes em vez de depender diretamente das implementações concretas.
Variações Protegidas (Protected Variations):
Protege as partes instáveis do código, isolando-as em classes e interfacesseparadas, de modo que as alterações em uma parte do código não afetem outras partes.
- Exemplo: Definir uma interface “RepositorioDeDados” que pode ser implementada por diferentes classes de acesso a dados, como “RepositorioDeDadosMySQL” e “RepositorioDeDadosMongoDB”.
Indireção (Indirection):
Introduz um intermediário entre classes e objetos que interagem entre si, permitindo que as interações sejam modificadas sem afetar as classes envolvidas.
- Exemplo: Usar um padrão de design como o “Mediator” para coordenar a comunicação entre várias classes, em vez de permitir que elas interajam diretamente.
Fabricação/Invenção Pura (Pure Fabrication):
Cria classes artificiais que não representam diretamente conceitos do domínio, mas são necessárias para garantir uma arquitetura limpa e bem organizada.
- Exemplo: Criar uma classe “GerenciadorDeCache” que lida com o armazenamento e recuperação de dados em cache, mesmo que o cache não seja um conceito do domínio do problema.