2

私はこれについて興味があります:

MicrosoftのOutlookExpress(またはOutlook、よく覚えていませんが、私はMacユーザーです)では、本当にすばらしいものがあります。一般的なルール:

たとえば、一連のルールを構成して、電子メールを自動的に並べ替えたり削除したりできます。それは信じられないほど強力で使いやすいです。

これらのルールは次のようになりました。

「受信トレイのメールに「foo」、「bar」、または「foobar」を含む件名がある場合は削除してください」

強力なフォーム検証システムに似たものをコーディングする必要があります。開発者は、次のようなルールを簡単に作成できるはずです。

rule: [password_1] is_not_equal_with [password_2]
consequence: show_error '2921'

rule: [firstName] has_less_characters_than '2'
consequence: show_error '1211'

rule: [age] is_numeric, is_smaller_than '13', is_greater_than '130'
consequence: show_error '1522'

rule: [gender] is_equal_with 'female'
consequence: show_group [female_questions]

rule: [termsAndConditionsAccepted] is_not_checked
consequence: show_error '482'

rule: [age] is_less_than 21
consequence: hide_group [income_questions]

さて、私はこれをどのように行うことができるかについていくつかのアイデアを持っています、そして私はそれらを答えとしてここに投稿します。しかし、私が車輪の再発明をする前に:これに似たルールベースの検証システムを開発するための基礎として使用できる書面による概念はありますか?または、そうでない場合、これをどのように行うことができるかについて何か提案はありますか?

上記の例では、角かっこで囲まれたものはすべてhtmlフォーム要素の名前です。アポストロフィ''のすべては、比較するための「ハードコードされた」値です。

定義されたルールは、クライアント側とサーバー側の両方の検証を行うためにPHPコードとJavaScriptコードに変換されます。

これが可能でなければならない機能:

  • 条件付きルール:何かAが何かBに依存している
  • 値の比較:整数、浮動小数点数、文字列の場合
  • 上記の「[gender]is_equal_with'female'」の例のように、フォーム制御ロジックも有効にします。

これはどのように行うことができますか?科学的な観点から、私が考慮しなければならない実体は何ですか?

これの理論的概念はプラットフォームに依存しないと思います。これをPHPとJavaScriptで実装しますが、C++開発者が応答しない理由はありません;-)(私はObjective-Cの人です)

4

4 に答える 4

4

いくつかのオープンソースルールエンジンをチェックすることをお勧めします。または1つでも支払われます。

例としては、
Pay for it:
InRuleBusiness Rules EngineASA BusinessRulesEngineがあります。

オープンソース:
OpenRulesDrools

もっとたくさんあります。java(Java Rule Engine API(JSR94))および.Net(Windows Workflow Foundationルールエンジン)に組み込まれているものを含みます。

しかし、ストレートPHPについてはよくわかりません。

ちなみに、私はHaley Rules(Oracleに購入される前)のようないくつかのエンジンを使用してWebUIを駆動しました。実行速度は絶対に重要であることに注意してください。ヘイリーはページの読み込みごとに約2000のルールを処理し(住宅ローンアプリ)、40ミリ秒未満で実行されていました(タイプミスではありません)。これを使用して、ページのどのフィールドにあるかを判断し、入力されたデータが一貫しているか、法的基準を満たしているか、さらには正しく入力されているかどうかを判断しました。

他のエンジンのいくつかは、エンジンを単純にインスタンス化するのに時間がかかったため、はるかに小さなルールセットでもはるかに低速でした。

私はまた、より小さなシステムのために自分自身を書くという道を歩みました。私の場合、フォームとともに保存されたスクリプトを実行する前に、javascriptを使用し、投稿されたページのデータを使用して変数を設定するだけでした。

これも小規模ではパフォーマンスが良かったのですが、単純なgo /nogo応答のみを与えるように制限しました。

于 2010-01-11T17:42:34.493 に答える
2

少数のルールとメッセージの場合、ブルートフォースアルゴリズムを適用できます。各ルールと各メッセージを取得し、それらが適合するかどうかを比較します。ルールが複数の条件を持つ可能性があることを考慮せずに、rはルールの数、mはメッセージの数である、O(r m )の複雑さになります。

膨大な数のルールまたはメッセージについては、Reteネットワーク(http://en.wikipedia.org/wiki/Rete_algorithm)を実装できます。これにはある程度のメモリが必要ですが、実際にははるかに高速です。ルールの設計方法に応じて、さまざまな複雑さが生じます。

最初のアプローチは単純で、説明する必要はないと思います。ただし、サポートが必要な場合はお知らせください。そのアイデアについて詳しく説明します。2番目のアプローチについて説明します。

先に進む前に、Reteアルゴリズムについて少し読んでください。

Reteネットワークのアルファ部分には、ルールに表示される個別の条件を格納します。一部のルールは、いくつかの条件を共有する場合があります。好き:

Rule1:IF(message.date equals 24.10.2009)AND(message.title contains "hello")THEN do something1

Rule2:IF(message.hasAttachement is TRUE)AND(message.date equals 24.10.2009)THEN do something2

したがって、ネットワークのアルファ部分には3つの要素があります

  • C1 :( message.dateは2009年10月24日と等しい)
  • C2:(message.titleには「hello」が含まれています)
  • C3:(message.hasAttachementはTRUEです)

ベータネットでは、C1-C2とC3-C1をリンクする2つの結合ノードがあります。

ベータネットワークを終了する本番ノードには、メッセージがルールのすべての条件(アルファ部分)とすべての整合性チェック(ベータ部分)を満たしたときに実行する必要のある一連のアクションが含まれます。

最も複雑な部分はベータネットワークです。ルールに論理積だけが必要な場合(他の論理演算や括弧は不要)、簡単です。ただし、より複雑な構造が必要な場合は、多くのコードを記述し、多くのテストを実行する必要があります。

Reteの詳細については、以下をご覧ください。

  • 大規模な学習システムのプロダクションマッチング/--RobertB.Doorenbos。(1995)
  • 生産システムの効率的な実装について/-CharlesL.Forgy(1979)
于 2010-01-11T18:01:30.180 に答える
1

オブジェクト指向設計では、1つのアプローチは、コマンドパターン、またはより複雑なニーズの場合はインタープリターパターンを実装することです。通常、ルールのさまざまなカテゴリに対して複数のクラスを作成し、より複雑なシナリオ用にそれらを作成できます(たとえば、CompositeRuleを構築することによって)。それらはすべて、Execute()やExecute(context)などのインターフェースをサポートしています。

ルールインスタンスのキューを作成し、作用するオブジェクトごとに各インスタンスでExecute(context)を呼び出します。コンテキストには、操作しているオブジェクト(メッセージ、フォームなど)のインスタンスが含まれます。

于 2010-01-11T17:35:53.990 に答える
1

責任の連鎖でルールを連鎖させます。

于 2010-01-11T17:42:47.567 に答える