feat: add rule engine design pattern#3548
Conversation
Add an educational rule-engine module demonstrating the Rule Engine pattern. Each business rule is an independent object exposing evaluate (decision) and execute (action); a RuleEngine evaluates a collection of rules against an immutable loan-application context in insertion order, runs the passing rules, and reports every passed and failed rule via an immutable RuleEngineResult. Includes three concrete rules, an App demo, unit tests, README, and class diagram.
PR SummaryCloses #1219. Added a new
Changes
autogenerated by presubmit.ai |
There was a problem hiding this comment.
🚨 Pull request needs attention.
Review Summary
Commits Considered (1)
- 1e959a1: feat: add rule engine design pattern
Add an educational rule-engine module demonstrating the Rule Engine
pattern. Each business rule is an independent object exposing evaluate
(decision) and execute (action); a RuleEngine evaluates a collection of
rules against an immutable loan-application context in insertion order,
runs the passing rules, and reports every passed and failed rule via an
immutable RuleEngineResult. Includes three concrete rules, an App demo,
unit tests, README, and class diagram.
Files Processed (16)
- pom.xml (1 hunk)
- rule-engine/README.md (1 hunk)
- rule-engine/etc/rule-engine.urm.puml (1 hunk)
- rule-engine/pom.xml (1 hunk)
- rule-engine/src/main/java/com/iluwatar/ruleengine/App.java (1 hunk)
- rule-engine/src/main/java/com/iluwatar/ruleengine/CreditScoreRule.java (1 hunk)
- rule-engine/src/main/java/com/iluwatar/ruleengine/LoanApplication.java (1 hunk)
- rule-engine/src/main/java/com/iluwatar/ruleengine/MinimumAgeRule.java (1 hunk)
- rule-engine/src/main/java/com/iluwatar/ruleengine/MinimumIncomeRule.java (1 hunk)
- rule-engine/src/main/java/com/iluwatar/ruleengine/Rule.java (1 hunk)
- rule-engine/src/main/java/com/iluwatar/ruleengine/RuleEngine.java (1 hunk)
- rule-engine/src/main/java/com/iluwatar/ruleengine/RuleEngineResult.java (1 hunk)
- rule-engine/src/test/java/com/iluwatar/ruleengine/AppTest.java (1 hunk)
- rule-engine/src/test/java/com/iluwatar/ruleengine/LoanRulesTest.java (1 hunk)
- rule-engine/src/test/java/com/iluwatar/ruleengine/RuleEngineResultTest.java (1 hunk)
- rule-engine/src/test/java/com/iluwatar/ruleengine/RuleEngineTest.java (1 hunk)
Actionable Comments (4)
-
rule-engine/src/main/java/com/iluwatar/ruleengine/App.java [64-64]
best_practice: "Logger name mismatch with Lombok"
-
rule-engine/src/main/java/com/iluwatar/ruleengine/MinimumAgeRule.java [56-56]
best_practice: "Logger name mismatch in MinimumAgeRule.execute"
-
rule-engine/src/main/java/com/iluwatar/ruleengine/MinimumIncomeRule.java [56-60]
best_practice: "Logger name mismatch in MinimumIncomeRule.execute"
-
rule-engine/src/main/java/com/iluwatar/ruleengine/CreditScoreRule.java [56-60]
best_practice: "Logger name mismatch in CreditScoreRule.execute"
Skipped Comments (0)
|
|
||
| private static void report(RuleEngineResult result) { | ||
| if (result.approved()) { | ||
| LOGGER.info("Loan approved. Passed rules: {}", result.passedRules()); |
|
|
||
| @Override | ||
| public void execute(LoanApplication context) { | ||
| LOGGER.info("Applicant age {} meets the minimum age of {}.", context.age(), minimumAge); |
There was a problem hiding this comment.
Logger name mismatch in execute() for MinimumAgeRule. Replace LOGGER with log to align with @slf4j usage.
| LOGGER.info( | ||
| "Applicant income {} meets the minimum income of {}.", | ||
| context.monthlyIncome(), | ||
| minimumIncome); | ||
| } |
There was a problem hiding this comment.
Logger name mismatch across the multi-line execute() in MinimumIncomeRule. Replace LOGGER with log and maintain formatting.
| LOGGER.info( | ||
| "Applicant credit score {} meets the minimum score of {}.", | ||
| context.creditScore(), | ||
| minimumScore); | ||
| } |
There was a problem hiding this comment.
Logger name mismatch across the multi-line execute() in CreditScoreRule. Replace LOGGER with log to align with Lombok @slf4j usage.
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## master #3548 +/- ##
============================================
+ Coverage 83.24% 83.27% +0.02%
- Complexity 4025 4056 +31
============================================
Files 1060 1067 +7
Lines 14246 14306 +60
Branches 686 688 +2
============================================
+ Hits 11859 11913 +54
- Misses 2100 2108 +8
+ Partials 287 285 -2 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
HattoriHenzo
left a comment
There was a problem hiding this comment.
As a globale review, I would suggest you to organize your project into different package or module with the RuleEngine (Abstraction) and the rule implementation (Implementations).
Closes #1219
Adds a new
rule-enginemodule implementing the Rule Engine design pattern.Rule<T>abstraction separating evaluate (decision) from execute (action)RuleEngine<T>evaluates all rules in insertion order (no short-circuit) against aLoanApplicationcontextRuleEngineResultreporting approved flag plus passed/failed rule namesRegistered in the root
pom.xmlmodules list.