2010-11-25 21 views
5

Bir java değer nesnesine karşı doğrulanmış çok sayıda kural alan ve sonuç üreten bir gereksinim var. (şirketimizde herhangi bir kural motoru uygulamasını kullanamayız, birçok formalite ve cevaplanacak birçok soruya cevap veremiyoruz). Yani, kuralları java kodunda ifs 'olarak uygulamak yerine, basit ve genişletilebilir küçük bir kural motoru uygulamanızı önerdim. Hangi tasarım desen takip edilir?Küçük bir Kural Motoru geliştirmek için basit bir tasarım deseni

I belirlenen kurallar kaba bir XML yapısı aşağıda ekledik.

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

cevap

0

Ben Factory Method Pattern öneriyoruz. Her kuralın bu kuralları yaratabilecek bir Fabrikası olacaktır. Daha sonra tüm bu Kural Fabrikalarını bir Abstract Factory içine depolardım.

Alternatif olarak, kural setleri geçen sağlayan bir Builder gibi bir kural Engine (a Builder Pattern kullanarak) oluşturmak ve bir kural oluşturabilirsiniz. Ben en iyi öyle yapardım, ama aklımda içine attı ne kural motorun tam gereksinimlerini bilmiyorum çünkü

.

Belki bir Strategy Pattern size yardımcı olabilecek?

4

Gerçekten uygulamak istediğiniz kuralların karmaşıklığına bağlıdır. Deklarasyon programlamasındaki anahtar fikir, kuralların veri olarak ele alınmasıdır. Yani, başlatmanın en basit yolu, tüm kurallarınızın bir tabloda veri olarak gösterilip gösterilemeyeceğini görmek. Örneğin, eğer kurallarınız a = 10 ise, o zaman b = 7 ise, o zaman bir tabloda aynı şeyi temsil edebilir ve tüm durumlarınızı ele alabilecek bir genel yöntem yazabilirsiniz. Öte yandan

kurallarınız birden fazla koşul (ve/veya maddeleri yanı sıra karşılaştırma operatörleri) izin verirse, bir tablo tabanlı tasarım yardımcı olmayacaktır. Bu durumda

, siz, kuralların dilbilgisi belirtmek bir lexer ve ayrıştırıcı oluşturmak gerekiyor. Ayrıştırıcı, gerçek kurallarınızı soyut bir sözdizimi ağacına ayrıştırırdı. Bu aşamaya geldiğinizde, o ağacı alabilir ve varolan bir kural motoruna veya ağacın nasıl yürütüleceğini bilen kendi kural motorunuza hedefleyebilirsiniz.

İlgili konular