Padrão Specification
Definição:
O padrão Specification visa mover regras de negócio que podem mudar ao longo do tempo para fora da entidade ou objeto de valor, colocando-as em uma classe específica para essa regra.
Exemplo:
No contexto de uma lei de aposentadoria, cria-se uma classe para cada edição da lei, com um método booleano que recebe a entidade (por exemplo, funcionário) e retorna verdadeiro se ela atende à regra ou falso se não atende.
Vantagens do Padrão Specification
-
Facilidade de Adaptação:
Com uma nova edição de uma lei, basta criar uma nova implementação da especificação, sem precisar alterar a existente. -
Testabilidade:
Especificações antigas continuam válidas, e novas podem ser testadas separadamente. -
Verificação Cruzada:
Permite comparar resultados de diferentes versões de uma regra, verificando, por exemplo, se um funcionário elegível para aposentadoria sob uma lei ainda é elegível sob outra. -
Expressividade:
Traz para o modelo de domínio expressões da linguagem ubíqua, facilitando a comunicação com especialistas de domínio.
Abordagem com Interfaces Abstratas
Abstração de Specification:
Utiliza uma interface genérica com um método booleano que valida se uma instância atende à especificação.
Combinação de Especificações:
Possibilita a criação de implementações genéricas combináveis, usando operadores como AND, OR, NOT.
Injeção de Dependências
Com uma nova especificação, basta alterar o tipo no contêiner de injeção de dependências para atualizar todo o sistema.
Uso Conjunto com Factor
Factory para Escolha de Especificações:
Utilizada em cenários onde múltiplas especificações são vigentes simultaneamente, a Factory toma decisões sobre qual especificação deve ser usada com base em parâmetros.
Outros Usos do Padrão Specification
Além de regras de negócio que mudam ao longo do tempo, o padrão Specification pode ser aplicado em algoritmos de recomendação, seleção de produtos, entre outros. Ele é especialmente eficaz em normas e especificações que mudam periodicamente em grandes empresas.