1

私の会社では、いくつかのプロジェクトで Drools を BRE として使用する予定です。ここで、いくつかのベスト プラクティスを定義しようとしています。

私の質問は、ルール条件/結果内で何をすべきか、何をすべきでないかです。Java を直接記述したり、メソッドを呼び出すことができる場合 (たとえば、ワーキング メモリ内のグローバル オブジェクトから)。

例。一般的なオブジェクト (Person など) を評価するルールが与えられた場合、プロパティは true に設定されます。現在、その特定のプロパティは、データベースに移動してその情報をフェッチするオブジェクトに対してのみ定義できます。したがって、それを実装するには2つの方法があります。

代替案 A:

  • データベースに移動し、オブジェクト プロパティ (true/false、コード) をフェッチします。
  • オブジェクトをワーキングメモリに挿入する
  • ルールを評価する

代替 B:

  • データベースに接続するメソッドを持つグローバル オブジェクトを挿入し、指定されたオブジェクトのプロパティを確認します。
  • 評価するオブジェクトをワーキングメモリに挿入する
  • ルールでは、グローバル オブジェクトを呼び出して、データベースへのアクセスを実行します。

それらのどれがより良いと考えられていますか? 私は A が本当に好きですが、B の方が簡単な場合もありますが、データベースからの例外のようなものが発生した場合はどうなりますか?

私は、Packt Publishing の Drools 5.0 Book に実装されている代替 B を見てきましたが、それらは嘲笑を行っており、データベースにアクセスすることの実際の意味についてはまったく話していません。

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

4

2 に答える 2

2

ルールの利点の 1 つは、何度でも実行できることです。特に、ルール条件に誤りがある場合。これは明らかにパフォーマンスに影響を与えます。

その場合、私はオプション A を好み、事実を外部で準備し、評価のためにワーキング メモリに挿入する傾向があります。

もちろん、ルールをデータ ロード ルールに分割してからビジネス ルールを評価するオプションもあります (たとえば、ルール フローを使用)。

これにより、コード外でデータを設定する宣言的な制御が可能になります。

于 2010-11-30T04:13:50.543 に答える
1

また、他のシステム (データベース、サービス コールなど) から外部データを取得する必要があるため、これについて少し説明しました。個人的には、事前に必要な事実を知っているかどうかに基づいて、その決定を下します. もしそうなら、Java で自由に呼び出しを行ってください。これにより、より適切なエラー処理を行うことができます。また、特定のデータを取得できないためにルール エンジンを実行できない場合は、セッションの作成、ファクトの挿入、グローバルの設定などの作業を回避できます。停止するだけの場合は、開始しても意味がありません。

もちろん、データを取得できないからといって、実行を止めるべきではない場合もあります。これらのケースのいくつかでは、代替案 A と B が同じようにうまく機能します。しかし、特定のデータの必要性は他のものに依存しているとします。たとえば、本質的に大きなロジック ツリーを評価するアプリケーションに取り組んでおり、リーフはサービス呼び出しからのデータを使用して評価されます。2 つのリーフが AND 結合されているため、分岐が true になるには両方が true でなければならない場合、そのうちの 1 つが false と評価されるとすぐに、その分岐は false になり、もう一方のリーフを評価する必要はなくなります。つまり、評価に必要なデータを事前にロードしておくのはもったいないということです。「オンデマンド」でデータを取得することは、Jess のようなルール エンジンが後方連鎖もサポートする理由の 1 つです。デフォルトのフォワードチェーンに加えて。

Drools で後方連鎖が完了するまで、私が提案した代替手段は「from」キーワードを使用することです。私はそれでいくつかの運がありましたが、考慮すべき点が2つあります。

  1. Drools は、ルール エンジンの実行中に「from」ステートメントを繰り返しクエリします。私はサービス レイヤーでキャッシュを使用しているため、これは HashMap ルックアップと同じくらい有害ですが、キャッシュしないと、無意識のうちに数十、数百、数千のサービス呼び出しを行うリスクがあります。
  2. 期待したデータが見つからない場合、エラー処理を行う場所がありません。これは、スティーブン・ヘロドがほのめかしたようなものです。ルール エンジンは続行し、指定した式を評価し続けます。Halt() の呼び出しなどのアクションを実行する必要がある状況では、代わりにルールの結果でサービス呼び出しを行いました。

これが役立つことを願っています。明確にしたり、拡張したりできることがあれば教えてください。

于 2010-12-18T19:00:54.073 に答える