Rafael Benevides bio photo

Rafael Benevides

In a serious relationship with Software Development

Email Twitter Facebook Google+ LinkedIn Instagram Github Last.fm Youtube

Há algum tempo afastado da Blogosfera, pelo menos como autor, mas sem perder o contato com o “mundo”, através do Google Reader; finalmente volto hoje para comentar sobre um dos meus projetos mais recentes.

Estou “tocando” um projeto no local onde trabalho que está bastante interessante em diversos sentidos. O primeiro dele é a questão de estar utilizando o Drools como “engine” de regras de negócio.

Antes, vou falar um pouco sobre o projeto: No local onde trabalho, precisa-se importar algumas informações sobre algumas entidades de todo país. Antes da importação dos dados, se faz necessário verificar se o arquivo está correto antes de ser processado pelas rotinas de importação. Para isto existia um aplicação Swing que é inicializada pelas escolas e secretarias de educação através do Java Web Start.

Neste ano fizemos um refactoring da aplicação para possibilitar maiores informações para o usuário, permitindo que durante o processamento ele saiba quantos erros já aconteceram, velocidade atual de processamento, tempo estimado para finalizar a verificação, etc.

Ao finalizar a verificação, o arquivo é compactado e enviado automaticamente para via FTP caso não existam erros. De outra forma, um relatório em PDF com os erros será gerado. Do ponto de vista interno da aplicação, muita coisa mudou da versão original. Toda a estrutura de classes foram remodeladas para que estas correspondam ao conceito representado. Sendo assim, existe uma classe Linha, que é composta de uma coleção de Campos; cada campo por sua vez possui além do seu nome e valor propriamente dito, possui também sua Definição (obrigatoriedade, tamanho, formato, etc). Cada Linha possui uma coleção de Erros (vazio ou não). O processo de desenvolvimento foi facilitado pois todos os membros da equipe (incluindo os clientes) falavam a mesma linguagem. A Linha é um objeto imutável pois só pode ser construído baseado no conteúdo informado (conteúdo da linha)

As regras de negócio, foram então implementadas através do Drools. Muita gente da equipe questionou se a as mesma regras não poderiam ser feitas através de uma sequência de “IFs”. Sim! É claro que poderia, mas cito algumas vantagens de usar o Drools neste caso.

  1. Externalização das regras
  2. Mudam-se as regras, mas não a aplicação
  3. Facilidade de compreensão (por incrível que pareça!)
  4. Otimização das regras através do algorítimo RETE
  5. Favorece a modelagem das classes de domínio, e vice-e-versa.

Por fim, para cada regra implementada, foi implementado em paralelo 2 ou mais testes unitários que visam testar se a regra deixa passar os registros corretos, informa os erros esperados e ainda os não esperados (como colocar letra no lugar de números, ou campos vazios).

Abaixo segue um exemplo de como foi implementado um teste positivo e negativo.

@Test
public void validaCodigoMatriculaVazioAdmitidoApos() {
    String conteudo = "90|15140759|2008|B1|8057394|8ª SÉRIE EF (M)|118314901708|200700014394|Pequeno Fuselo Chalreta|01/01/1990|Maria Fuselo Chalreta||1|8|0||1|||";
    Linha l = new Linha(conteudo);
    FactHandle handle = wm.insert(l);
    wm.fireAllRules();
    wm.retract(handle);
    assertTrue(l.getErros().size() == 1);
}

@Test
public void validaCodigoMatriculaVazioNaoAdmitidoApos() {
  String conteudo = "90|15140759|2008|B1|8057394|8ª SÉRIE EF (M)|118314901708|200700014394|Pequeno Fuselo Chalreta|01/01/1990|Maria Fuselo Chalreta||1|8|1||1|||";
  Linha l = new Linha(conteudo);
  FactHandle handle = wm.insert(l);
  wm.fireAllRules();
  wm.retract(handle); 
  assertFalse(l.temErro());
}

Sendo assim, qualquer novo refactoring, inserção ou remoção de novas regras, é feito com uma maior segurança, tornando-se fácil identificar os efeitos colaterais. O processo de “build” da aplicação é realizado pela Maven de maneira que somente são gerados pacotes que são aprovados nos testes unitários.

Este projeto foi finalmente homologado pelo cliente e aguarda a publicação em produção na data prevista. Todos esforços agora estão concentrados nas rorinas de importação que tratarão os arquivos envidados. Assim que sobrar mais um tempinho, postarei algumas coisas que descobri sobre o Drools dentro de servidores de aplicação.

Até breve…