2010-11-25 26 views
5

J'ai une exigence qui prend beaucoup de règles validées par rapport aux objets de valeur java et produit des résultats. (Nous ne pouvons pas utiliser les applications de moteur de règles dans notre société, beaucoup de formalités et beaucoup de questions à répondre). Donc, plutôt que d'implémenter les règles comme si dans le code java, j'ai suggéré d'implémenter un petit moteur de règles, simple et extensible. Quel modèle de design suivre?Un modèle de conception simple pour développer un petit moteur de règles

J'ai ajouté ci-dessous une structure grossière xml des règles définies.

<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> 

Répondre

0

Je recommande un Factory Method Pattern. Chaque règle aura une usine qui peut créer ces règles. Je voudrais alors encapsuler toutes ces usines de règles dans un Abstract Factory.

Vous pouvez également créer un moteur de règles en tant que générateur (en utilisant un Builder Pattern) qui permet de passer des jeux de règles et de construire une règle.

C'est ce que je ferais le mieux, mais puisque je ne connais pas les exigences exactes de votre moteur de règles, c'est ce qui est ressorti. Un Strategy Pattern pourrait vous aider?

4

Cela dépend vraiment de la complexité des règles que vous essayez d'implémenter. L'idée clé de la programmation déclarative est que les règles sont traitées comme des données. Ainsi, le moyen le plus simple de commencer est de voir si toutes vos règles peuvent être représentées comme des données dans une table. Par exemple, si vos règles sont de type si a = 10, alors b = 7, alors vous pouvez représenter la même chose dans une table et écrire une méthode générique qui peut gérer tous vos cas. D'un autre côté, si vos règles autorisent plusieurs conditions (et/ou clauses, ainsi que des opérateurs de comparaison), une conception basée sur une table n'aidera pas.

Dans ce cas, vous devez spécifier la grammaire pour vos règles, générer un lexeur et un analyseur. L'analyseur analysera vos règles réelles dans un arbre de syntaxe abstraite. Une fois arrivé à ce stade, vous pouvez soit prendre cet arbre et le cibler vers un moteur de règles existant ou votre propre moteur de règles qui sait comment exécuter l'arbre.