DroolsDesacoplando as regras de negócio do código
da aplicação
Raphael Duarte Paiva
Agenda
MotivaçãoAlguns Problemas
AcoplamentoDificuldade de acesso
O Motor de RegrasComo Funciona?
Alguns ConceitosComponentes principais
Definindo RegrasDrools Rule LanguageDomain Specific LanguagesProcessos
Guvnor (BRMS)
Motivação
Alguns Problemas
Alguns Problemas
Acoplamento das regras de negócio com o código do sistema.
Alguns ProblemasDificuldade de acesso pelos analistas de negócio às regras que foram implementadas, compromentendo a comparação da regra descrita pelo analista com a regra que foi implementada no sistema.
Alguns Problemas
Acoplamento
Acoplamento
Acoplamento
Vantagens das regrasRegras rodam em uma camada acima do código nativo da aplicação.
Podem ser expressas em uma linguagem diferente, mais natural.São compiladas para uma linguagem cujo o motor de regras interpreta.Conseqüentemente, um build da aplicação para mudança de regras faz-se desnecessário, aumentando o uptime e contribuindo para uma maior qualidade do serviço.
Alguns Problemas
Dificuldade de Acesso
Dificuldade de acesso
Um desenvolvedor pode claramente expressar o que o código abaixo significa
Para um analista de negócios que, normalmente, nunca teve alguma experiência com desenvolvimento, ler tal pedaço de código seria uma tarefa difícil.
public void checaMaiorDeIdade(Aluno aluno) { Date dataNascimento = aluno.getPessoaFisica().getPessoa().getDataNascimento(); if (subtrairData(new Date(), dataNascimento) < IDADE_MINIMA) { aluno.getMatricula().invalidar(); } else { aluno.getMatricula().validarIdade(); }}
Dificuldade de acesso
E se regras pudessem ser escritas do seguinte modo?
Drools permite que regras de negócio possam ser escritas neste modo, para depois serem compiladas e executadas por seu motor de inferência.
regra "Aluno deve ser maior de idade" quando O aluno em questão possui - idade menor que idade mínima então invalidar matrículafim
Dificuldade de acesso
VantagensLinguagem muito próxima à linguagem natural
Facilidade de manutenção e leitura.Introduz a possibilidade do próprio analista de negócios realizar a autoria e manutenção das regras, sabendo exatamente como serão interpretadas pelo sistema.
Dificuldade de acesso
Diminui a responsabilidade da equipe de desenvolvimento de interpretar, escrever e manter as regras de negócio
Analistas de negócio têm um conhecimento muito maior do domínio do que os desenvolvedores.A capacidade dos próprios analistas escreverem as regras remove a possibilidade de algum desenvolvedor interpretar erroneamente uma regra e conseqüentemente implementá-la de forma errada.
O Motor de Regras
Como funciona?
Como funciona?
Alguns conceitos:Fatos:
São objetos que representam um determinado estado do domínio.
Regras de negócio:Toda regra é representada por dois elementos principais, seguindo a sintaxe:
quando <condições (LHS)>então <ações (RHS)>
Como funciona?
Existem 4 componentes principais:
Como funciona?
Working Memory - Memória de TrabalhoÉ onde residem os fatos.�
Production Memory - Base de ConhecimentoÉ onde reside todo o conhecimento de negócio (regras).
Pattern Matcher - Reconhecedor de padrõesResponsável por casar os fatos na memória de trabalho com as condições das regras e criar ativações a partir dos casamentos.
AgendaResponsável pela ordenação das ativações para execução.
O Motor de Regras
Definindo Regras
Definindo Regras
Drools Rule LanguageO motor de regras lê arquivos .drl, de texto puro que descrevem as regras de negócio.Nativamente, um arquivo .drl possui a seguinte sintaxe:
rule <nome_da_regra>when <condições>then <ações>end
Definindo Regras
Temos duas construções interessantes:<condições>
São escritas utilizando a linguagem do Motor de regras.
<ações>São escritas utilizando código Java.
Definindo Regras
A linguagem do motor de regras por exemplo:package org.minhacompania.regras;
import org. minhacompania.dominio.Alunoimport org.jboss.seam.core.FacesMessages
import function org.minhacompania.utils.DataUtils.subtraiData;
global java.util.Date dataAtual;global org.jboss.seam.core.FacesMessages facesMessages;
function void mensagemMenorDeIdade(String nome) { facesMessages.add(nome + " é menor de idade.");}
rule "deve ser maior de idade" salience 0 ruleflow-group "validacao" when a : Aluno($pf : pessoaFisica) pf : PessoaFisica($p : pessoa) from $pf p : Pessoa($dataNasc: dataNascimento, $nome : nome) from $p eval( subtraiData(dataAtual, $dataNasc) < 18 ) then mensagemMenorDeIdade($nome); a.getMatricula().invalidar();end
Definindo Regras
Domain Specific Languages
Definindo Regras
Domain Specific LanguagesO motor de regras possui uma poderosa maneira de mapear sua linguagem nativa, expressa nos .drl's, para uma linguagem mais natural, como mostrada nos primeiros exemplos.Este mapeamento se dá através das Domain Specific Languages, ou dsl's.dsl´s são expressas em arquivos .dsl, com uma sintaxe bastante simples, bem parecida com um arquivo .properties.
Definindo Regras
Domain Specific Languages por exemplo:
[keyword]rule=regra[keyword]when=quando[keyword]then=então[keyword]end=fim
[when]O Aluno em questão possui=a : Aluno($pf : pessoaFisica) pf : PessoaFisica($p : pessoa) from $pf p : Pessoa($dataNasc: dataNascimento, $nome : nome) from $p
[when]- idade menor que {idadeMinima}=eval( subtraiData(dataAtual, $dataNasc) < {idadeMinima} )
[then]Invalidar matrícula=mensagemMenorDeIdade($nome); a.getMatricula().invalidar();
Definindo Regras
A regra anterior poderia ser reescrita da seguinte maneira:
regra "deve ser maior de idade" salience 0 ruleflow-group "validacao" quando O aluno em questão possui - idade menor que 18 então Invalidar matrículafim
Definindo Regras
Processos
Definindo Regras
ProcessosO Drools provê também um motor para processos de negócio (BPM).Processos são definidos em arquivos xml, ou utilizando o editor gráfico do eclipse.O desenho de um processo se parece com o seguinte exemplo:
Definindo Regras
Processos são compostos por nós, sempre começando por um nó "Start" e acabando em um ou mais nós "End".Os tipos de nós disponíveis para uso são:
Definindo Regras
Alguns nós importantes:RuleFlowGroup
Quando a execução chegar a este nó, todas as regras pertencentes a ruleflow-group serão executadas.
FaultRepresenta uma condição excepcional no processo. Quando a execução chega a um nó deste tipo, uma falha com um dado nome será lançada e uma busca por um tratador para aquela falha. Caso ela não seja tratável, o processo é abortado.
Guvnor
Business Rules Management System
Guvnor
O Guvnor é uma ferramenta para gerência de regras de negócio.Entre suas características estão:
Integração com LDAP;Ambiente multi-usuário;Múltiplos tipos de editores (gráfico, texto);Controle de versão;Categorização;Criação de cenários de teste;Build e deploy.
Guvnor
Com o Guvnor, é possível realizar autoria, teste, build e deploy de pacotes de regras.
Todas estas atividades estão integradas na mesma ferramenta.
Com a configuração de Knowledge Agents no sistema, basta um build do pacote de regras pelo guvnor que a aplicação automaticamente fará download do pacote compilado e atualizará a sua base de conhecimento.
Guvnor
Tela inicial
Guvnor
Permissionamento de fina granularidade
Guvnor
Tela de pacotes
Guvnor
Tela de edição textual
Guvnor
Tela de edição gráfica
Guvnor
Tela de Testes
Módulos
Divisão das funcionalidades do Drools
Divisão das funcionalidades do Drools
É o módulo principal, que compreende o motor de regras, linguagem de regras e a implementação do algoritmo de pattern matching.
Adiciona as capacidades para lidar com BPM.
Divisão das funcionalidades do Drools
Adiciona capacidades para realizar o CEP (Complex Event Processing).
Inclui a ferramenta para Gerência de Regras de negócio (BRMS).