2010-11-25 10 views
5

私は、Javaの値オブジェクトに対して検証された多くのルールをとり、結果を生成するという要件があります。 (当社ではルールエンジンのアプリケーションを使用することはできません。多くの手続きや質問に答える必要があります)。 したがって、Javaコードでifs 'のようなルールを実装するのではなく、シンプルで拡張可能な小さなルールエンジンを実装することを提案しました。 どのデザインパターンに従うのですか?小さなルールエンジンを開発するためのシンプルなデザインパターン

以下に、定義されたルールの概略xml構造を追加しました。

<rule-set>  
    <name>Example1</name> 
    <description>Example rules defined</description> 

    <beans> 
     <bean class="com.example.Customer" alias="cust"/> 
     <bean class="com.example.Account" alias="acnt"/> 
     <bean class="com.example.Transaction" alias="trans"/> 
    </beans> 

    <rule name="CustomerInfo" description="This rule validates if all the customer values are present"> 
     <if lhs="cust.getFirstName" rhs="null" operator="!="/> 
     <if lhs="cust.getLastName" rhs="null" operator="!=" logicaloperator="&amp;&amp;"/> 
     <if lhs="cust.getCountry" rhs="null" operator="!=" logicaloperator="||"/> 
     <if lhs="cust.getCity" rhs="null" operator="!=" logicaloperator="&amp;&amp;"/> 
     <if lhs="cust.getPhone" rhs="null" operator="!=" logicaloperator="&amp;&amp;"/> 
     <if lhs="cust.getEmail" rhs="null" operator="!=" logicaloperator="&amp;&amp;"/> 
     <then do="cust.completeFlag" arg1="true"/> 
    </rule> 

    <rule name="Transaction" description="Transfer the money from one ac to another"> 
     <if lhs="trans.fromAccount" operator="!=" rhs="null"/> 
     <if lhs="trans.toAccount" operator="!=" rhs="null"/> 
     <if lhs="trans.fromAccount.balance" operator=">" rhs="trans.getTransaferAmount"/> 
     <then do="trans.fromAccount.debit" arg1="trans.getTransaferAmount"/> 
     <then do="trans.toAccount.credit" arg1="trans.getTransaferAmount"/> 
    </rule> 

</rule-set> 

答えて

0

私はFactory Method Patternをお勧めします。各ルールには、それらのルールを作成できるファクトリがあります。次に、これらのルールファクトリをすべてAbstract Factoryにカプセル化します。

また、ルールセットを渡してルールを構築できるBuilder(Builder Patternを使用)としてルールエンジンを作成することもできます。

これは私が一番うまくいくことですが、ルールエンジンの正確な要件がわからないので、何が心に浮かんできたのか分かりません。

おそらくStrategy Patternがお手伝いできますか?

4

本当に実装しようとしているルールの複雑さによって異なります。宣言型プログラミングの重要なアイデアは、ルールがデータとして扱われることです。だから、最も簡単な方法は、すべてのルールをテーブル内のデータとして表現できるかどうかを確認することです。たとえば、ルールがa = 10、b = 7の場合はルールがタイプであり、テーブル内でルールを表現し、すべてのケースを処理できる汎用メソッドを記述することができます。

一方、ルールで複数の条件(および/または比較演算子)が許可されている場合、テーブルベースの設計は役に立ちません。

この場合、ルールの文法を指定し、レクサーとパーサを生成する必要があります。パーサーは、実際のルールを抽象構文ツリーに解析します。その段階になると、そのツリーを取得して、既存のルールエンジンまたはツリーの実行方法を知っている独自のルールエンジンにターゲットを設定できます。

0

あなたは(すなわちパターン)頼まれていない正確に何ができますが、独自のロールしたい場合は多分あなたは便利な次のアプローチを見つけることができません:このURLは、もはやその記事に移動します

http://mcqueeney.com/blog/creating-a-simple-rules-engine-using-the-java-scripting-api/

+1

。 –

+0

@DonRoby - 修正済み、ありがとうございます。 –

関連する問題