Перейти к основному содержимому

Список механизмов правил в Java

· 4 мин. чтения

1. Обзор

В этой статье мы рассмотрим некоторые из самых популярных механизмов правил для Java.

В критически важных приложениях процесс поддержки бизнес-логики в исходном коде может стать слишком сложным. Бизнес-правила можно использовать для облегчения разработки и обслуживания путем отделения бизнес-логики от исходного кода.

В мире Java большинство библиотек механизмов правил реализуют стандарт JSR94, известный как Java Rule API Engine .

2. Слюни

Drools — это решение для системы управления бизнес-правилами (BRMS). Drools можно интегрировать с jBPM, инструментом управления бизнес-процессами для стандартизации процессов, событий, задач и т. д.

Если вы хотите узнать больше, введение в Drools доступно здесь , а также статья об интеграции со Spring .

3. Планшеты OpenL

OpenL Tablets — это система управления бизнес-правилами и механизм бизнес-правил, основанный на таблицах решений Excel. Поскольку формат таблиц, используемый этой структурой, знаком бизнес-пользователям, он устраняет разрыв между бизнес-пользователями и разработчиками.

Вот простой пример того, как работает структура с использованием файла Excel, содержащего таблицы решений. Во-первых, давайте импортируем его зависимости, которые полагаются на модули org.openl.core и org.openl.rules :

<dependency>
<groupId>org.openl</groupId>
<artifactId>org.openl.core</artifactId>
<version>5.19.4</version>
</dependency>
<dependency>
<groupId>org.openl.rules</groupId>
<artifactId>org.openl.rules</artifactId>
<version>5.19.4</version>
</dependency>

Теперь пользователь POJO:

public class User {
private String name;
// getters and setters
}

И перечисление, которое будет представлять результат примененных правил:

public enum Greeting {
// ...
}

Класс Case оборачивает объект User переменными, которые приводят к результатам:

public class Case {
// Variables to infer outcomes
// getters and setters
}

Интерфейс IRule содержит правило, введенное файлом Excel:

public interface IRule {
void helloUser(Case aCase, final Response response);
}

Класс Response обрабатывает возврат примененного правила:

public class Response {
private String result;
private Map<String, String> map = new HashMap<>();
}

Основной класс, запускающий выполнение правила:

public class Main {
private IRule instance;

public static void main(String[] args) {
Main rules = new Main();
// setup user and case here
rules.process(aCase);
}

public void process(Case aCase) {
EngineFactory<IRule> engineFactory = new RulesEngineFactory<IRule>(
getClass().getClassLoader()
.getResource("openltablets/HelloUser.xls"), IRule.class);
instance = engineFactory.newEngineInstance();
instance.helloUser(aCase, new Response());
}
}

4. Простые правила

Easy Rules — это простой механизм правил Java, предоставляющий легкую структуру на основе POJO для определения бизнеса. Он может создавать сложные правила из примитивных, используя составной шаблон.

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

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

Здесь мы приводим пример «Hello, world». Давайте импортируем необходимые зависимости на основе модуля easy-rules-core :

<dependency>
<groupId>org.jeasy</groupId>
<artifactId>easy-rules-core</artifactId>
<version>3.0.0</version>
</dependency>

Далее мы создаем класс, определяющий правило:

@Rule(name = "Hello World rule", description = "Always say hello world")
public class HelloWorldRule {

@Condition
public boolean when() {
return true;
}

@Action
public void then() throws Exception {
System.out.println("hello world");
}
}

Наконец, мы создаем основной класс:

public class Launcher {
public static void main(String... args) {
// create facts
Facts facts = new Facts();

// create rules
Rules rules = new Rules();
rules.register(new HelloWorldRule());

// create a rules engine and fire rules on known facts
RulesEngine rulesEngine = new DefaultRulesEngine();
rulesEngine.fire(rules, facts);
}
}

5. Книга правил

RuleBook — это платформа Java, которая использует лямбда-выражения Java 8 и шаблон цепочки ответственности для определения правил с использованием простого подхода BDD.

Как и большинство механизмов правил, RuleBook использует концепцию « фактов », то есть данных, предоставляемых правилам. RuleBook позволяет правилам изменять состояние фактов, которые затем могут быть прочитаны и изменены правилами, расположенными дальше по цепочке. Для тех правил, которые считывают данные ( Facts ) одного типа и выводят результат другого типа, в RuleBook есть Decisions .

RuleBook можно интегрировать с Spring с помощью Java DSL.

Здесь мы приводим простой пример «Hello, world» с использованием RuleBook. Давайте добавим его зависимость, которая зависит от модуля rulebook-core :

<dependency>
<groupId>com.deliveredtechnologies</groupId>
<artifactId>rulebook-core</artifactId>
<version>0.6.2</version>
</dependency>

Теперь создадим правило:

public class HelloWorldRule {
public RuleBook<Object> defineHelloWorldRules() {
return RuleBookBuilder
.create()
.addRule(rule -> rule.withNoSpecifiedFactType()
.then(f -> System.out.print("Hello ")))
.addRule(rule -> rule.withNoSpecifiedFactType()
.then(f -> System.out.println("World")))
.build();
}
}

Наконец, основной класс:

public static void main(String[] args) {
HelloWorldRule ruleBook = new HelloWorldRule();
ruleBook
.defineHelloWorldRules()
.run(new FactMap<>());
}

6. Заключение

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

Как всегда, примеры из этой статьи доступны в нашем репозитории GitHub .