Drools Desacoplando as regras de negócio do código da aplicação Raphael Duarte Paiva
Agenda Motivação Alguns Problemas Acoplamento Dificuldade de acesso O Motor de Regras Como Funciona? Alguns Conceitos Componentes principais Definindo Regras Drools Rule Language Domain Specific Languages Processos Guvnor (BRMS)
Motivação Alguns Problemas
Alguns Problemas Acoplamento das regras de negócio com o código do sistema.
Alguns Problemas Dificuldade 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 regras Regras 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 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(); } } 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.
Dificuldade de acesso E se regras pudessem ser escritas do seguinte modo? regra "Aluno deve ser maior de idade" quando O aluno em questão possui - idade menor que idade mínima então invalidar matrícula fim Drools permite que regras de negócio possam ser escritas neste modo, para depois serem compiladas e executadas por seu motor de inferência.
Dificuldade de acesso Vantagens Linguagem 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ões Responsável por casar os fatos na memória de trabalho com as condições das regras e criar ativações a partir dos casamentos. Agenda Responsável pela ordenação das ativações para execução.
O Motor de Regras Definindo Regras
Definindo Regras Drools Rule Language O 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.aluno import 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 Languages O 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ícula fim
Definindo Regras Processos
Definindo Regras Processos O 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. Fault Representa 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).
Fim! Dúvidas? Contato: raphaeldpaiva@gmail.com