# 📘 Guia dos Princípios GRASP (General
Responsibility Assignment Software Patterns)
🎯 Objetivo
Os princípios GRASP (General Responsibility Assignment Software Patterns) ajudam na
designação de responsabilidades dentro da Programação Orientada a Objetos (POO). Este
documento descreve cada princípio e sua importância para um design de software flexível,
reutilizável e de fácil manutenção.
🔄 Os 9 Princípios do GRASP
1⃣ Creator (Criador)
Definição: Determina quem é responsável por criar um objeto. Uma classe deve criar um objeto se
ela conter, usar ou controlar seus dados.
✅ Boas práticas:
- A classe que agrega outra deve ser responsável por criá-la.
- A criação deve ser delegada a uma classe que já interage com o objeto criado.
📌 Exemplo:
Neste caso, a classe Pedido cria e gerencia a lista de itens.
2⃣ Controller (Controlador)
📌 Definição: Uma classe deve controlar o fluxo de dados entre a interface e a lógica de negócios.
✅ Boas práticas:
- Criar um controlador para gerenciar interações do utilizador.
- Separar a lógica de negócios da interface gráfica.
📌 Exemplo:
A classe PedidoController gerencia as ações do utilizador no sistema.
3⃣ Information Expert (Especialista em Informação)
📌 Definição: Atribuir responsabilidades à classe que possui os dados necessários para realizá-las.
✅ Boas práticas:
- A classe deve manipular apenas os dados que ela possui.
- Evitar que outras classes acessem informações que não pertencem a elas.
📌 Exemplo:
O cálculo do total do pedido fica dentro da classe `Pedido`, pois ela contém os itens necessários
para a operação.
4⃣ Low Coupling (Baixo Acoplamento)
📌 Definição: Minimiza a dependência entre classes para que alterações em uma não impactem
diretamente as outras.
✅ Boas práticas:
- Reduzir o número de dependências diretas entre classes.
- Criar interfaces para reduzir acoplamento.
📌 Exemplo:
A classe Cliente não depende diretamente de outras classes, tornando o código mais modular.
5⃣ High Cohesion (Alta Coesão)
📌 Definição: Garante que uma classe tenha um único propósito bem definido.
✅ Boas práticas:
- Separar responsabilidades em classes menores e especializadas.
- Evitar classes que fazem muitas coisas ao mesmo tempo.
📌 Exemplo:
A classe RelatorioVendas se concentra apenas na geração de relatórios.
6⃣ Polymorphism (Polimorfismo)
📌 Definição: Permite que diferentes classes implementem métodos de forma única, sem precisar
de verificações explícitas.
✅ Boas práticas:
- Usar herança e interfaces para evitar `if`/`switch` desnecessários.
📌 Exemplo:
7⃣ Pure Fabrication (Fabricação Pura)
📌 Definição: Criação de classes auxiliares que não pertencem ao domínio, mas ajudam a organizar
o código.
✅ Boas práticas:
- Criar classes de serviço para centralizar funcionalidades auxiliares.
📌 Exemplo:
A classe LogSistema centraliza a lógica de logging do sistema.
8⃣ Indirection (Indireção)
📌 Definição: Adiciona camadas intermediárias para reduzir dependências diretas entre classes.
✅ Boas práticas:
- Criar classes intermediárias para comunicação entre sistemas.
📌 Exemplo:
A classe ServicoPagamento atua como intermediária entre diferentes métodos de pagamento.
9⃣ Protected Variations (Variações Protegidas)
📌 Definição: Define pontos de extensão no sistema para evitar que mudanças futuras causem
grandes impactos.
✅ Boas práticas:
- Criar interfaces e classes abstratas para facilitar mudanças.
📌 Exemplo:
A classe `BancoDados` define um contrato que diferentes implementações podem seguir.
📜 Conclusão
Os princípios GRASP são fundamentais para criar software com boas práticas de design,
reduzindo o acoplamento e aumentando a coesão. Eles ajudam a garantir um código modular,
reutilizável e de fácil manutenção. 🚀