# Strategy
# Histórico de Versão
Data | Autor(es) | Descrição | Versão |
---|---|---|---|
13/10/2020 | Caio César Beleza(Caiocbeleza) | Adicionando introdução do padrão strategy | 0.1 |
13/10/2020 | Caio César Beleza(Caiocbeleza) | Adicionando estrutura do padrão strategy | 0.2 |
13/10/2020 | Caio César Beleza(Caiocbeleza) | Adicionando trecho de código do projeto com padrão strategy | 0.3 |
20/10/2020 | Caio César Beleza(Caiocbeleza) | Adicionando explicação da aplicação do padrão strategy no projeto e as facilidades que esse padrão oferece. | 0.4 |
26/10/2020 | Caio César Beleza(Caiocbeleza) | Adicionando modelagem strategy. | 0.5 |
# Introdução
O Strategy é um padrão comportamental que permite definir uma família de algorítmos, colocá-los em classes separadas e fazer com que seus objetos sejam permutáveis.
Este padrão sugere que você pegue uma classe que faz algo específico em diversas maneiras diferentes e extraia todos esses algoritmos para classes separadas chamadas strategy.
# Estrutura
- "Context" mantém uma referência para uma "ConcreteStrategy" e se comunica com esse objeto através da interface "Strategy".
- A interface "Strategy" é comum à todas "ConcreteStrategy". Ela declara um método uqe o "Context" usa para executar uma "Strategy"
- As "ConcreteStrategy" implementam diferentes variações de um algoritmo que o "Context" usa.
- O "Context" chama o método de execução no objeto "Strategy" ligado cada vez que ele precisa rodar um algorítmo. O "Context" não sabe qual tipo de "Strategy" ele está trabalhando ou como o algoritmo é executado.
- O "Client" cria um objeto "Strategy" específico e passa ele para "Context". O "Context" expõe um setter que permite o "Client" mudar o "Strategy" associada com o "Context" durante a execução.
# Aplicações no Projeto(QRodízio)
# Disclaimer
Primeiramente é bom deixar claro que nosso projeto está utilizando de linguagens multi-paradigmas(python e javascript) sendo assim, adaptações aos padrões são necessárias para não fugir do estilo do código utilizado.
A Linguem python possui em seu "zen of python" a seguinte declaração: "Simple is better than complex". Seguindo essa filosifia, decidimos que, se algo pode ser feito em uma função, então será feito em uma função. Assim mantendo um código mais limpo, simples e fácil de manter.
# Trecho do código
def permission_strategy_factory(role):
"""Given a role, returns a permission strategy for that role"""
if role == EmployeeRole.basic:
return basic_permission_strategy
elif role == EmployeeRole.manager:
return manager_permission_strategy
else:
return no_permission_strategy
def no_permission_strategy(*args, **kwargs):
"""No permission at all"""
return False
def manager_permission_strategy(employee):
"""Manager permission user must be a manager"""
if employee.role == EmployeeRole.manager:
return True
return False
def basic_permission_strategy(employee):
"""Baasic permission user just need to be logged"""
return True
Este trecho de código pode ser encontrado no repositório do backend do projeto QRodízio, no seguinte arquivo.
O trecho de código acima descreve um padão strategy utilizado no projeto(QRodízio), onde foram feitas classes que definem as permissões dos diferentes usuários no sistema. Cada classe dessas tem o mesmo objetivo que é definir a permissão do usuário, mas trata esse objetivo de maneiras diferentes, em classes separadas strategy para as permissões básicas do funcionário, as permissões do administrador e a de nenhuma permissão.
# Modelagem
Algumas das facilidades que esse padrão ofereceu ao projeto foram: - o poder de introduzir novas strategy, se necessário, sem mudar o contexto original; - Isolar os detalhes da implementação de cada classe.
# Referências
- REFACTORING.GURU. Strategy. Disponível em: https://refactoring.guru/pt-br/design-patterns/strategy . Acesso em: 13 de outubro. 2020.
- SOURCEMAKING. Design Patters. https://sourcemaking.com/design_patterns . Acesso em: 13 de outubro. 2020.