web-dev-qa-db-ja.com

.NETのルールエンジン

パワーユーザーが保険料と加入のルールを編集できるようにするというビジネス要件があります。 「この製品は、テキサス出身でプードルを所有している場合を除き、55歳未満の人のみを対象としています」などと表示できるWebUIが必要です。明確にするために編集:保険は非常識です。ルールは製品ごと、状態ごとに異なり、絶えず変化します。

いくつかのルールエンジンを調べましたが、商用エンジンは100K以上であり、オープンソースエンジンは完成していないようです。事前にルールを作成しておけばWindowsワークフローは機能しますが、実行時にルールを作成するには、コードアクセスセキュリティをバイパスする必要があるようです。それが怖いです。

私たちはこのホイールを再発明するのが難しいですか? .netのより良い代替手段はありますか?

24
Code Silverback

ルールの評価が難しいとは思いません。より大きな課題は、ユーザーが入力できるルールを解析することだと思います。ルールを解析するには、DSLを作成することを検討する必要があります。マーティンファウラーはこれについていくつかの考えを持っています ここ 。それなら多分 [〜#〜] antlr [〜#〜] それなら一見の価値があるかもしれません。

評価の部分:私は金融業界で働いており、複雑なルールもありますが、ルールエンジンを使用する必要はありませんでした。命令型プログラミング言語(私の場合はC#)の手段で(今まで)十分でした。ルールエンジンを検討していることもありましたが、ルールエンジンの技術的リスク(*)は常に期待されるメリットよりも高かったのです。ルールは(今まで)それほど複雑ではなく、宣言型プログラミングモデルが必要でした。

オブジェクト指向言語を使用している場合は、 仕様パターン を適用してみることができます。 EricEvansとMartinFowlerが、より詳細な説明を書いています。これは ここ で見つけることができます。または、独自の単純なルールエンジンを作成することもできます。

(*)脚注:どういうわけか、オブジェクト指向言語で書かれている可能性が非常に高いルールエンジンをアプリケーションに埋め込む必要があります。したがって、いくつかの技術的な境界があり、それらを橋渡しする必要があります。そのような橋はすべて技術的なリスクです。私はかつて、Cで記述されたルールエンジンを使用するJava Webアプリケーションを目撃しました。最初はCプログラムがコアダンプを生成し、Webアプリケーション全体を破壊することがありました。

11
Theo Lenndorff

ほとんどの意思決定と購入の決定と同様に、それは常に個人的に行わなければならないトレードオフだと思います。 10万以上の費用がかかる既製のソリューションを購入し、その1%しか使用しない場合は、おそらくいくらかのお金が賢明に使われていません。ただし、製品が完全に適合している場合は、それ以下で構築することは絶対にできないとほぼ確信できます(特定の分野で多くの経験があると仮定します)。

したがって、既製の製品が行うすべてのことを実行しようとせず、必要な特定の機能に集中し、非常に素晴らしいものを構築するというアイデアに誘惑されない限り、このホイールを再発明するのは難しいことではありません。 (しかし高価な)非常に単純なもののためのフレームワーク。

10
thekip

100Kは大きな変化ではありませんが、1年間のまともなプログラマーは、ほぼ間違いなくそれ以上の費用がかかります。1年よりも速くそれを実行できる安価なプログラマーはいますか?それは(あなたのニーズに)同じくらい良いのでしょうか、それとももっと良いのでしょうか?

3
E.J. Brennan

これは私の分野ではありません。偶然この質問に出くわしたので、私は離れているかもしれませんが、 Wolfram Mathematica を見てみましょう。これは、技術的なコンピューティング環境であり、マルチパラダイム(プロプライエタリ)プログラミング言語であり、多くのプログラミングスタイル(ルールベースおよび関数型プログラミングを含む)をサポートします。それはそのコアに非常に一般的なルールエンジンを持っています。数学ソフトウェアとしての名前と評判にもかかわらず(それはそうです)、それは非常に高レベルの汎用プログラミング言語です。そのサブセットはCにコンパイルできます。外部dllを動的にロードでき、Javaと.Netプラットフォームの両方と透過的に相互運用します。Webバージョン-webMathematica( Javaただし、jsp + Tomcatに基づいていますが、.NetベースのWebレイヤーと直接インターフェースすることを妨げるものはありません。もう少し作業が必要です)。追加の利点は、数学的な計算、分析、プロット、統計が必要です。すべてが揃っており、最先端の技術が必要です。

他の多くの言語/ソリューションよりもMathematicaで必要な機能を開発する方がはるかに速いはずだと思います(私はMathematica、C、Java、Javascriptで専門的にプログラムしているので、少なくともこれらの言語を比較してください。完全な商用ライセンスは、単一のマシン(4コア)に対して2または3 Kである必要があります。これには、いくつかの並列化機能があります。このアプローチで最も難しいのは、有能なMathematicaプログラマーを見つけることですが、誰か機能/ルールベースのプログラミング(LISP/Prologなど)のバックグラウンドを持っていると、かなり速く物事を拾うことができるはずです。また、非常に高いパフォーマンスが必要な場合は、十分に速くない可能性があります-私は本当にそれがどのようになっているのかわかりませんパフォーマンスの点で他のルールエンジンと比較します。時々、Mathematicaでいくつかの問題のルールベースのソリューションをCにコンパイルされたものと比較する機会があり、よく書かれたルールベースのコードがオンになっているはずです。 Pythonパフォーマンスの観点から、そして平均でのレベル怒りはおそらくCにコンパイルされたものよりも1桁ほど遅いです。しかし、それは主に数値/計算またはデータ操作関連の問題であったため、本質的にルールに基づく問題の場合、パフォーマンスのギャップは小さくなる可能性があります。 。

私が確信していることの1つは、Mathematicaでは、少量のコードで、一般性と複雑さのルールのセットをかなり簡単に作成できるということです。これは、開発サイクルが非常に短く、これまでに遭遇したルールに基づく探索的プログラミングに最適なツールです。 Mathematicaタグ ここSOで、人々がどのような種類の問題を解決しているのかを確認してください。完全にMathematica言語で書かれた1つの著名なプロジェクト(15数百万行のコード)、チェックアウト WolframAlpha ナレッジエンジン。

2
Leonid Shifrin

。netのより良い代替手段はありますか?

1つのオプションは、IronPythonのような.netコード内に埋め込まれたスクリプトエンジンを使用することです。ユーザーがルールを作成するためのGUIを提供し、「ルール」をPythonスクリプトに変換し、.Net内のPythonスクリプトエンジンを呼び出して、スクリプトを実行します。 。

このホイールを再発明するのは難しいですか?

既製のものがあなたのニーズを満たすものがなければ、いいえ。

1
Jon Raynor

問題は、これらのことがビジネスの独自の運営方法と非常に絡み合っているため、既成のソリューションを効果的に使用することは不可能ではないにしても難しいということです。

私はこの2つの異なる方法のようなことをしました。

最新(VS 2005/Framework 2.0)は、全面的に当てはまる一般的な最小要件を処理するベースエンジンを作成することでした。これは、名前、住所などのようなものになります。次に、共通のインターフェイスを使用する一連の拡張DLLを作成しました。これは、州や製品ラインなど、特定のタイプ/リージョンのリフレクションを介して読み込まれます。パワーユーザーは、シンプルなアプリを使用して、必要なアカウント構成を作成できます(構成はDBに保存されていました)。状況が変わった場合は、基になるDLLを変更するか、新しい拡張子を追加することができます。4年間、新しい拡張子を1つ追加するだけで済みましたDLLこのプロジェクトですが、通常、ルールに1か月必要な小さなMODが1つか2つありました。

以前のVB6プロジェクトでは、ガイド付きVBScriptを使用して、パワーユーザーに特定のルールをコーディングする機能を提供していました。ユーザーはExcelスクリプトをよく知っていて、必要なことを実行できるようにウィザードインターフェイスが作成されていましたが、通常はルールをコーディングする仕事を与えてくれました。その計画は一種の裏目に出たので、後でそれを再び使用するのではなく、代わりに、ルール構築に対してより「これをチェックし、それを選択する」アプローチを選択しました。

0
jfrankcarr

ルールが単純な場合は、独自のエンジンを作成できます。複雑になるほど、それを維持するのに時間がかかります。

Drools Serverを使用してルールを実行し、メインアプリケーションを.NETまたは任意の言語で実行できます。 Droolsサーバー部分にはまだJavaが必要です。

0
Toni Rikkola