我有大量几乎重复的规则要实现。它们完全相同,但右侧略有不同。例如
rule "AS77" extends "IVD01"
@description(" IF Individual Identifier = E, THEN Other Description is required. ")
when
$source : Owner($errCode : "427")
then
end
rule "AS78" extends "IVD01"
@description(" IF Individual Identifier = E, THEN Other Description is required. ")
when
$source : JntOwner($errCode : "428")
then
end
rule "IDV01"
@description("IF Individual Identifier = E, THEN Other Description is required. ")
when
IDVerify(idType == "E", otherDscrp == null) from $source
then
_reject.getErrorCode().add($errCode.toString());
end
我想做类似上面的事情,但我知道我不能因为“$ source”在孩子规则中。我也知道我无法切换它并且条件规则扩展了其他规则,因为Drools规则只能扩展另一个规则。在java中我会创建一个像
这样的方法static void evalIdVerify(IDVerify idv, String errorCode) {
if ("E".equals(idv.getIdType()) && idv.getOtherDescript() == null) {
_reject.getErrorCode().add(errorCode);
}
}
并根据需要使用它。有没有办法编写一个可以像方法一样调用并带参数的规则?或者其他一些解决方案不仅一遍又一遍地编写相同的规则?我无法控制类,这些规则每年都会被第三方修改,因此为了可维护性,我真的希望它们只能被定义一次。任何帮助,将不胜感激。感谢。
答案 0 :(得分:0)
但你可以"切换它"。您需要做的就是将IDVerify
对象作为事实插入。
rule "IDV01"
@description("IF Individual Identifier = E, THEN Other Description is required. ")
when
$id: IDVerify(idType == "E", otherDscrp == null)
then
end
rule "IDV01 for Owner" extends "IVD01"
when
$source: Owner($errCode : "427", id == $id)
then
_reject.getErrorCode().add($errCode.toString());
end
另一种选择是将其作为每项检查的单一规则写入:
rule "IDV01 for Owner"
when
$source: Owner($errCode : "427",
$id.idType == "E", $id.otherDscrp == null)
then
_reject.getErrorCode().add($errCode.toString());
end
您可以将IDVerify测试放入布尔函数或静态方法,减少代码重复的数量。