Padrões de projeto - Negócio "plugável"

E aí galera, blz? Seguinte, foi me solicitado em um projeto, que as regras de negócio de uma aplicação poderão ser desabilitadas sem alteração em código. A solução que surgiu foi cadastrar as mesmas no banco, relacionando a classe que executa a mesma na aplicação. Daí via reflection eu instanciaria as mesmas no momento da necessidade. O que pergunto é: existe algum padrão de projeto que me ajude com isso? Pensei no command, mas essas minhas classes deverão receber parâmetros, o que me parece fugir um pouco do command.

E aí?

A Paz!!

Que tal utilizar linguagens de script? Groovy é uma boa pedida…

?? Mas nesse caso meu as regras vão ficar no lado servidor.

A Paz!!

Fala Paulo… aí diversos padrões podem ser adotados. Foque em padrões de comportamento.

Da maneira que você descreveu, logo de cara vejo a aplicação do pattern Strategy. Com ele você pode definir comportamentos (regras de negócio) em runtime, deixando os comportamentos encapsulados em classes.

Exemplo:

public class PedidoVenda {
   
   private long numero;
   private String nomeCliente;

   private FaturarBehavior faturarBehavior;

   public PedidoVenda(numero, nomeCliente) {
      //TODO: implement me
   }

   //outras operações get, set e e de negócio

   public void faturar() {
      faturarBehavior.faturar();
   }

}

public interface FaturarBehavior {
   public void faturar();
}

public class MeuFaturamento implements FaturarBehavior {

   public void faturar() {
      //TODO: meu faturar específico
   }

}

Esse é só um exemplo. Para definir que o MeuFaturamento vai ser usado você pode usar um Factory de Pedido ou Dependency Injection.

Você também pode usar Decorator para mudar comportamentos em runtime. Existem outros patterns. Uma literatura boa é o Head First Design Patterns em inglês. A didática é espetacular e a cobertura do assunto para JAVA é muito bom…

Bom… qual é o problema que as regras estão do lado do servidor? Você pode simplesmente modificar regras de negócio alterando ou trocando o script.

Sei lá, na minha opinião é bem menos porco do que guardar os nomes das classes no banco e chamá-las via reflection. :stuck_out_tongue:

Bom… tá aí minha sugestão…

Dê uma olhada no “Quick Start” do Groovy e veja se ela se adapta ao que você deseja fazer.

http://groovy.codehaus.org/Quick+Start

[quote=rodrigoy]Fala Paulo… aí diversos padrões podem ser adotados. Foque em padrões de comportamento.

Da maneira que você descreveu, logo de cara vejo a aplicação do pattern Strategy. Com ele você pode definir comportamentos (regras de negócio) em runtime, deixando os comportamentos encapsulados em classes.

Exemplo:

public class PedidoVenda {
   
   private long numero;
   private String nomeCliente;

   private FaturarBehavior faturarBehavior;

   public PedidoVenda(numero, nomeCliente) {
      //TODO: implement me
   }

   //outras operações get, set e e de negócio

   public void faturar() {
      faturarBehavior.faturar();
   }

}

public interface FaturarBehavior {
   public void faturar();
}

public class MeuFaturamento implements FaturarBehavior {

   public void faturar() {
      //TODO: meu faturar específico
   }

}

Esse é só um exemplo. Para definir que o MeuFaturamento vai ser usado você pode usar um Factory de Pedido ou Dependency Injection.

Você também pode usar Decorator para mudar comportamentos em runtime. Existem outros patterns. Uma literatura boa é o Head First Design Patterns em inglês. A didática é espetacular e a cobertura do assunto para JAVA é muito bom…

[/quote]

Cara, vc quase que acerta até o domínio do problema. O software que estou projetando/desenvolvendo é um Workflow de Pedidos. Tais pedidos devem passar por aprovação em várias gerencias e cada gerência tem suas regras de negócio específicas.
Daí minha idéia é relacionar tais regras de negócio às gerencias e aplicá-las no fluxo(por isso a idéia de cadastrar). Dái o que iria fazer seria criar uma interface que todas as classes de regras de negócio(pedido) iriam implementa-las. Daí quando necessário, eu obteria as mesmas através de Factory(que buscaria no banco e instanciaria por reflection).

O que acham desta abordagem?

Valeu!

A Paz!

[quote=TriTonE]Bom… qual é o problema que as regras estão do lado do servidor? Você pode simplesmente modificar regras de negócio alterando ou trocando o script.

Sei lá, na minha opinião é bem menos porco do que guardar os nomes das classes no banco e chamá-las via reflection. :stuck_out_tongue: [/quote]

Mas eu teria que parar a aplicação para mudar os scripts?!

A Paz!!

[quote=paulohbmetal][quote=TriTonE]Bom… qual é o problema que as regras estão do lado do servidor? Você pode simplesmente modificar regras de negócio alterando ou trocando o script.

Sei lá, na minha opinião é bem menos porco do que guardar os nomes das classes no banco e chamá-las via reflection. :stuck_out_tongue: [/quote]

Mas eu teria que parar a aplicação para mudar os scripts?!

A Paz!![/quote]
Considerando que os scripts são interpretados, basta que você substitua o arquivo no servidor. Não sei te informar com certeza, mas acho que você consegue fazer deploy dos scripts através de hot-deploy. Como os scripts são interpretados, assim que você colocar o script no servidor, a nova regra já estará sendo aplicada nas próximas requisições.

Regras de negocios? Utilize uma Rule Engine.

Duas que eu conheço e assino embaixo: JBoss Rules (antigo Drools) e o da iLog.

O da iLog é mais completo com todo o workflow e ferramental já pronto, mas custa caro. O JBoss Rules você vai ter que desenvolver repositorio, workflow (de aprovação) e etc, mas é de grátis e mui boa.

Procure por Rules Engine no tio Google que tem mas.