Principalmente para o início de um novo conjunto para o curso “Architecture and Design Patterns” continuo minha série de publicações sobre padrões GRASP.
Introdução
Descritos no livro de Craig Larman "Aplicando UML e padrões, 3ª edição", os padrões GRASP são generalizações de padrões GoF, bem como uma consequência direta dos princípios de OOP. Eles complementam o degrau ausente na escada lógica que permite derivar padrões GoF a partir de princípios OOP. Os padrões GRASP não são padrões de projeto (como os do GoF), mas os princípios fundamentais de alocação de responsabilidade entre classes. Como mostra a prática, eles não são muito populares, mas a análise das classes projetadas usando o conjunto completo de padrões GRASP é um pré-requisito para escrever um bom código.
A lista completa de modelos GRASP consiste em 9 elementos:
- Especialista em Informação
- O Criador
- Controlador
- Baixo acoplamento
- Alta coesão
- Polimorfismo
Da última vez, discutimos o padrão do controlador . Hoje, proponho considerar os padrões restantes da lista.
Polimorfismo
Comportamentos diferentes devem ser tratados com base no tipo, permitindo a substituição de peças do sistema.
Propõe-se distribuir responsabilidades entre classes por meio de operações polimórficas, deixando cada sistema externo com sua própria interface. Como exemplo, podemos citar bibliotecas padronizadas, ou configuração de aplicativos conectando certos plugins para diferentes clientes de acordo com suas necessidades.
A presença de uma construção de switch no código é uma violação deste princípio, os switches estão sujeitos a refatoração.
O uso excessivo do polimorfismo leva à complicação excessiva do código e geralmente é desencorajado.
Fabricação pura
O baixo acoplamento e a alta coesão devem ser garantidos. Para tanto, pode ser necessário sintetizar uma essência artificial. O padrão Pure Fabrication sugere que você não deve hesitar em fazer isso. Como exemplo, considere a fachada para o banco de dados. Este é um objeto puramente artificial que não tem análogos na área de assunto. Em geral, qualquer fachada é Fabricação Pura (a menos que seja, é claro, uma fachada arquitetônica no aplicativo correspondente).
Indireção
É necessário distribuir responsabilidades entre os objetos, evitando vinculação direta. Para fazer isso, você pode atribuir responsabilidades pela comunicação entre componentes ou serviços a um objeto intermediário.
Traduzido para o russo, o padrão implica o seguinte: qualquer objeto no código deve ser chamado por meio de sua interface (o mesmo objeto intermediário).
A indireção é o padrão mais importante listado neste artigo. Primeiro, é muito simples em termos de segurança. Em segundo lugar, dá ao código uma tremenda flexibilidade sem ser otimizações prematuras devido ao primeiro ponto. Se todas as classes se chamam por meio de interfaces, isso leva à capacidade de "extrair" qualquer parte do sistema e reutilizá-la em outro lugar. Além disso, o uso de Indirecionamento permite adicionar quase qualquer modelo de uma gangue de quatro sem muito esforço ou classes de refatoração.
Variações Protegidas
É necessário projetar o sistema de forma que as mudanças em alguns de seus elementos não afetem outros. Como solução, propõe-se identificar pontos de possíveis mudanças ou instabilidades e atribuir responsabilidades de forma a garantir o funcionamento estável do sistema.
Na verdade, isso não é um padrão, mas uma meta alcançada ao seguir o restante dos padrões.
Resultado
Os modelos GRASP consistem em 8 padrões:
- Especialista em informações - processamos informações onde elas estão contidas.
- Criador - criamos objetos onde eles são necessários.
- Controlador - movemos a lógica multithreading para uma classe ou componente separado.
- Baixo Acoplamento 5) Alta Coesão - projetamos classes com lógica de negócios homogênea e um número mínimo de conexões entre si.
- Polimorfismo - organizamos várias opções para o comportamento do sistema na forma de chamadas polimórficas, se necessário.
- Pure Fabrication — , , Low Coupling High Cohesion.
- Indirection — .
- Protected Variations — , .
: