Leia os artigos anteriores:
Dê força ao usuário com Drools – Parte 02
Dê força ao usuário com Drools – Parte 01
*
Nos artigos anteriores falei sobre o Drools e como ele poderia ser uma
boa solução de BRMS. Agora vou mostrar outra forma de expor uma regra
de negócio do seu sistema. A idéia agora é expor as regras com a
linguagem do usuário. Isso possibilita que usuários com menor
conhecimento de tecnologias consigam modificar o comportamento do
sistema de uma maneira segura e eficiente.
Utilizarei
boa parte do código do exemplo anterior. A DSL pode ser
internacionalizada para outros idiomas, isso seria útil se o seu
sistema rodasse em diversos países e você tivesse pequenas variações nas
regras de cada país.
Mas o que é um DSL?
DomainSpecificLuanguage
são linguagens para domínios bem específicos. Você pode estar pensando
que nunca usou isso ou nunca vai usar, se esse for seu caso você não
esta ligando o nome à pessoa. Exemplos de DSL são:
- MS DOS
- SQL
- Bash no Linux
- Entre
tantos outros exemplos.
Uma DSL é como se fosse uma mini-linguagem de
programação, a diferença é que uma DSL é mais limitada, nesse caso
limitada ao domínio. O Domínio não precisa ser necessariamente de TI,
pode ser o domínio de um consultório médico, de uma Transportadora ou
de qualquer empresa.
Por que usar um DSL?
Na
prática você tem diversas vantagens. Se você passa um script ou uma
tabela ou um IDE para o usuário de negócio mexer, ele tem que lidar com
a tecnologia antes de lidar com o seu problema de verdade. Com a DSL
esse impacto é bem mais reduzido, porque você escreve em português, por
exemplo, e pode usar a linguagem local do usuário, usar suas gírias, seus jargões e termos técnicos.
Você
pode criar várias DSLs, uma para cada setor da sua empresa ou
várias DSLs para vários módulos. O complicado aqui não é fazer a DSL,
mas sim chegar em um acordo com os usuários sobre que syntax será
utilizada. Isso tudo pode ocorrer na elicitação dos requisitos e
durante a análise do sistema. Isso mesmo, você não precisa do código
pronto ou de todo o design do sistema para fazer isso. A grande
vantagem aqui é que isso pode ser feito de forma paralela.
Criando a Sua DSL
Muito
bem agora vamos à prática. Como disse antes vou utilizar o modelo
anterior. Vou usar as mesmas regras que utilizei na Tabela de Decisão,
só que agora expressadas em forma de DSRL. Esse é o formato de regras
com DSL no Drools.
DSL em português chamada tarifas_DSL_pt_BR.dsl
[condition][]Se o carro eh um {modeloCarro} e sua cor eh {corCarro}=c: Carro( modelo == {modeloCarro}, cor == {corCarro} )<br />[consequence][]Tarifa de locação eh {tarifaLoc} reais=new ServiceFacadesLocator().getLocarCarroService().locar(c,null,new ValorLocacao({tarifaLoc}));Vocês podem ver que existem duas tags principais aqui que são: [condition] e [consequence]. São auto-explicativas. Tudo que estiver antes do “=” é syntax e toda vez que você quiser colocar um parâmetro você faz “{nomeDoParametro}“. Tudo que tem depois do “=” se refere ao mapeamento Java, ou seja, que código Java você quer executar quando isso for válido.
Neste
caso, na condição eu estou procurando na memória de trabalho do Drools por
um objeto Carro, que tenha cor e modelo
igual aos do parâmetro. Na conseqüência, estou aplicando a tarifação e
realizando o aluguel pelo valor do parâmetro do aluguel.
Então, agora vamos ao uso dessa DSL em um artefato de regras do Drools. tarifas.dslr
#<br /># Regras de tarifação da locação de carros.<br />#<br /># @autor Diego Pacheco<br /># @Since 25/03/2009 <br /># @version 1.0<br />#<br />package com.blogspot.diegopacheco.drools.rules<br /><br />import com.blogspot.diegopacheco.drools.model.*<br />import com.blogspot.diegopacheco.drools.model.service.*<br /><br />expander tarifas_DSL_pt_BR.dsl<br /><br />rule "Carro Bararo 1"<br /> when<br /> Se o carro eh um "Gol" e sua cor eh "branco" <br /> then<br /> Tarifa de locação eh 250 reais<br />end<br /><br />rule "Carro Bararo 2" <br /> when<br /> Se o carro eh um "Gol" e sua cor eh "bordo" <br /> then<br /> Tarifa de locação eh 280 reais<br />end<br /><br />rule "Carro Medio 1" <br /> when<br /> Se o carro eh um "Fox" e sua cor eh "vermelho" <br /> then<br /> Tarifa de locação eh 300 reais<br />endAqui estou importando os objetos necessários a DSL e estou dizendo que vou usar essa dsl através da palavra reservada expander.
Além disso, defini várias regras, no caso essas eram as mesmas três
primeiras regras que existem na tabela de decisão do artigo anterior.
Ok.
Na hora de montar a base de conhecimentos precisamos adicionar
esses dois recursos; para isso vamos utilizar um código como o que
segue abaixo.
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();<br /><br />// Adiciona a DSL criada e a regra que usa a DSL<br />kbuilder.add(ResourceFactory.newClassPathResource("tarifas_DSL_pt_BR.dsl"), ResourceType.DSL);<br />kbuilder.add(ResourceFactory.newClassPathResource("tarifas.dslr"), ResourceType.DSLR);Se você quiser, pode conferir os fontes completos no meu SVN do Beanstalkaqui. São os mesmos fontes da parte dois dessa série de artigos, mas eu os modifiquei para suportarem a utilização de DSL.
Até a próxima, abraços.







