0

droolsルールを作成するとき、チェックをより多くのルールに分割しますか、それともすべてを1つのルールにグループ化して、「then」部分により多くのifを含めるのですか?管理上の問題は考慮せず、パフォーマンス(実行時間、メモリ使用量など)のみを考慮します。

条件とやるべきことが90%似ている複数のタスクがあり、残りの10%がそれぞれに固有であるとします。あなたは書きますか

rule A
when (90% conditions) and (task 1 or task 2 or task n)
then
    if (10% conditions for task 1) ...(10% stuff-to-do for task 1)
    else if (10% conditions for task 2) ...(10% stuff-to-do for task 2)
    else if (10% conditions for task n) ...(10% stuff-to-do for task n)
    (90% common stuff-to-do)
end

また

rule B-1
when (90% conditions) and (10% conditions for task 1)
then
    (90% common stuff-to-do) + (10% stuff-to-do for task 1)
end
rule B-2
when (90% conditions) and (10% conditions for task 2)
then
    (90% common stuff-to-do) + (10% stuff-to-do for task 2)
end
rule B-n
when (90% conditions) and (10% conditions for task n)
then
    (90% common stuff-to-do) + (10% stuff-to-do for task n)
end

ありがとうございました!

4

3 に答える 3

3

私はReteエンジンの専門家ではありませんが、一般的なルールは、決定がルールの左側にある限り、エンジンはReteツリーを最適化して、決定に最も効率的に到達できるようにすることができるということです。したがって、すべてをLHSに保持するが効率的です。疫病のように、LHSでの「評価」と同じ理由を避ける必要があります。

そしてもちろん、マイクロ最適化ルールとは別に、そのような各決定が別々のルールで宣言されている場合、正しいルールがさまざまな状況でアクティブ化されているかどうかを評価する単体テストを作成するのは簡単です。ルールを統合すると、ルールが必要なときに実行されているかどうかをテストできなくなります。

于 2012-12-14T11:28:16.860 に答える
2

私は2番目のものが好きです。別々の小さなルールがあるのはきれいです。Droolsの目的は、IF-ELSEをルールに変更することだからです。

于 2012-12-14T13:17:47.223 に答える
1

次の例のように、条件とタスクをグループ化する代わりに、それらを個別のルールに分離する必要があります。RETEのおかげで、実行時間はそれほど重要ではありません。メモリ使用量は、ルールではなく、事実に大きく依存します。

条件付きロジックを個別のルールに分割することで、テスト可能で管理可能なコードベースを取得できます。すべてを大きなルールに入れることは、プレーンなJavaコードでif-elseステートメントを使用することと大差ありません。その場合、Droolsはプロジェクトに複雑さを追加するだけで、何のメリットもありません。

rule 90_1
when
    //first rule for common stuff
then
    //
end


rule 90_2
when
    //second rule for common stuff
then
    //
end


rule 90_N
when
    //last rule for common stuff
then
    //
end

rule A_1
when
    //first rule for A
then
    //
end


rule A_2
when
    //second rule for a
then
    //
end

rule B
when
    //rule for B
then
    //
end
于 2012-12-14T17:31:42.313 に答える