0
rule "size must be greater than 1 billion"
    when
        $typeMaster : TypeMaster ( $type : keyValue["type"] , 
                                   $code : keyValue["code"],
                                       ( $type in ( "CB1", "CB2" ) && $code == "123" ) ||
                                       ( $type in ( "B1", "B2" ) && $code == "234" ) &&
                                   keyValue["size"] <= 1000000000 )
    then
        messageService.save(Type.ERROR, kcontext, $typeMaster);
end

我在流口水中有上述规则,在 TypeMaster 事实/对象中说,有一个 keyValue 映射,获取类型和代码并根据几个标准检查它们的值,当它们满足时,检查大小是否 <= 十亿。如果它满足条件,那么,它将在结果中保存带有错误和规则名称的所需对象。

我想重构代码。但是,我希望所有类型和代码检查都在规则文件中,因为如果任何规则发生更改,可以在文件本身中更改它,而不是进入 Java 代码并更改硬编码变量。你能建议吗?

4

1 回答 1

0

将检查方法添加到您的 TypeMaster Fact 怎么样。像这样的东西

class TypeMaster {
  boolean isTypeIn( String... params ) {
    // Check if this.type is in params
  }
  boolean isCodeIn( String... params ) {
    // Check if this.code is in params
  }
  boolean isSizeSmallerOrEqualTo( long value ) {
    return this.size <= value  // You might not need this util method
  }
}

然后在你的规则中你会有这样的东西

rule "size must be greater than 1 billion"
    when
        $typeMaster : TypeMaster ( typeIn( "CB1", "CB2" ) && codeIn( "123" ) ||
                                   typeIn( "B1", "B2" ) && codeIn( "234" ) &&
                                   sizeSmallerOrEqualTo( 1000000000  )
    then
        messageService.save(Type.ERROR, kcontext, $typeMaster);
end

我现在无法验证从 Drools 调用方法时 var args 参数是否有效,但如果它失败了,您可以使用数组、多个参数等

另一种选择是覆盖getType()getCode()在 TypeMaster 中以这样的方式直接返回值而不是通过 map 获取它们。像这样

class TypeMaster {
  Map values // this represents your key-value map
  getType() {
    return values.get( "type" )
  }
  getCode() {
    return values.get( "code" )
  }
  // getSize() similarly
}

在此之后,您的规则不会有太大变化

rule "size must be greater than 1 billion"
    when
        $typeMaster : TypeMaster ( ( $type in ( "CB1", "CB2" ) && $code == "123" ) ||
                                   ( $type in ( "B1", "B2" ) && $code == "234" ) &&
                                     size <= 1000000000 )
    then
        messageService.save(Type.ERROR, kcontext, $typeMaster);
end

希望你能明白这一点。

于 2013-10-10T13:45:52.730 回答