この問題を解決するための最善のアプローチについてアドバイスが必要です。
私はDROOLSを調査しました、Java Rule Engineと他のいくつか。これらはすべて強力で、それらについて良い点があります。どれが(もしあれば)最高になるかわかりません。私のための選択。
ビジネスオブジェクトが1つあります。 (デモ用に簡略化)
Person
firstName:String
lastName:String
departMent:String
hireDate:Date
これらのフィールドを中心に複雑なルールを作成できるようにするエディターをWebアプリケーションで作成する必要があります。複雑なネストされたAND/ORロジックをサポートする必要があります。基本的な演算子が必要なだけで、ルールは単純にtrueまたはfalseに評価されます。ルールがtrueまたはfalseと評価された場合、それぞれ1つのアクションが発生します。
例えば、
firstName CONTAINS "value" AND(lastName EQUALS "input" OR department CONTAINS "input")
自分でパーサーを書いて、自分のコードでロジックを評価するだけでいいのではないかと思っていました。どうしたらいいかわからないので、何かアドバイスや読み物へのリンクをいただければ幸いです。調査できる特定のデザインパターンはありますか?
この問題をどのように解決しますか?ルールエンジンに関する1つの懸念は、単純な問題には複雑すぎるのではないかということです。
これはイエス/ノーの質問ではありませんが、おそらく私の経験を共有することができ、それが役立つことを願っています。私はいくつかのプロジェクトでDROOLSを非常にうまく使用しました。いくつかのケース(別のチームが高負荷でDROOLSに問題を抱えていた)を除けば、DROOLSは非常に便利なライブラリです。
私は次のようなアプリケーションを作成しました。
1。ソースから入力を読み取る
2。利用可能な一連の操作からの入力に基づいて次のアクションを選択しました
見た目はささいなことですが、非常に柔軟である必要がありました。
1。入力は、名前と値のペアの変数セットであり、名前は事前に決定されていません。
2。値、特定の名前/値の有無(イベントの発生/不在に基づく)は、さまざまなアクションをトリガーします。
3。ビジネスルールは、アプリケーションの実行中に変更される可能性があります。
より良い解決策があるかもしれませんが、良くも悪くも、私はDROOLSを使用することになりました。私は、DROOLSコンポーネントによって決定が行われるBPELを開発しました。 DROOLSコンポーネントは、MicrosoftExcelスプレッドシートから意思決定ルールを内部的に読み取ります。ファイルに変更があった場合、ルールを再構築します。現在、ドメインの専門家は必要に応じてこのスプレッドシートを変更し、面倒な展開は行いません。
洗練されたUIが必要な場合、DROOLS Guvnorはすぐに利用できるWebアプリケーション(豊富なUIを備えた)であり、ドメイン/対象分野の専門家がルールを作成してデータベースに保存するのに役立ちます。
Droolsのドキュメントでは、ルールエンジンをいつ使用するかについて説明しています。 http://downloads.jboss.com/drools/docs/5.1.1.34858.FINAL/drools-expert/html_single/index.html#d0e181
ドキュメントから...
これに対する最短の答えは、「問題を解決するための満足のいく従来のプログラミングアプローチがない場合」です。その短い答えを考えると、もう少し説明が必要です。 「従来の」アプローチがない理由は、おそらく次のいずれかです。
-問題は、従来のコードにはあまりにも厄介です。
問題は複雑ではないかもしれませんが、その解決策を構築するための脆弱でない方法を見つけることはできません。
-問題は明白なアルゴリズムの解決策を超えています。
解決するのは複雑な問題であり、明白な従来の解決策がないか、基本的に問題が完全に理解されていません。
-ロジックは頻繁に変更されます
ロジック自体は単純な場合もありますが、ルールは頻繁に変更されます。多くの組織では、ソフトウェアリリースはごくわずかであり、プラグイン可能なルールは、合理的に安全な方法で必要とされ、期待される「敏捷性」を提供するのに役立ちます。
-ドメインの専門家(またはビジネスアナリスト)はすぐに利用できますが、技術的ではありません。
ドメインの専門家は、多くの場合、ビジネスルールとプロセスに関する豊富な知識を持っています。それらは通常、技術的ではありませんが、非常に論理的である可能性があります。ルールを使用すると、ロジックを独自の用語で表現できます。もちろん、彼らはまだ批判的に考え、論理的思考ができる必要があります。非技術的な立場にある多くの人々は形式論理のトレーニングを受けていないので、注意して彼らと協力してください。ルールにビジネス知識を体系化することで、ビジネスルールとプロセスが現在理解されている方法に穴が開くことがよくあります。
使用しない場合...
ルールエンジンは動的であるため(ルールをデータとして保存、管理、更新できるという意味で動的)、ソフトウェアの展開の問題の解決策と見なされることがよくあります。 (ほとんどのIT部門は、ソフトウェアのロールアウトを防ぐ目的で存在しているようです。)これがルールエンジンを使用する理由である場合は、宣言型ルールを記述できるときにルールエンジンが最適に機能することに注意してください。別の方法として、データ駆動型の設計(ルックアップテーブル)、またはスクリプトがデータベースで管理され、その場で更新できるスクリプト処理エンジンを検討することもできます。
Jythonは役に立ちませんか?
各式/複合ルールは、関数の本体である可能性があります。したがって、ユーザーが本体を提供し、コードがその周りに関数仕様を配置してから実行します。
スクリプト/関数本体で使用するために、任意のJavaオブジェクト/変数をjythonコンテキストに入れることもできます。
次に、標準化された、拡張可能な広く使用されている言語をすぐに利用できます。しかし、Jythonエディターは難しいかもしれないと思います。
おそらくそうではありません。まともなドメインモデルが必要です。 objectsが単なるデータプレースホルダーであるものではありません。ユーザーは、このような複雑なルールシステムを理解して使用できる可能性が高く、適切なカプセル化とリファクタリングがサポートされているJavaでのプログラミングだけを好むユーザーではないでしょうか。ルールシステムは、制限されたドメイン上の単純なルールでのみ機能します。ここでは、プログラマーとしてトレーニングを受けていない人々に、ルールの作成方法を説明できます。また、ルールの作成は単なるプログラミングであるため、バージョン管理とテストが必要であり、グローバルは必要ないことを忘れないでください。
私はあなた自身のパーサーを提案します。このコンテキストでは、オブジェクトをシリアル化し、AJAXを使用してバックエンドで検証できないのはなぜですか?次に、検証ロジックをUIから分離します。
いくつかのサンプルルールエンジンインターフェイスを見て、どれが好きかを確認します。 Webベースの電子メールルールインターフェイスを見て、いくつかのアイデアを得ることができます。単純なルールエンジンが本当に必要な場合は、適切なインターフェイスを作成するだけで、JavaScriptを使用してルールをサーバーに送信できます。