如何在5分钟内上手RuleBook?从Hello World到实际业务规则的完整指南
如何在5分钟内上手RuleBook?从Hello World到实际业务规则的完整指南
【免费下载链接】rulebook100% Java, Lambda Enabled, Lightweight Rules Engine with a Simple and Intuitive DSL项目地址: https://gitcode.com/gh_mirrors/ru/rulebook
你是否厌倦了代码中充斥着复杂的if/else语句?是否需要一个优雅的规则引擎来简化业务逻辑?RuleBook正是你寻找的解决方案!作为一款100%纯Java开发的轻量级规则引擎,它提供了简单直观的DSL(领域特定语言),支持Lambda表达式,让规则定义变得前所未有的简单。本指南将带你从Hello World开始,快速掌握RuleBook的核心用法,并应用到实际业务场景中。
🚀 RuleBook规则引擎:为什么选择它?
RuleBook的设计理念完全符合Java开发者的思维方式:用Java代码编写规则,按期望的顺序执行。它提供了两种规则定义方式:
- Lambda DSL- 使用流畅的API和Lambda表达式
- POJO注解- 使用简单的Java对象和注解
无论你是新手还是有经验的开发者,都能在5分钟内掌握RuleBook的基本用法。让我们从最简单的Hello World开始吧!
📦 快速开始:安装RuleBook
在你的项目中添加RuleBook非常简单。如果你使用Maven:
<dependency> <groupId>com.deliveredtechnologies</groupId> <artifactId>rulebook-core</artifactId> <version>0.12</version> </dependency>如果你使用Gradle:
compile 'com.deliveredtechnologies:rulebook-core:0.12'或者直接从源码构建:
git clone https://gitcode.com/gh_mirrors/ru/rulebook cd rulebook ./gradlew build🎯 第一步:Hello World示例
让我们从一个最简单的例子开始。在RuleBook中,创建一个规则就像写一段自然的Java代码:
RuleBook ruleBook = RuleBookBuilder.create() .addRule(rule -> rule.withNoSpecifiedFactType() .then(f -> System.out.print("Hello ")) .then(f -> System.out.println("World"))) .build(); ruleBook.run(new FactMap());这段代码会输出"Hello World"。是不是很简单?RuleBook使用流畅的API,让你可以像写句子一样定义规则。
🔧 使用Facts(事实)的Hello World
在实际应用中,我们通常需要处理数据。RuleBook使用"Facts"(事实)来传递数据:
RuleBook ruleBook = RuleBookBuilder.create() .addRule(rule -> rule.withFactType(String.class) .when(f -> f.containsKey("hello")) .using("hello") .then(System.out::print)) .addRule(rule -> rule.withFactType(String.class) .when(f -> f.containsKey("world")) .using("world") .then(System.out::println)) .build(); NameValueReferableMap factMap = new FactMap(); factMap.setValue("hello", "Hello "); factMap.setValue("world", "World"); ruleBook.run(factMap);💼 实际业务场景:贷款审批系统
让我们看一个真实的业务场景。假设我们为一家银行开发贷款审批系统,需要根据申请人的信用评分、现金储备和首次购房者状态来计算贷款利率。
定义数据模型
首先,我们创建一个申请人数据模型:
public class ApplicantBean { private int creditScore; // 信用评分 private double cashOnHand; // 现金储备 private boolean firstTimeHomeBuyer; // 是否首次购房 // 构造函数、getter和setter }创建贷款规则手册
现在,让我们用RuleBook定义贷款审批规则:
public class HomeLoanRateRuleBook extends CoRRuleBook<Double> { @Override public void defineRules() { // 信用评分低于600,利率增加4倍 addRule(RuleBuilder.create().withFactType(ApplicantBean.class).withResultType(Double.class) .when(facts -> facts.getOne().getCreditScore() < 600) .then((facts, result) -> result.setValue(result.getValue() * 4)) .stop() .build()); // 信用评分600-700,利率增加1个点 addRule(RuleBuilder.create().withFactType(ApplicantBean.class).withResultType(Double.class) .when(facts -> facts.getOne().getCreditScore() < 700) .then((facts, result) -> result.setValue(result.getValue() + 1)) .build()); // 信用评分≥700且现金≥$25,000,利率减少0.25点 addRule(RuleBuilder.create().withFactType(ApplicantBean.class).withResultType(Double.class) .when(facts -> facts.getOne().getCreditScore() >= 700 && facts.getOne().getCashOnHand() >= 25000) .then((facts, result) -> result.setValue(result.getValue() - 0.25)) .build()); // 首次购房者享受20%折扣(信用评分≥600) addRule(RuleBuilder.create().withFactType(ApplicantBean.class).withResultType(Double.class) .when(facts -> facts.getOne().isFirstTimeHomeBuyer()) .then((facts, result) -> result.setValue(result.getValue() * 0.80)) .build()); } }使用规则手册
public class ExampleSolution { public static void main(String[] args) { RuleBook homeLoanRateRuleBook = RuleBookBuilder.create(HomeLoanRateRuleBook.class) .withResultType(Double.class) .withDefaultResult(4.5) // 基础利率4.5% .build(); NameValueReferableMap facts = new FactMap(); facts.setValue("applicant", new ApplicantBean(650, 20000.0, true)); homeLoanRateRuleBook.run(facts); homeLoanRateRuleBook.getResult().ifPresent(result -> System.out.println("申请人获得利率: " + result)); } }🏗️ RuleBook的核心概念
1. Given-When-Then模式
RuleBook采用BDD(行为驱动开发)中的Given-When-Then模式:
- Given- 提供事实(Facts)
- When- 条件判断(返回true/false)
- Then- 执行动作
2. 规则链行为
RuleBook支持三种规则链行为:
| 行为类型 | 描述 |
|---|---|
| CONTINUE_ON_FAILURE | 默认行为,规则失败时继续执行 |
| ERROR_ON_FAILURE | 规则失败时抛出异常并停止 |
| STOP_ON_FAILURE | 规则失败时停止执行链 |
3. 审计功能
RuleBook提供内置的规则审计功能:
RuleBook rulebook = RuleBookBuilder.create().asAuditor() .addRule(rule -> rule.withName("规则1").withNoSpecifiedFactType() .when(f -> true) .then(f -> { })) .addRule(rule -> rule.withName("规则2").withNoSpecifiedFactType() .when(f -> false) .then(f -> { })) .build(); rulebook.run(new FactMap()); Auditor auditor = (Auditor)rulebook; System.out.println(auditor.getRuleStatus("规则1")); // 输出: EXECUTED System.out.println(auditor.getRuleStatus("规则2")); // 输出: SKIPPED🎨 POJO规则:更简洁的方式
如果你更喜欢使用注解,RuleBook支持POJO规则:
@Rule(order = 1) public class LowCreditScoreRule { @Given private List<ApplicantBean> applicants; @Result private double rate; @When public boolean when() { return applicants.stream() .allMatch(applicant -> applicant.getCreditScore() < 600); } @Then public RuleState then() { rate *= 4; return RuleState.BREAK; } }使用POJO规则更加简洁:
RuleBookRunner ruleBook = new RuleBookRunner("com.example.rulebook.megabank"); ruleBook.setDefaultResult(4.5); ruleBook.run(facts); ruleBook.getResult().ifPresent(System.out::println);🌱 Spring集成
RuleBook与Spring框架完美集成:
- 添加Spring支持依赖
- 使用
@RuleBean注解标记规则类 - 在规则中注入Spring组件
@RuleBean @Rule(order = 1) public class HelloSpringRule { @Autowired HelloWorldComponent helloWorldComponent; @Given("hello") private String hello; @Result private String result; @When public boolean when() { return hello != null; } @Then public void then() { result = helloWorldComponent.getHelloWorld(result, world); } }📊 RuleBook的优势总结
- 简单直观- 使用Java开发者熟悉的语法
- 类型安全- 编译时类型检查
- 线程安全- RuleBook实例可在多线程环境中安全使用
- 轻量级- 无复杂依赖,易于集成
- 灵活- 支持Lambda DSL和POJO注解两种方式
- 可扩展- 易于与Spring等框架集成
🚀 下一步行动建议
- 从简单开始- 先用Lambda DSL创建几个简单规则
- 尝试POJO规则- 体验注解方式的简洁性
- 集成到现有项目- 将复杂的if/else逻辑迁移到RuleBook
- 探索高级特性- 尝试规则审计、Spring集成等功能
RuleBook的官方文档位于docs/official.md,其中包含更多详细信息和高级用法。AI功能源码位于plugins/ai/目录中。
💡 最佳实践
- 保持规则单一职责- 每个规则只做一件事
- 合理命名规则- 便于理解和维护
- 使用FactMap传递数据- 避免直接修改原始对象
- 利用规则链顺序- 合理安排规则执行顺序
- 启用审计功能- 便于调试和监控
现在你已经掌握了RuleBook的核心概念!从简单的Hello World到复杂的业务规则,RuleBook都能优雅地处理。开始重构你的if/else逻辑,让代码更加清晰、可维护吧!
记住:好的规则引擎应该让复杂的事情变简单,而不是让简单的事情变复杂。RuleBook正是这样的工具!✨
【免费下载链接】rulebook100% Java, Lambda Enabled, Lightweight Rules Engine with a Simple and Intuitive DSL项目地址: https://gitcode.com/gh_mirrors/ru/rulebook
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
