Правила Двигатель - за и против

Я проверяю проект, который использует так называемый Rules Engine. Короче говоря, это способ экстернализации бизнес-логики из кода приложения.

Эта концепция для меня совершенно новая, и я довольно скептически отношусь к ней. После того, как в течение последних нескольких лет люди говорили о писал об использовании механизма правил.

Ответ 1

Большинство двигателей правил, которые я видел, рассматриваются системным кодом как черный ящик. Если бы я должен был создать модель домена, я бы, вероятно, хотел бы, чтобы определенные бизнес-правила были неотъемлемой частью модели домена, например. бизнес-правила, которые говорят мне, когда объект имеет недопустимые значения. Это позволяет нескольким системам совместно использовать модель домена без дублирования бизнес-логики. Я мог бы использовать для каждой системы одну и ту же службу правил для проверки моей модели домена, но это, по-видимому, ослабляет мою модель домена (как было указано в вопросе). Зачем? Потому что вместо того, чтобы постоянно применять мои бизнес-правила во всех системах во все времена, я полагаюсь на системных программистов, чтобы определить, когда бизнес-правила должны быть соблюдены (путем вызова службы правил). Это может быть не проблема, если модель домена подходит вам полностью заполненной, но может быть проблематичной, если вы имеете дело с пользовательским интерфейсом или системой, которая изменяет значения в модели домена за время ее существования.

Существует еще один класс бизнес-правил: принятие решений. Например, страховой компании может потребоваться классифицировать риск андеррайтинга заявителя и получить премию. Вы можете разместить эти типы бизнес-правил в своей модели домена, но централизованное решение для подобных сценариев, как правило, желательно и, фактически, хорошо вписывается в сервис-ориентированную архитектуру. Это вызывает вопрос о том, почему движок правила, а не системный код. Место, где механизм правил может быть лучшим выбором, - это когда бизнес-правила, ответственные за принятие решения, меняются со временем (как указывали некоторые другие ответы).

Механизмы правил обычно позволяют изменять правила без перезапуска системы или развертывания нового исполняемого кода (независимо от того, что promises вы получаете от поставщика, убедитесь, что вы проверяете свои изменения в непроизводственной среде, потому что, даже если механизм правил безупречен, люди все еще меняют правила). Если вы думаете: "Я могу это сделать, используя базу данных для хранения значений, которые меняются", вы правы. Механизм правил - это не волшебная коробка, которая делает что-то новое. Он предназначен для того, чтобы быть инструментом, который обеспечивает более высокий уровень абстракции, поэтому вы можете сосредоточиться на повторном использовании колеса. Многие поставщики делают это еще дальше, позволяя создавать шаблоны, чтобы бизнес-пользователи могли заполнять пробелы, а не изучать язык правил.

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

Ответ 2

Я думаю, что ваши опасения по поводу моделей анемичных доменов действительны.

Я видел два приложения известного коммерческого механизма правил Rete, работающего на производстве, где я работаю. Я считаю успех успешным, а другой неудачным.

Успешное приложение - это приложение дерева решений, состоящее из ~ 10 деревьев по 30 точек ветвления. У механизма правил есть пользовательский интерфейс, который позволяет деловым людям поддерживать правила.

Менее успешное приложение имеет ~ 3000 правил, захлопнутых в базу данных правил. Никто не знает, существуют ли противоречивые правила при добавлении нового. Существует мало понимания алгоритма Rete, и опыт работы с продуктом оставил фирму, поэтому он становится черным ящиком, неприкасаемым и невосприимчивым. На цикл развертывания по-прежнему влияют изменения правил - полный регрессионный тест должен выполняться при изменении правил. Память тоже была проблемой.

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

Я также беспокоюсь о том, что механизм правил становится узким местом в вашем приложении.

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

Ответ 3

Правило Двигатели могут предложить большую ценность в определенных случаях.

Во-первых, многие механизмы правил работают более декларативно. Очень грубым примером будет AWK, где вы можете назначать регулярные выражения блокам кода. Когда регулярное выражение рассматривается файловым сканером, выполняется блок кода.

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

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

Например, Фрэнку интересны заказы на сумму более 1000 долларов, поэтому он вставляет в систему правил, которую ему интересно. "IF order.total > 1000 THEN email Frank".

Между тем, Салли хочет все заказы с западного побережья: "IF order.source ==" WEST_COAST "THEN email Sally".

Итак, вы можете видеть в этом тривиальном, надуманном случае, что порядок может удовлетворять обоим правилам, но оба правила не зависят друг от друга. Приказ от 1200 долларов с Западного побережья уведомляет Франка и Салли. Когда Фрэнка больше не беспокоит, он просто выдержит свое исключение из супа.

Для многих ситуаций эта гибкость может быть очень мощной. Он также может, как и этот случай, быть доступен для конечных пользователей для простых правил. Использование выражений высокого уровня и, возможно, легкий сценарий.

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

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

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

Ответ 4

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

Кроме того, вы не можете недооценивать значение при удалении цикла перекомпилирования-повторного повторного развертывания, которое может быть результатом простого изменения правила, если правила встроены в код. Часто бывает несколько команд, которые участвуют в благословении сборки, и использование механизма правил может сделать многое из этого ненужным.

Ответ 5

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

Кон, что некоторые программисты не любят многому учиться. Механизмы правил и правила, которые вы вставляете в них, вместе с материалом, который их реализует, могут быть немного волосатыми. Хотя хорошая система может легко обращаться с больными и скрученными сетями логики (или нелогичными часто), это не так просто, как кодирование множества операторов if (независимо от того, что делают некоторые из простых движков правил). Механизм правил предоставляет вам инструменты для обработки отношений правил, но вы все равно должны иметь возможность представить все это в своем уме. Иногда ему нравится жить в фильме "Бразилия".:)

Ответ 6

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

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

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

Ответ 7

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

Ответ 8

", но действительно, сколько приложений действительно имеет много изменений?"

Честно говоря, каждое приложение, над которым я работал, пережило серьезный рабочий процесс и/или логические изменения от концепции до нужной после развертывания. Это главная причина для программирования "обслуживания"...

Реальность такова, что вы не можете думать обо всем впереди, отсюда и причина Agile-процессов. Кроме того, БА всегда, кажется, пропустил что-то жизненно важное, пока оно не обнаружилось при тестировании.

Правило Двигатели заставляют вас по-настоящему отделить бизнес-логику от представления и хранения. Кроме того, если вы используете правый движок, ваш BA может добавлять и удалять логику по мере необходимости. Как сказал Крис Марасти-Георг, это ставит бремя на БА. Но более того, он позволяет BA получить именно то, что они просят.

Ответ 9

Механизм правил - это выигрыш в настраиваемом приложении, в котором вы не хотите выполнять пользовательские сборки, если этого можно избежать. Они также хорошо централизуют большие основы правил и алгоритмов, таких как Rete эффективны для быстрого сопоставления с большими наборами правил.

Ответ 10

Уже много хороших ответов, но хотелось добавить пару вещей:

  • при автоматизации решения любой сложности критическая вещь быстро становится вашей способностью управлять, а не выполнять задействованную логику. Механизм правил не поможет в этом - вам нужно подумать о возможностях управления правилами, которые имеет система управления бизнес-правилами. Большинство коммерческих и с открытым исходным кодом двигатели превратились в системы управления правилами с репозиториями, отчеты об использовании правил, управлении версиями и т.д. Репозиторий правил, структурированный в согласованные наборы правил, которые могут быть организованы для принятия бизнес-решений, намного проще в управлении, чем тысячи строк кода или суп правило.
  • Существует много способов использования декларативного, основанного на правилах подхода. Использование правил для управления пользовательским интерфейсом или как часть процесса определения может быть очень эффективным. Однако наиболее ценным использованием подхода к правилам является автоматизация бизнес-решений и предоставление этого как слабосвязанных решений, которые принимают входные данные, выполняют правила и возвращают ответ - решение. Это относится к услугам, которые отвечают на вопросы других сервисов типа "является ли этот клиент хорошим кредитным риском" или "какой скидкой я должен дать этому клиенту для этого заказа" или "что лучший крест продает для этого клиента в это время. Эти решения могут быть очень эффективно построены с использованием системы управления правилами и позволяют с легкостью интегрировать аналитику с течением времени, от чего выиграют многие решения.

Ответ 11

Я вижу, что механизмы управления правилами, процессами и данными (базы данных a.k.a.) по существу похожи. Но по какой-то причине мы никогда не говорим о том, что черная копия подсистемы сохранения является плохим.

Во-вторых, из моего POV, анемичная модель не является тем, что является легким в внедрении поведения, оно является легким в поведением. Фактический метод, описывающий доступное поведение в объекте модели домена, не должен выполняться самим объектом.

Ответ 12

Самая большая сложность моего опыта в Rule Engines заключается в следующем:

  • от OOP POV это настоящая боль для рефакторинга и правил тестирования, написанных на декларативном языке, в то время как вы рефакторинг кода, который влияет на них.
  • Часто мы всегда должны думать о порядке выполнения правил, который превращается в беспорядок, когда их много.
  • Некоторые незначительные изменения могут вызвать неправильное поведение правил, приводящих к ошибкам производства. На практике не всегда возможно охватить все случаи испытания спереди.
  • Правила, изменяющие объекты, используемые в других, также увеличивают сложность, заставляя разработчиков разбивать их на этапы.