Archive for the Engenharia de Sofware Category

O que você acha de transformar usuários em efetivos tomadores de decisão quando falamos de regras de negócio. Sabe aquele desejo antigo de UML para Analistas e Código para Programadores, ou melhor ainda: Caixinhas, Bolas, Setas e etc ligadas forma a execução de um processo do sistema! Parece loucura, mas não é. Usando BPM, ESB, JBI e etc, temos várias mecanismos para encaixar essas facilidades.

Errata:Sendo assim podemos criar uma Domain Specific Language (DSL), uma linguagem que é especifica para usuários, onde eles possam entender o que está acontecendo nas regras de negócio do sistema. É mais ou menos isso que o

Sendo assim, criamos um arquivo .DSL , que vai permitir que utilizemos uma linguagem natural que é especifica para usuários, onde eles possam entender o que está acontecendo nas regras de negócio do sistema. É mais ou menos isso que o projeto que estou ajudando tem que fazer, então vamos a um pequeno exemplo: PT_BR.dsl :

JAVA:
  1. Imprima "{msg}"=System.out.println("{msg}")
  2. [when]A quantidade produto igual a {value}=p : Produto( estoque =={value})
  3. [then]Chame o comando de continuação de Produto=p.dispatch();

JAVA:
  1. rule "Estoque"
  2.  
  3. when
  4. A quantidade produto igual a 0;
  5. then
  6. Imprima "Estoque zerado";
  7. Chame o comando de continuação de Produto
  8. end

E com uma alteração no Engine de Leitura de Regras:

JAVA:
  1. Reader dsl =
  2. new InputStreamReader( Thread.currentThread().getContextClassLoader().getResourceAsStream
  3.  
  4. ("com/summatech/framework/rules/dsl/"+ lang.toString() +".dsl"));
  5.  
  6. PackageBuilder builder = new PackageBuilder();
  7. builder.addPackageFromDrl( source, dsl );

Agora, temos a possibilidade de trabalhar 100% com DSLs, sendo assim, em idiomas humanos, sendo assim inglês, francês e etc.

Consulte o site do JBoss Rules

Abraços

Edgar

Pense aqueles momentos que você tem um grande sistema em produção e várias regras de negócios são mudadas devido a movimentos de mercados, ou simplesmente "eventos" internos do seu ERP, como baixa em estoque, ou aumento de vendas, atraso de entregas e etc... Imagine os  tipos de aplicações que sofrem mudanças e compilações diárias devido a suas regras de negócio, vida bastante complicada nao é?

Há um projeto na empresa que deveremos usar alguns agentes inteligentes para evitar recompilação em cenários das regras de negócios devemos usar o JBoss Rules (Drools), para isto, bolei alguns facilitadores para abstrair seu uso, caso num futuro alguém queria usar o Jess, a mudança será natural. O mais interessante, é que já há uma JSR que trata também estas questões de engine de regras (rules) , que é a JSR 094.

Vou aproveitar este post, para dar algumas idéias de arquitetura e design de um mecanismo de execução de regras e alguns exemplos simples. Primeiramente uma interface que encapsula o processamento de regras:

JAVA:
  1. import javax.rules.RuleException;
  2.  
  3. public interface RuleProcessor<r> {
  4.  
  5. public void execute(Object o) throws RuleException;
  6.  
  7. }

Uma classe Abstrata que trata algumas peculiaridades do Drools:

JAVA:
  1. import org.drools.RuleBase;
  2. import org.drools.RuleBaseFactory;
  3. import org.drools.compiler.PackageBuilder;
  4. import org.drools.rule.Package;
  5.  
  6. public class AbstractDroolsRulesExecutor {
  7.  
  8. protected  static RuleBase readRuleBase(String sourceDRL) throws Exception {
  9. //read in the source
  10. Reader source = new InputStreamReader(AbstractDroolsRulesExecutor.class.getResourceAsStream(sourceDRL));
  11. PackageBuilder builder = new PackageBuilder();
  12. builder.addPackageFromDrl( source );
  13. Package pkg = builder.getPackage();
  14. RuleBase ruleBase = RuleBaseFactory.newRuleBase();
  15. ruleBase.addPackage( pkg );
  16. return ruleBase;
  17.  
  18. }

Um executador padrão para regras via Drools.

JAVA:
  1. import javax.rules.RuleException;
  2. import org.drools.WorkingMemory;
  3.  
  4. public class DroolsExecutor extends AbstractDroolsRulesExecutor implements RuleProcessor<object> {
  5.  
  6. public void execute(Object o) throws RuleException {
  7. WorkingMemory wM ;
  8. try {
  9. wM = readRuleBase("/"+o.getClass().getSimpleName()+".drl").newWorkingMemory();
  10. wM.assertObject(o);
  11. wM.fireAllRules();
  12. } catch (Exception e) {
  13. e.printStackTrace();
  14. new RuleException("Falha ao buscar a Regra : " + e.getMessage());
  15. }
  16. }
  17. }

Sendo assim, com base no nome da classe do objeto passado para ser validado, carregamos um arquivo de regras, e ai disparamos todas as regras associadas. Veja a seguir o exemplo do arquivo de regras:

JAVA:
  1. #created on: 15/Fev/2007
  2. package com.cardif.erp.produtos
  3.  
  4. import com.cardif.erp.produtos.Produto;
  5.  
  6. #list any import classes here.
  7.  
  8. #declare any global variables here
  9. rule "Estoque"
  10.  
  11. when
  12. p : Produto( estoque ==0)
  13. then
  14. System.out.print("Estoque Zerado, por favor reveja!");
  15. p.dispatch();
  16.  
  17. end
  18.  
  19. rule "NomeProduto"
  20.  
  21. when
  22. p : Produto( nome  =="Seguro")
  23. then
  24. System.out.print("Para seguros nao posso fazer isso...");
  25. p.dispatch();
  26.  
  27. end

Este arquivo usa uma DSL específica, simples e fácil para codificação, porém podemos criar dicionários baseados na linguagem humana, do tipo:

"envie um email para o {destinatario} quando o estoque for de {risco}"

Imagine que desta forma até seus usuários podem validar suas regras de negócio. Usando as classes que mostrei nesste post, você pode testar as regras de forma extremamente fáceis, veja este exemplo:

JAVA:
  1. Produto pro = new Produto();
  2. pro.setNome("Seguro");
  3. pro.setEstoque(0);
  4.  
  5. DroolsExecutor d = new DroolsExecutor();
  6. d.execute(pro);
  7.  
  8. System.out.println("Executado");

A Semana Paraense de Informática é um evento que participo há muitos anos, é a semana de tecnologia do meu estado e acredito que um dos maiores se não o maior da Região.

Este ano participo com 4 palestras, no evento principal e em 2 eventos satélites (III - Beljungle - JAVA)  e no Congresso de Software (Engenharia de Software).

Vai ser bom encontrar amigos e reencontrar os antigos , acredito que esse evento vai ser super legal mesmo. Até porque um grande amigo, Bruno Souza, também estará presente, ou seja, será fácil nos encontrar comendo no Picanha & Cia e depois tendo uma overdose de Sorvetes na Cairú :)

Abracos

Edgar