如果您决定重构您的应用程序以改用drools,并且如果其他人正在寻找类似问题的解决方案,这里是我的两分钱drools 知识。
你的事实可能是这样的
// Fact for the scoring
class FraminghamScore {
private int total;
public void increment( int value ) { total += value; }
public int getTotal() { return total; }
}
// Fact for the subject
class Person {
public enum Gender{ MALE, FEMALE };
private Gender gender;
private int age;
private int cholesterol;
private boolean smoker;
// Rest of the fields + getter/setters as needed
}
您的决策表如下所示。正如我所看到的,例如年龄检查中会有一些重复,我想不出一种方法来摆脱这些。
Condition | Condition | Action
-----------------------------------------------------------------------------------
$p : Person() |
$s : FraminghamScore() |
-----------------------------------------------------------------------------------
p.gender | $param | s.increment($param);
| | update(s);
-----------------------------------------------------------------------------------
MALE | p.age >= 20 && p.age <= 34 | -9
MALE | p.age >= 35 && p.age <= 39 | -5
-- Rest of the age groups + same for females
Condition | Condition | Action
-----------------------------------------------------------------------------------
$p : Person() |
$s : FraminghamScore() |
-----------------------------------------------------------------------------------
p.gender | p.smoker | s.increment($param);
| | update(s);
-----------------------------------------------------------------------------------
MALE | true | -9
MALE | false | -5
等等。
现在看看表格,我发现年龄检查会有很多重复。不过暂时想不出更好的办法。希望这至少有一点帮助。
编辑
您可以让 FraminhamScore 事实仅用于保存每条规则的点数,而不是将它们加在一起。使用此选项,您可以为每个规则的工作内存添加一个分数事实,并使用查询最终获取它们,然后进行数学运算。这可能会使您的决策表更整洁。