Pergunta

Eu estou tentando construir um sistema baseado em regras para a interpretação de dados. No entanto, estou tendo problemas decidir sobre uma maneira de construir a lógica para armazenar e interpretar as regras.

Atualmente, existe uma estrutura de banco de dados que bastante complexa, mas vai lidar com todos os aspectos de armazenar os dados da regra. A idéia é que o sistema será capaz de imitar a maneira que o MS Outlook permite que um usuário para adicionar regras.

Meus problemas são os seguintes:

  1. O padrão que eu deveria estar usando para armazenar essas regras dentro de objetos?
  2. Devo usar eval () ou orientação adequada objeto para executar as regras?

E exemplo regra pode ser:

Dog deve ter colar na área Parque

Onde cada elemento (cão, deve ter, colarinho, na área, parque) é uma parte separada da lógica a ser interpretado.

Qualquer conselhos gerais para as perguntas acima é muito apreciada!

Foi útil?

Solução

Eu nunca implementado um sistema como você descreve em um contexto de "mundo real", mas eu tenho jogado com eles uma quantidade considerável de projetos de hobby. Minha abordagem preferida é usar algum tipo de linguagem lógica como Prolog para fazer afirmações e verificá-los. Você teria afirmações para onde o parque é, o que significa ter algo, o que um cão é, em seguida, você iria fazer uma regra muito bonito exatamente como o seu exemplo entre parênteses na parte inferior do seu post. Lamento o meu Prolog é muito enferrujado para dar-lhe um exemplo útil ... Eu tenho jogado com linguagens de inferência home-grown muito longo.

Existem Prolog intérpretes disponíveis para a incorporação na maioria dos idiomas, embora eu não tenho certeza sobre PHP5. Você pode jogar juntos algo simples que faz frente-encadeamento inferência sobre estruturas de dados regra de sua própria criação de modo bastante curto, se você não consegue encontrar um intérprete de Prolog. Você pode estar interessado nestes notas na inferência automatizada.

Outras dicas

Provavelmente esta resposta é muito trivial / óbvio para você, mas eu só pensava em como eu iria resolver algo parecido no meu atual projeto existente que é uma aplicação Zend Framework. Pensei nos usos Filter- e validatorChains ZF. Eu suponho que você tem um número finito de possíveis objetos de entrada, um número finito de condições / restrições e um número finito de ações. Nesse caso, você deve primeiro instanciar um objeto e executá-lo contra uma cadeia de condições (validadores), se todas as condições são satisfeitas de executar o objeto contra o actionChain. Aqui eu provavelmente teria de implementar algum tipo de sistema de acção prioritária uma vez que algumas ações devem ser realizadas antes de outros. Like 'envio de uma notificação' e depois 'delete' o objeto em questão. Assim, em ZF eu iria construir um validador personalizado para cada condição / restrição. Eu não acredito que o sistema Outlook é significado muito inteligente que eu não acho que os validadores são muito genéricos.

No db poderia haver uma tabela de regras reais, um para as condições e um para ações. Em seguida, poderia haver duas muitos-para-muitos quadros que ligam a regra com todas as condições e ações necessárias.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top