Первоначально я написал этот пост в блоге нашей компании, и я решил поделиться им здесь, как моя первая статья. Этот раздел посвящен экстернализации логики приложения с помощью подхода бизнес-правил с использованием механизма бизнес-правил Drools.
Корпоративные приложения обычно состоят из нескольких слоев. В первую очередь уровень представления, уровень бизнес-логики и уровень постоянства. Слой бизнес-логики считается сердцем этих слоев, и именно здесь происходят все процессы и решения. Требования к этому уровню также изменяются чаще, чем остальная часть приложения. Поскольку требования продолжают изменяться, для кода на этом уровне очень легко запутаться в ситуации, известной как «код спагетти», множество вложенных условий if-else и по мере добавления новых условий ухудшается читаемость. Кроме того, чтобы изменить поведение системы, необходимо выполнить перекомпиляцию и перестройку.
Эта статья призвана представить подход бизнес-правил , методологию разработки, при которой правила, решения и процессы используются, но не обязательно должны быть встроены в системы управления бизнес-процессами. Вы познакомитесь с этой методологией благодаря использованию механизма бизнес-правил — JBoss Drools Expert , части платформы интеграции бизнес-логики JBoss.
Что такое бизнес-правила?
Бизнес-правило — это просто утверждение, которое определяет или ограничивает некоторые аспекты бизнеса. Бизнес-правила всегда разрешаются в true или false. Бизнес-правило также может быть определено как абстракция политики и практики бизнес-организации.
Пример:
- У клиента может быть несколько бронирований, но одновременно можно арендовать только один автомобиль. (Прокат автомобилей)
- Когда регистрация идет из страны, указанной в списке запрещенных стран, отклоните регистрацию. (Регистрация сайта PTC)
Что такое механизм правил?
Механизм бизнес-правил — это сердце технологии, лежащей в основе подхода бизнес-правил. Это система, которая оценивает и выполняет одно или несколько бизнес-правил в производственной системе времени выполнения на основе известных фактов (моделей предметной области).
Зачем использовать механизм правил?
- Логика и разделение данных — ваши данные находятся в объектах вашего домена, логика в правилах.
- Скорость и масштабируемость — механизм бизнес-правил использует дизайн алгоритмов для эффективного сопоставления шаблонов правил с объектами вашего домена, например, с алгоритмом повторного использования, который используется в Drools Expert. Также с точки зрения масштабируемости правила могут совместно использоваться в различных системах, что позволяет нам создавать или интегрировать подсистемы, которые используют некоторые правила, используемые другими подсистемами.
- Централизация знаний — поскольку логика выводится в виде правил, существует только один источник истины, а это ваше хранилище правил / знаний (база знаний).
- Средство объяснения — системы правил эффективно предоставляют «средство объяснения», позволяя регистрировать решения, принятые механизмом правил, а также причины их принятия.
- Понятные правила — в Drools Expert правила могут быть написаны с использованием DSL (домен-специфических языков), позволяющих нетехническим экспертам в области писать правила, близкие к естественному языку.
Типовые правила
Рисунок 1: Пример файла правил Drools
Правило сообщения Hello и правила сообщения Goodbye. Мы можем прочитать эти правила следующим образом:
- Hello Message Rule — «Когда статус объекта Message — HELLO, отобразите атрибут сообщения объекта Message и измените его сообщение и статус на« Goodbye Cruel World »и GOODBYE соответственно».
- Правило Goodbye Message — «Когда статус объекта Message -« GOODBYE », отобразите атрибут сообщения объекта Message».
Сделайте свои приложения управляемыми правилами
Drools Expert — это подпроект платформы интеграции бизнес-логики JBoss, и это механизм бизнес-правил, который мы будем использовать в этом посте. Чтобы сделать ваши приложения управляемыми правилами с помощью Drools Expert, вам необходимо сначала понять следующие важные понятия:
- Факты — факты — это просто ваши доменные объекты / модели. Правила запускаются против этих фактов, чтобы сопоставить условия, объявленные в правилах, с состоянием факта, который используется в настоящее время, и это определяет правило / правила для выполнения.
- Правило — правило — это утверждение, которое проверяет условие на факт и состоит из 3 важных разделов:
- Имя — название правила
- LHS (Условие) — это раздел «когда» (см. Выше). В этом разделе объявляется условие, которое будет проверять правило.
- RHS (Последствие / Действие — это раздел «тогда» (см. Выше). В этом разделе объявляются последствия или действие, которое должно выполняться при выполнении условия, объявленного в разделе «когда».
- База знаний — хранилище правил / знаний
- Сеанс знаний — сеанс — это установленное взаимодействие между вашим приложением и механизмом правил. Сеанс создается из базы знаний и может быть без сохранения состояния или с сохранением состояния. Приложение использует установленный сеанс для запуска движка против вставленных фактов.
Пример кода:
package com.ideyatech.drools; import org.drools.KnowledgeBase; import org.drools.KnowledgeBaseFactory; import org.drools.builder.KnowledgeBuilder; import org.drools.builder.KnowledgeBuilderFactory; import org.drools.builder.ResourceType; import org.drools.io.ResourceFactory; import org.drools.runtime.StatelessKnowledgeSession; import com.ideyatech.drools.bean.Message; public class Main { public static void main(String[] args) { final KnowledgeBase knowledgeBase = createKnowledgeBase(); final StatelessKnowledgeSession session = knowledgeBase.newStatelessKnowledgeSession(); try { final Message message = new Message(); message.setStatus(Message.HELLO); session.execute(message); }catch (Throwable e) { e.printStackTrace(); } } private static KnowledgeBase createKnowledgeBase() { final KnowledgeBuilder builder = createKnowledgeBuilder(); final KnowledgeBase knowledgeBase = KnowledgeBaseFactory .newKnowledgeBase(); knowledgeBase.addKnowledgePackages( builder.getKnowledgePackages()); return knowledgeBase; } private static KnowledgeBuilder createKnowledgeBuilder() { final KnowledgeBuilder builder = KnowledgeBuilderFactory.newKnowledgeBuilder(); final String rulePath = "com/ideyatech/drools/rule/hello-world-rule.drl"; builder.add(ResourceFactory.newClassPathResource( rulePath), ResourceType.DRL); if (builder.hasErrors()) { throw new RuntimeException(builder.getErrors().toString()); } return builder; } }
Объяснение кода:
- Приведенный выше код содержит два вспомогательных метода: createKnowledgeBuilder () и createKnowledgeBase ().
- Метод createKnowledgeBuilder () создает экземпляр KnowledgeBuilder, который отвечает за получение исходных файлов, таких как файлы .drl (Drools Rule), и превращение их в KnowledgePackage определений правил и процессов, которые может использовать база знаний.
- В этом методе мы добавили в KnowledgeBuilder файл правил «hello-world-rule.drl», который является ресурсом ClassPath. Обратите внимание, что правила также могут быть получены как ресурс File или URL-ресурс.
- Метод createKnowledgeBase () создает экземпляр KnowledgeBase, который является хранилищем всех определений знаний приложения. Этот метод использует createKnowledgeBuilder () и получает все пакеты знаний из созданного KnowledgeBuilder для использования созданной базой знаний.
- В основном методе после создания нашей базы знаний мы создали StatelessSession и затем попросили созданный сеанс выполнить все правила для объекта Message со статусом Hello.
Когда мы запускаем этот код, это дает следующий результат:
Человекочитаемые правила с использованием DSL
В Drools правила также могут быть написаны в синтаксисе, близком к естественному языку (например, на английском). Это позволяет нетехническим экспертам в области разработки правил с использованием простых английских выражений и нескольких синтаксисов правил Drools, которые не требуют дополнительных технических знаний для понимания. В приведенном ниже примере показано простое правило, написанное в формате DSL.
Рисунок 2: Файл DSL
Рисунок 3: Файл DSLR
На рисунках выше у нас есть 2 файла; DSL и файл DSLR. Файл DSL содержит сопоставление условий и последствий, используемых в файле DSLR. Например, условие DSL «Есть клиент с firstName {имя}» сопоставляется с «$ customer: Customer (firstName == {name})». Это отображение / перевод просто говорит движку, как интерпретировать правило, записанное в файле DSLR.
Вывод
Действительно, используя механизм бизнес-правил и позволяя бизнес-правилам управлять нашими приложениями, мы можем повысить гибкость разработки, повысить удобство сопровождения программного обеспечения и значительно упростить решение возникающих требований. Однако также учтите, что, внедрив механизм бизнес-правил в свои приложения, вы также добавите еще один уровень сложности к своей архитектуре приложений. Использование механизма бизнес-правил следует рассматривать, когда нам необходимо создать подключаемые системы, экспертные системы или когда потребность в постоянно меняющихся требованиях очень высока. Для требований приложений средней сложности может быть достаточно стандартного подхода встраивания логики через императивный язык программирования.