Модуль правил для.NET.

У нас есть бизнес-требование, позволяющее властным пользователям изменять правила ставок страхования и зачисления. Нам нужен веб-сайт ui, который позволяет им сказать: "Этот продукт предназначен только для людей <55, если они не из Техаса и не владеют пуделем" или что-то еще. Изменить для уточнения: Страхование безумное. Правила отличаются от продукта к продукту, состояния и состояния постоянно меняются.

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

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

Разве мы орешки, чтобы изобретать это колесо?

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

Ответ 6

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

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

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

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

Ответ 7

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

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