0

アプリケーションで Drools 6.1.0 を使用しています。

すべてのルールを含む単一の巨大な .drl ファイルを作成する予定です。

ルールには主に 2 つのカテゴリがあります。 1. Null チェック 2. ビジネス検証

ruleflow-group、activation-group、および salience を使用して、ファクトがセッションに追加されたときに実行/起動するルールを管理することを計画しています。

このアプローチを使用しても、解決策がうまくいかない場合があります。

以下の .drl ファイルがあるとしましょう

rule "rule1"
ruleflow-group "primary"
activation-group "NullCheck"
salience 5
when 
    $m : Message(innerMsg.something == null)
then 
    // do something

rule "rule2"
ruleflow-group "primary"
activation-group "NullCheck"
salience 4
when 
    $m : Message(innerMsg.something.something == null)
then 
    // do something

rule "rule3"
ruleflow-group "primary"
activation-group "NullCheck"
salience 3
when 
    $m : Message(innerMsg.something.something.something == null)
then 
    // do something

Drools のドキュメントには、「すべての制約は、ファクトが挿入されたときに評価されます。Drools のマニュアルから: 条件の評価は、特定の評価シーケンスまたは時点に結び付けられていませんが、条件の評価は、オブジェクトの有効期間中いつでも継続的に発生します。そのエンジン。"

innerMsg.something.something何が起こっているかというと、このファイルを実行しているコードは、ルール 2が NULLであるため、Nullpointer Exception をスローしているということです。

注: || を使用してすべてのヌル チェックを無効にしたくはありません。特定のnull条件をキャプチャし、それに基づいてエラーメッセージを作成したいので、単一のwhenステートメントで。

私の質問は以下の通りです。

  1. drools ルールを使用して、チェーン オブジェクトの Nullcheck を実行するのは良い考えですか。
  2. 特定の順序でルールを実行できるようにする、シーケンシャル ルール実行 (Drools で使用できるかどうかは不明) のような別のものを使用する必要があります。
  3. これを達成する別の方法はありますか
4

2 に答える 2

0

http://drools-moved.46999.n3.nabble.com/rules-users-Drools-Activation-Group-td3546598.htmlは、あなたが見ているものに関連していると思います。次のようなものを試すことができます。

rule "rule2" ruleflow-group "primary" activation-group "NullCheck" salience 4 when $m : Message(innerMsg != null) Message(this == $m, innerMsg.something != null) Message(this == $m, innerMsg.something.something == null) then

これは、大量の || を避けたいというあなたの願望に反します。ある程度ですが、それは別の構文です。

于 2015-05-21T19:12:22.697 に答える
0

避けることができないのは、コードをヌルセーフにすることです。

オブジェクトのサブタイプを持つフィールドにアクセスするすべての条件の前に、null テストを付けます。

Fact( field != null && field.subfield == whatsoever )

または、null セーフ逆参照演算子を使用します。

Fact( field!.subfield == whatsoever )

==and!=は暗黙的にヌルセーフであるため、次のように記述できることに注意してください。

Fact( field == whatever )

でしたら問題ありませんfield == null

できるだけ早くフロー制御を実現するために、アクティベーション グループとサリエンスを使用するという考えを捨ててください。これは、非常に悪いルール設計、保守不可能なコード、および一般的な不幸につながります。それができない場合は、すべてを Java または他の言語で記述してください。

于 2015-05-22T04:15:36.350 に答える