Estou com um desafio onde o cenário o agendamento de atividades em um calendário.
Um primeiro modelo fiz os “Tipos de Atividades” encapsuladas em ENUMS onde denotavam os estados daquele determinado tipo de atividade.
O usuário em cima em outro momento notificou a necessidade de inserção de novos tipos de atividades, o que eliminaria o ENUM.
O problema acontece é que cada tipo de atividade detém de Atributos e Regras de negócios específicas.
Por exemplo, uma atividade “Férias”, só pode haver 22 ao ano.
Uma atividade “Lançamento de Despesas”, tem que ter atributos referentes a valor, fazer algumas validações e notificar aos responsáveis.
Percebam que os Tipo de Atividades são mutáveis, alguém tem idéia de como posso gerar um modelo que atenda esses requisitos?
OK, gerar um modelo estático seria tranqüilo, (Ferias extends Atividade).
O problema como falei é que o usuário tem que ter a possibilidade de criar novas atividades concretas e também criar as regras delas.
Drools seria interessante, só que não tenho conhecimento se é possível criar regras tão específicas e dinâmicas.
O caso das férias envolve apenas 2 variaveis (Período de tempo e quantidade de dias), mas pense em atividades que possam ter mais variaveis,
logo a descrição da DSL é bem específica.
Pedir pro usuário escrever DSL é inútil quando este não sabe programar. Mas tenho uma idéia.
Você conhece o iTunes? Já viu que ele tem uma “feature” que são as pastas inteligentes? Use esse esquema. Imagino assim:
Quando o usuário cadastra uma Atividade, permita que o usuário crie uma lista de Atributos, onde cada Atributo tem seu nome e seu tipo (Data, Numérico e Alfanumérico).
Depois, permita que o usuário crie uma lista de Regras, onde cada Regra é formado de Atributo (cadastrado na tela anterior), comparador (maior, maior-igual, igual, menor, menor-igual, diferente) e Valor (pode ser um outro atributo ou um literal).
Assim, quando um outro usuário agendar uma atividade, deve carregar campos de acordo com o definido na lista de Atributos, ao preencher, tudo é armazenado num Map, mas antes é feita a validação iterando sobre a lista de Regras.
OK, eu havia planejado algo assim tbm, mas imagine que cada atividade estende de uma atividade abstrata e esta tem um método abstrato “validaAtividade”
Logo todas terão de implementar esse método, mas como poderia pegar esse monte de registro de regras e executar no java?
bem um modelo interessante,seria criar um objeto atividade assim:
Atividade:
-atributos:um ou mais objetos do tipo atributo contendo,nome, valores e tipo do atributo
-regras: um ou mais objetos do tipo regra contendo scripts numa “dsl” que usuario conheca, e possa altera-la quando quiser