Este documento fornece um resumo sobre programação orientada a regras e o framework Drools Expert. Ele discute quando aplicar programação orientada a regras, apresenta os principais componentes do Drools Expert e fornece exemplos de uso de regras para validação, cálculos, monitoramento e regras de negócio.
1. Drools Expert :
Programação
Orientada a Regras
Fábio Santos
Setembro de 2010
Fábrica de Software
Sistemas e aplicações sob medida para as
necessidades do seu negócio.
2. Agenda
Introdução à Programação Orientada a Regras
Quando aplicar?
Drools Expert – Visão Geral
Um exemplo de uso
3. Drools – Família de Produtos
Drools Expert: Rules Engine
Drools Fusion: Complex Event Processing
Drools Flow: Workflow / Business Process
Drools Guvnor: Centralised Knowledge Repository
Drools Planner: Solves Planning Problems
4. Drools – Família de Produtos
Drools Expert: Rules Engine
Drools Fusion: Complex Event Processing
Drools Flow: Workflow / Business Process
Drools Guvnor: Centralised Knowledge Repository
Drools Solver: Solves Planning Problems
5. Orientação a Regras
Paradigma de Programação Estruturada
O código-fonte determina o que deve ser feito, quando e como.
Faça isso, depois faça aquilo...
6. Orientação a Regras
Paradigma de Programação Orientada a Regras
O código-fonte determina regras que dizem o que deve ser
feito quando determinada condição for satisfeita.
Faça isso quando aquilo ocorrer...
7. Orientação a Regras
Em determinado instante, Quando
deseja-se executar um Um conjunto
conjunto de regras de condições
é satisfeito Estado do
Sistema
Então
Um conjunto
de ações são
realizadas
8. Orientação a Regras
Orientação a Regras × Orientação a Eventos
Orientação a Regras: As condições (o “quando”) são definidas
de acordo com o estado do sistema.
Orientação a Eventos: As condições são definidas por ações
tomadas no sistema.
9. Orientação a Regras
Nos casos de distinção mais difícil:
Orientação a Regras: Pressupõe que um conjunto de ações
precisam ser tomadas em um determinado instante e o atual
estado do sistema será usado para descobrir quais ações
devem ser realizadas.
Orientação a Eventos: Pressupõe que a condição original
independe da ação que será disparada em decorrência do
evento disparado.
10. Orientação a Regras
Como em todo paradigma diferente, é preciso mudar a
abordagem
Use a abordagem mais adequada para o problema em questão
Uma abordagem não consegue resolver todos os problemas
da forma mais organizada e legível possível
O uso de regras pode tornar trivialmente legível
a solução de problemas muito complexos,
mas pode tornar praticamente ilegível
a solução de um problema simples
11. Orientação a Regras
Regras são determinísticas, ou seja, podem ser testadas
A quebra de uma solução complexa em um conjunto de regras
simples facilita a implementação de testes automatizados
Provavelmente, seu sistema não será inteiramente
implementado usando regras, mas o uso de regras pode ser
relevante em determinados lugares
12. Quando Aplicar?
Problemas Complexos
O uso de regras possibilita a quebra de um problema complexo
em um conjunto de regras simples e independentes que,
quando aplicadas em conjunto, resolvem elegantemente o
problema em questão
13. Quando Aplicar?
Regras de Negócio Voláteis
A separação entre dados e lógica é muito bem determinada (os
dados são os seus objetos de domínio, a lógica são as regras)
As regras podem ser facilmente alteradas sem a alteração da
estrutura de dados
As regras podem ser alteradas dinamicamente (por um
exemplo: um conjunto de regras para um cliente específico)
A organização das regras permite melhor administração da
base de conhecimento
14. Quando Aplicar?
Outras considerações
Desempenho
A execução de regras através do Drools Expert pode superar a
programação estruturada comum em desempenho, mas não
alcança a performance de algoritmos suficientemente otimizados
Integração
Regras podem ser modeladas através de ferramentas visuais
(Eclipse) e podem ser utilizadas como tomada de decisão em
workflows (Drools Flow)
Legibilidade e Compreensividade
Regras podem ser descritas em linguagem natural (DSL)
O Drools Expert é capaz de registrar as decisões tomadas com base nas
regras que foram executadas
15. Quando Aplicar?
Aplique orientação a regras quando:
For necessário solucionar um problema, mesmo que não muito complexo,
que possua uma solução frágil ou volátil
For necessário solucionar um problema que não tem um algoritmo
completamente compreendido
For necessário solucionar um problema que muda com frequência
A solução do problema tenha que ser escrita por especialistas no
domínio do problema, e não em software
Sintoma: muitos “ifs” e “switches” ou, em casos mais elaborados,
muitos “strategies” no código
16. Quando Aplicar?
Exemplos de uso:
Validação
Uma determinada pessoa pode obter um empréstimo pessoal?
Cálculo
Calcular o prêmio de um seguro
Calcular o valor da tarifa de uma ligação telefônica
Roteamento e Filtragem
Filtragem de mensagens (e-mails, SMS, etc)
17. Processo de manutenção
As regras forman uma base de conhecimento fora do código
fonte Java
Quem mantém as regras?
É importante definir um processo para a manutenção das
regras em produção
Papéis: Desenvolvedores? Especialistas no negócio? Outros?
Workflow: Implementação/Testes/Deploy...
“ Most IT departments seem to exist for the purpose of preventing
software being rolled out.”
18. Drools Expert
Começando com um exemplo bem simples – Avaliação de
Crédito
As regras envolvidas em um processo de avaliação de crédito
são complexas e voláteis
No entanto, podemos começar a criar uma base de
conhecimento a partir de regras bem simples
Exemplo: O candidato não pode ter menos de 18 anos idade
19. Drools Expert
public class Candidato {
private String nome;
private int idade;
...
public void negarCredito() {
...
}
}
rule "Maioridade"
when
$candidato : Candidato ( idade < 18 )
then
$candidato.negarCredito();
end
20. Drools Expert
As condições da regra são denominadas fatos
Ou seja, para que a parte then seja executada, os fatos relacionados na
parte when devem todos ser satisfeitos
No exemplo, deve existir uma instância de objeto da classe
Candidato com o campo idade com valor superior a 18
Se a condição for satisfeita, o método negarCredito() do(s) objeto(s) da
classe Candidato encontrado(s) será(ão) executado(s)
21. Drools Expert
Adicionando nova regra:
rule "Bloqueio Serasa"
when
$canditato : Candidato ( bloqueios.size() > 0 )
then
$candidato.negarCredito();
end
23. Drools Expert – Arquitetura
Production Memory
Conjunto de regras que serão verificadas
Working Memory
Conjunto de objetos sobre os quais as regras serão verificadas
Representam os fatos, aquilo que se considera “estado do sistema”
Pattern Matcher
Motor que faz a junção entre regras e fatos, definindo quais regras serão
executadas
Agenda
Motor que executa as regras (possui inteligência para evitar execuções
duplicadas, por exemplo)
24. Drools Expert – Detalhes
Construindo a Production Memory
KnowledgeBuilder kbuilder =
KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newClassPathResource(
"licenseApplication.drl", getClass()), ResourceType.DRL);
KnowledgeBase kbase =
KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
O arquivo referenciado será carregado do classpath
25. Drools Expert – Detalhes
Arquivo de Regras
A maneira padrão e mais simples para o armazenamento de
regras é através de um arquivo de texto, que pode conter
uma ou mais regras
O arquivo deve conter, em seu início, a declaração do pacote:
package com.dominio.rules
Pode conter também a declaração de importações de classes e interfaces
(não é preciso importar classes e interfaces do mesmo pacote)
Pode conter a declaração de uma ou mais regras
Cada regra deve possuir um nome único neste pacote, dentro da mesma
Production Memory
26. Drools Expert – Detalhes
Construindo a Working Memory
StatelessKnowledgeSession ksession =
kbase.newStatelessKnowledgeSession();
Candidato candidato = new Candidato("Joao da Silva", 16);
ksession.insert(candidato);
ksession.fireAllRules();
Mais de um objeto pode ser atribuído à Working Memory
27. Drools Expert – Working Memory
Stateless
Os fatos são adicionados à Working Memory
As regras são executadas somente uma vez
(não exatamente uma única vez por que as próprias regras podem
alterar a Working Memory)
Statefull
Os fatos podem ser adicionados, removidos ou alterados na Working
Memory
As regras podem ser executadas múltiplas vezes, de acordo com as
mudanças detectadas na Working Memory
Útil para soluções de monitoração, diagnóstico de problemas, logística
em real-time, etc.
28. Exemplo de Uso
Segurança de Dados
A especificação JAAS atende aos requisitos de segurança que demandem
controle por funcionalidade e perfil. Ou seja, frases do tipo “ Somente
administradores do sistema podem cadastrar novos usuários ” podem
ser facilmente formuladas através deste padrão.
No entanto, as frases abaixo não podem ser formuladas sem codificação
específica:
“Somente o professor titular de uma turma pode atribuir notas aos
respectivos alunos”
“Somente o médico responsável pode emitir o laudo de um
paciente”
Nestes casos, não basta possuir o perfil de professor ou médico em um
sistema, pois a permissão de acesso somente deverá ser dada no
contexto de negócio em que a operação é realizada.
29. Exemplo de Uso
Em geral, estas regras são implementadas no código-fonte da
própria aplicação
Mas, e se estas regras forem voláteis?
E se for difícil determiná-las a priori? É possível adicioná-las
posteriormente sem alterar o sistema inteiro?
Talvez seja um bom lugar para usar regras, não?
30. Exemplo de Uso
Caso 1: Pressupondo a existência das classes Professor,
Turma e Aluno:
Turma
Professor Aluno
- titular : Professor
- alunos : Collection<Aluno>
Pressuponha também a existência da classe Constraint que
define se o acesso será autorizado (allow()) ou bloqueado
(deny()) para a tentativa de acesso em questão, com uma
instância na Working Memory.
31. Exemplo de Uso
Exemplo de regra (supondo uma instância de Aluno e uma de
Professor na Working Memory)
rule "Atribuicao de nota a aluno"
when
$aluno : Aluno()
$professor : Professor()
Turma ( titular == $professor, alunos contains $aluno )
$constraint : Constraint()
then
$constraint.allow();
end
32. Exemplo de Uso
Caso 2: Pressupondo a existência das classes Paciente e
Médico:
Medico Paciente
- responsavel : Medico
33. Exemplo de Uso
Exemplo de regra (supondo uma instância de Paciente e uma
de Médico na Working Memory)
rule "Emissao de Laudo"
when
$medico : Medico()
$paciente : Paciente( responsavel != $medico)
$constraint : Constraint()
then
$constraint.deny();
end
34. Exemplo de Uso
Caso 3: Monitoramento de Aplicações
rule "Free memory"
when
Machine( freeMemory < 100.0 )
$alarm : Alarm()
then
$alarm.increaseRisk();
end
rule "Response time"
when
Application( responseTime > 1200 )
$alarm : Alarm()
then
$alarm.increaseRisk();
end
35. Exemplo de Uso
rule "Fire e-mail alarm"
timer (int: 0s 5m)
when
$alarm : Alarm( risk == 1 )
then
channels.notifyByMail($alarm);
end
rule "Fire SMS alarm"
timer (cron:* 0/5 * * * ?)
when
$alarm : Alarm( risk == 2)
then
channels.notifyBySMS($alarm);
end
36. Exemplo de Uso
Caso 4: Regras de Negócio
rule "Promocao de dia das maes"
when
$carrinho : CarrinhoDeCompra( valorTotal > 350.0 )
$item : Item( valor > 50.0 ) from $carrinho
then
$item.aplicaDesconto(0.10)
end
rule "Se for troca, cancela desconto"
when
$item : Item( troca == true)
then
$item.cancelaDesconto()
end
37. Exemplo de Uso
E no caso de sobreposição lógica?
rule "Promocao de dia das maes"
when
$carrinho : CarrinhoDeCompra( valorTotal > 350.0 )
$item : Item( valor > 50.0 ) from $carrinho
then
$item.aplicaDesconto(0.10)
end
rule "Se for troca, cancela desconto"
salience -1
when
$item : Item( troca == true)
then
$item.cancelaDesconto()
end
38. DSL – Domain Specific Language
O Drools Expert possibilita a criação de DSLs para descrever
regras
O objetivo do uso de uma DSL é permitir a elaboração de regras por
analistas de negócio que entendam muito pouco de orientação a
objetos ou da especificação da Rule Language
O uso de uma DSL facilita bastante a parametrização de regras
O uso de uma DSL, no entanto, pode ser inviável se as regras
forem muito voláteis em sua estrutura, e não somente em
sua parametrização
39. DSL
Exemplo (um gostinho...):
[when]Candidato é maior de idade=Candidato (idade > 18)
A regra ilustrada no início da apresentação ficaria:
rule “Maioridade”
when
Candidato é maior de idade
…
O arquivo contendo a especificação da DSL deve ser também
adicionado à Production Memory
40. DSL
rule "Atribuicao de nota a aluno"
when
$aluno : Aluno()
$professor : Professor()
Turma ( titular == $professor, alunos contains $aluno )
$constraint : Constraint()
then
$constraint.allow();
end
rule "Atribuicao de nota a aluno com DSL"
when
Professor é titular da turma do aluno
$constraint : Constraint()
then
$constraint.allow();
end