segunda-feira, 26 de dezembro de 2016

Regras de negócios com Drools: Usando planilhas

Veja postagens anteriores:


 Há diversas maneiras de escrever regras de negócios com Drools e até agora só mostramos a linguagem de script. A ferramenta drools é uma motor de regras que também disponibiliza várias formas de criarmos nossas regras e vamos explorar todas aqui. Hoje vamos mostrar como escrever regras com uma planilha eletrônica!

Do script para planilhas

Você pode ensinar pessoas habituadas com negócio a escrever regras drools, mas não é esse tipo de ferramenta que usualmente quem entende de negócios se sente mais confortável utilizando.
Entre diversas alternativas que iremos mostrar nesse blog, o uso de planilhas é, talvez, o modo que mais se aproxima de quem escreve regras de negócio.
Afinal, o que seria mais atraente, um script como na imagem 1 ou uma planilha como na imagem 2:

Imagem 1

Imagem 2

Com o projeto decision tables, O drools consegue transformar compilar planilhas para regras como as mostradas na imagem 1. Mas qual a mágica por trás disso?


Palavras-chaves que fazem toda a diferença


Omitimos algumas coisas na planilha da imagem 2! Na verdade ela tem algumas linhas escondidas. Veja na imagem 3 o que foi escondido:

Imagem 3


 As linhas em rosa e amarelo são especiais para o drools e é com elas que é possível transformar simples planilhas em regras que terão acesso aos fatos da memória do Drools. Em outras palavras, quem lidar com a planilha estará tomando decisões  sobre os fatos da memória diretamente, mas sem conhecer Java ou Drools.

A mágica está nas seguintes palavras-chave e suas posições

  • RuleSet: A célula seguinte à célula(imediatamente à direita) com o conteúdo da palavra RuleSet define o pacote dessas regras. É obrigatório o seu uso.
  • Import: A célula à direita deverá conter os imports de classes para serem usadas nas regras. Os imports são separados por vírgulas;
  • Notes: A célula a direita deverá conter uma nota "humana" sobre aquele conjunto de regras;
  • RuleTable: O início da parte da planilha onde se define as regras em sí. A célula abaixo dessa deverá ser uma CONDITION(ou outra palavra-chave de uma rule table). Devemos ter pelo menos uma RuleTable na nossa planilha, mas podemos definir diversas RuleTable. Note que a célula com RuleTable é seguido pelo nome dessa RuleTable;
  • Condition: As condições para uma determinada regra. Uma RuleTable deve pelo menos ter uma Condition. As células abaixo dessa deverão ter a expressão para a condição da regra:
    • A primeira linha é a declaração de objetos;
    • As linhas abaixo são os testes para os atributos desse objeto. Se os atributos pertecem ao mesmo objeto declarado você deve fazer um merge das linhas acima;
    • Na próxima célula abaixo podemos ter um cabeçalho para a coluna e assim informar o valor "de forma humana" que deve ser entrado;
    • As células  abaixo serão os valores de teste. Para referenciar eles na condição você usa $param para um único parâmetro ou $1, $2... para múltiplos parâmetros;
    • Veja a Imagem 3 para um exemplo;
  • Action: A action é o que deve ser feito se as condições forem satisfeitas. As linhas abaixo de action são os pedaços de código que serão executados usando os possíveis parâmetros passados nas células abaixo. Para referenciar os parâmetros usamos os já mencionados $param e $1, $2...


Notem que somente a primeira planilha é considerada e o que fazemos  no restante da planilha não importa para o drools, o que ele quer é o exposto acima e mais algumas palavras chaves que não iremos abordar hoje, mas estão na documentação do Drools.
Um outro ponto interessante é que se a gente altera um fato (fato pode ser entendido como objetos da memória do Drools) e essa alteração faz com que as condições satisfaçam outra linha na planilha, a outra linha será executada. Isso não é novidade para quem conhece motor de regras e isso acontece já com as regras que escrevemos na mão, o ponto é que com planilhas eletrônicas isso fica muito claro! Veja na Imagem 4, as linhas 13,14,15 mudam o status do ticket para Escalate fazendo com que a linha 16 seja acionada, por fim, enviando um email de escalação do ticket. Bacana, não?

Imagem 4


Agora ficou muito fácil entender o nosso exemplo. Primeiramente, o Candidato é um simplesmente objeto Java(veja a imagem 5), a planilha é um arquivo comum dentro do nosso kjar e o código que podemos usar para executar os fatos já são muito conhecidos dos que estão lendo essa sério, veja na imagem 6.

Imagem 5


Imagem 6


Ao executar esse código com o nosso kjar as regras são disparadas e os fatos atualizados como mostrado abaixo:

Candidato [nome=William, idade=28, fundos=1600.0, analise=Habilitado para investidor nível Bronze]
Candidato [nome=Luana, idade=27, fundos=5000.0, analise=Habilitado para investidor nível Prata]
Candidato [nome=Antônio, idade=1, fundos=0.0, analise=Não atingiu idade mínima para investir]



O código desse projeto está no github.



As planilhas, conforme já falado, ficam dentro do kjar, ou seja, outras ferramentas do drools, como o KieScanner e o Kie Server, funcionam normalmente com essas planilhas. Em breve abordaremos o Kie Server aqui e usaremos esse mesmo projeto, fique ligado!

Mais sobre Decision Tables



Em drools-examples você encontra mais algumas planilhas de exemplo. Na documentação você descobre tudo o que pode fazer com elas. Importante que com o tempo você vai entendendo e digerindo o conceito até que uma hora você enxerga todo o poder dessa abordagem!

Conclusão


Introduzimos a ideia de decision tables utilizando planilhas. Claro que há diversas outras formas de criarmos regra drools e iremos explorar todas em postagens futuras!

Um comentário:

  1. Obrigado pelo material instrutivo Willian. Vi que o post eh antigo e o Drools esta agora na versao 7.9.0 mas mesmo assim ajudou.
    Voce pretende fazer um video novo explorando o que mudou no Drools/jBPM de la ate aqui?

    Abraco.

    ResponderExcluir