PHP:Движок правил стиля Outlook
-
11-07-2019 - |
Вопрос
Я пытаюсь построить основанную на правилах систему для интерпретации данных.Однако у меня возникают проблемы с выбором способа построения логики для хранения и интерпретации правил.
В настоящее время существует структура базы данных, которая довольно сложна, но будет касаться всех аспектов хранения данных правила.Идея заключается в том, что система сможет имитировать способ, которым MS Outlook позволяет пользователю добавлять правила.
Мои проблемы заключаются в следующем:
- Какой шаблон я должен использовать для хранения этих правил внутри объектов?
- Должен ли я использовать eval() или правильную ориентацию объекта для выполнения правил?
И примером правила может быть:
Собака должно быть, есть воротник в области парк
Где каждый элемент (собака, must have, ошейник, территория, парк) представляет собой отдельный элемент логики, подлежащий интерпретации.
Мы очень ценим любые общие советы по вышеуказанным вопросам!
Решение
Я никогда не внедрял систему, подобную описанной вами, в контексте "реального мира", но я много играл с ними в качестве хобби-проектов.Мой предпочтительный подход заключается в использовании какого-то логического языка, такого как Пролог делать утверждения и проверять их.У вас были бы утверждения о том, где находится парк, что значит что-то иметь, что такое собака, а затем вы бы составили правило, почти точно подобное вашему примеру в скобках внизу вашего поста.Мне жаль, что мой Пролог слишком устарел, чтобы привести вам полезный пример...Я слишком долго играл с доморощенными языками вывода.
Существуют интерпретаторы Prolog, доступные для встраивания на большинстве языков, хотя я не уверен насчет PHP5.Вы могли бы сколотить что-нибудь простое, что делает вывод с прямой цепочкой создайте структуры данных вашего собственного создания в довольно короткие сроки, если вы не можете найти интерпретатор Prolog.Возможно, вас заинтересуют эти Примечания об автоматическом выводе.
Другие советы
Возможно, этот ответ слишком тривиален / очевиден для вас, но я просто подумал, как бы решить что-то подобное в моем текущем существующем проекте, который является приложением Zend Framework. Я думал о фильтрах и валидаторах, которые использует ZF. Я предполагаю, что у вас есть конечное число возможных входных объектов, конечное число условий / ограничений и конечное число действий. В этом случае вы должны сначала создать экземпляр объекта и запустить его в цепочке условий (валидаторов), если все условия выполнены, вы запускаете объект против actionChain. Здесь я, вероятно, должен был бы внедрить какую-то систему приоритетов действий, поскольку некоторые действия должны выполняться раньше других. Например, «отправить уведомление», а затем «удалить» рассматриваемый объект. Так что в ZF я бы создал собственный валидатор для каждого условия / ограничения. Я не верю, что система Outlook очень умная, а это значит, что я не считаю валидаторы очень общими.
В БД может быть таблица для фактических правил, одна для условий и одна для действий. Тогда может быть две таблицы «многие ко многим», связывающие правило со всеми необходимыми условиями и действиями.