1

我是流口水的新手,并试图使用 guvnor 构建一个简单的弗雷明汉分数计算器。

一个例子是:假设你是一个 30 岁的男性,你从 -9 分开始。总胆固醇180加4分,吸烟者加8分,HDL胆固醇超过60加1分,血压135加1分。给你+3的结果。

记分表上的表格看起来像是一个流口水决策表的好场景。

我无法弄清楚如何将各个分数数字相加。
我开始为我的结果列创建一个新的“FraminghamScore”事实,但随后我需要将这些事实加在一起。

我试图将所有表合并为 1,但这很快变得复杂和冗余。

看起来如果我要在 java 中创建我的 FraminghamScore,我可以有一个可以调用的 incrementValue(int) 方法,但是我不知道如何将一个数字传递给它。

4

1 回答 1

1

如果您决定重构您的应用程序以改用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 事实仅用于保存每条规则的点数,而不是将它们加在一起。使用此选项,您可以为每个规则的工作内存添加一个分数事实,并使用查询最终获取它们,然后进行数学运算。这可能会使您的决策表更整洁。

于 2013-08-26T20:19:45.240 回答