Движок правил для .NET - PullRequest
       3

Движок правил для .NET

24 голосов
/ 22 сентября 2011

У нас есть бизнес-требование, чтобы позволить опытным пользователям редактировать правила для страховых тарифов и регистрации. Нам нужен веб-интерфейс, который позволит им сказать, что «этот продукт предназначен только для людей <55, если они не из Техаса и не имеют пуделя» или что-то еще. Редактировать для уточнения: Страхование безумно. Правила различаются в зависимости от продукта, от состояния к состоянию и постоянно меняются. </p>

Мы рассмотрели пару движков правил, но коммерческие из них 100К +, а с открытым исходным кодом, похоже, не закончены. Рабочий процесс Windows работает, если мы создаем правила заранее, но для их создания во время выполнения требуется обход безопасности доступа к коду. Это страшно.

Мы сумасшедшие, чтобы изобрести это колесо? Есть ли лучшая альтернатива для .net?

Ответы [ 7 ]

10 голосов
/ 22 сентября 2011

Я думаю, что, как и большинство решений «сделай против покупки», это всегда компромисс, который ты должен принять лично.Если вы покупаете готовое решение, которое стоит 100K +, и вы собираетесь использовать только 1% его, то это, вероятно, некоторые деньги, неразумно потраченные.Однако, если продукт идеально подходит, тогда вы можете быть почти уверены, что никогда не сможете создать его за меньшие деньги (при условии, что у них большой опыт в этой конкретной области).

Так что нет, вы не сошли с ума, изобретая это колесо, если вы не пытаетесь делать все, что делает продукт с полки, и просто сосредоточиться на конкретной функциональности, которая вам нужна, и не поддаться искушениюИдея построить очень хороший (но дорогой) фреймворк для чего-то очень простого.

9 голосов
/ 22 сентября 2011

Я не думаю, что оценка правил будет проблемой. Я думаю, что большая проблема состоит в разборе правил, которые может ввести пользователь. Для разбора правил вы должны рассмотреть возможность создания некоторого DSL. У Мартина Фаулера есть некоторые мысли об этом здесь . Тогда, может быть, ANTLR , тогда стоит посмотреть.

Что касается оценки: я работаю в финансовой сфере, и есть также сложные правила, но мне никогда не приходилось использовать механизм правил. Средства императивного языка программирования (в моем случае C #) были (до сих пор) достаточными. В некоторых случаях я рассматривал механизм правил, но технологические риски (*) механизма правил всегда были выше ожидаемых преимуществ. Правила (до сих пор) никогда не были настолько сложными, что требовалась декларативная модель программирования.

Если вы используете объектно-ориентированный язык, вы можете попробовать применить Specification Pattern . Эрик Эванс и Мартин Фаулер написали более подробное объяснение, которое вы можете найти здесь . В качестве альтернативы вы можете написать свой собственный простой механизм правил.

(*) Сноска. Каким-то образом вам потребуется встроить механизм правил в ваше приложение, которое, скорее всего, написано на каком-либо объектно-ориентированном языке. Таким образом, есть некоторые технологические границы, которые вы должны преодолеть. Каждый такой мост - технологический риск. Однажды я был свидетелем того, как веб-приложение на Java использовало механизм правил, написанный на C. Вначале программа на C иногда создавала дампы ядра и уничтожала все веб-приложение.

3 голосов
/ 22 сентября 2011

100K - это не смена чепухи, но достойный программист в течение года почти наверняка будет стоить дороже - у вас есть более дешевый программист, который может сделать это быстрее, чем год? это будет так же хорошо (для ваших нужд) или лучше?

2 голосов
/ 11 октября 2011

Это не совсем моя сфера, я пришел к этому вопросу случайно, поэтому я могу уйти, но я посмотрю на Wolfram Mathematica . Это техническая вычислительная среда и многопарадигмальный (проприетарный) язык программирования, поддерживающий множество стилей программирования (включая основанное на правилах и функциональное программирование). Он имеет в своей основе очень общий механизм правил. Несмотря на название и репутацию математического программного обеспечения (которое оно есть), это язык программирования общего назначения, очень высокого уровня. Его подмножество может быть скомпилировано в C. Он может динамически загружать внешние библиотеки и прозрачно взаимодействует с платформами Java и .Net. У него есть веб-версия - webMathematica (которая, однако, основана на Java, jsp + Tomcat, но никто не мешает вам напрямую взаимодействовать с вашим веб-слоем на основе .Net, просто еще немного работы). Дополнительным преимуществом является то, что, если вам когда-нибудь понадобятся какие-либо математические вычисления, анализ, графики, статистика, все это есть, и состояние дел.

Я думаю, что разработка Mathematica должна быть намного быстрее, чем во многих других языках / решениях (я профессионально программирую на Mathematica, C, Java и Javascript, поэтому могу хотя бы сравнить эти языки). Я думаю, что полная коммерческая лицензия должна составлять 2 или 3 К для одной машины (4 ядра). Он имеет несколько функций распараллеливания. Самым сложным в этом подходе было бы найти компетентного программиста Mathematica, но тот, кто имеет опыт работы в программировании на основе функциональных / правил (скажем, LISP / Prolog), должен уметь довольно быстро улавливать вещи. Кроме того, он может быть недостаточно быстрым, если вам нужна очень высокая производительность - я действительно не знаю, как он сравнивается с точки зрения производительности с другими механизмами правил. В некоторых случаях у меня была возможность сравнить в Mathematica решение на основе правил для какой-то проблемы с решением, скомпилированным для C, и я бы сказал, что хорошо написанный код на основе правил должен быть на уровне Python с точки зрения производительности, и в среднем, возможно, на один порядок или около того медленнее, чем тот, который скомпилирован для C. Но это было в основном для задач, связанных с числовыми / вычислительными задачами или манипуляциями с данными, поэтому я бы подумал, что для проблем, изначально связанных с правилами, разрыв в производительности быть меньше.

Одна вещь, в которой я уверен, это то, что в Mathematica вы можете создавать наборы правил любой общности и сложности довольно легко с небольшим количеством кода. Это лучший инструмент для исследовательского программирования, основанный на правилах, с которыми я сталкивался до сих пор, с очень коротким циклом разработки. Я приглашаю вас посетить тег Mathematica здесь, в SO, чтобы увидеть, какие типы проблем люди решают с его помощью. Для одного известного проекта, написанного полностью на языке Mathematica (15 миллионов строк кода), проверьте WolframAlpha двигатель знаний.

1 голос
/ 22 сентября 2011

Есть ли лучшая альтернатива для .net?

Одним из вариантов является использование встроенного механизма сценариев внутри вашего кода .net, например Iron Python. Предоставьте своим пользователям графический интерфейс для создания правил, конвертируйте «правило» в сценарий Python, вызовите механизм сценариев Python внутри .Net для выполнения сценария.

Мы сумасшедшие, чтобы заново изобрести это колесо?

Если с полки ничего не отвечает вашим потребностям, тогда нет.

0 голосов
/ 26 сентября 2011

Написание собственного движка работает, если ваши правила просты.Чем сложнее они становятся, тем больше времени потребуется для их обслуживания.

Вы можете использовать Drools Server для выполнения ваших правил и при этом выполнять свое основное приложение на .NET или на любом другом языке, который вам нравится.Вам все еще нужна Java для серверной части Drools.

0 голосов
/ 22 сентября 2011

Проблема в том, что эти вещи так тесно связаны с тем, как уникально работает бизнес, трудно, если не невозможно, эффективно использовать готовое решение.

Я сделал что-то вроде этого двумя разными способами.

Самым последним (в VS 2005 / Framework 2.0) было создание базового механизма, который обрабатывал бы общие минимальные требования, которые будутдело по всем направлениям.Это могут быть такие вещи, как имя, адрес и т. Д. Затем я написал ряд расширенных библиотек DLL, в которых используются общие интерфейсы, которые будут загружаться с помощью отражения для конкретных типов / регионов, например, по состоянию или линейке продуктов.Опытные пользователи могут использовать простое приложение для создания необходимой конфигурации учетной записи (конфигурации хранятся в БД).Если что-то изменилось, базовая DLL может быть изменена или добавлена ​​новая.Я только должен был добавить одну новую DLL расширения в течение 4 лет, когда я был в этом проекте, но обычно правилам требовался один или два небольших мода в месяц.

В более раннем проекте VB6 я использовал управляемыйVBScript, чтобы предоставить опытным пользователям возможность кодировать определенные правила.Хотя пользователи хорошо знали сценарии Excel и был написан интерфейс мастера, чтобы помочь им делать то, что им нужно было делать, они обычно давали мне работу по написанию правил.Этот план дал о себе знать, поэтому я не использовал его позже, а вместо этого выбрал более подход «проверь это, выбери» в построении правил.

...