2017-03-02 3 views
0

私は実装するルールがほぼ重複しています。彼らはまったく同じですが、右側はわずかに異なります。例えばDroolsでは、指定したパラメータセットを使用してルールを拡張したり、ルールにパラメータを渡すことは可能ですか?

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ルールは他のルールを1つしか拡張できないため、条件を変更してルールを変更することはできません。 Javaで私は、

static void evalIdVerify(IDVerify idv, String errorCode) { 
    if ("E".equals(idv.getIdType()) && idv.getOtherDescript() == null) { 
    _reject.getErrorCode().add(errorCode); 
    } 
} 

のようなメソッドを作成し、必要に応じて使用します。メソッドのように呼び出すことができ、パラメータをとるルールを書く方法はありますか?あるいは同じルールを何度も何度も何度も書いているだけではない他の解決法ですか?私はクラスをコントロールすることができず、これらのルールは毎年第三者によって変更されるので、メンテナンス性のためには一度しか定義できないようにしたいと考えています。どんな助けもありがとう。ありがとう。

答えて

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テストを置くことができ、コードの重複の量を減少させます。

+0

ありがとう、私はすでに最初の解決策を試していましたが、誤ってIDVerifyオブジェクトを挿入していたため、私にはうまくいきませんでした。 OwnerとJntOwnerオブジェクトを挿入すると、それは機能しました。 – maxl

関連する問題