2010-11-25 17 views
5

विकसित करने के लिए एक साधारण डिज़ाइन पैटर्न मेरे पास एक आवश्यकता है जो जावा वैल्यू ऑब्जेक्ट्स के विरुद्ध बहुत से नियमों को मान्य करता है और परिणाम उत्पन्न करता है। (हम अपनी कंपनी में किसी भी नियम इंजन ऐप का उपयोग नहीं कर सकते हैं, औपचारिकताओं और कई सवालों का जवाब देने के लिए)। तो, जावा कोड में नियमों को लागू करने के बजाय, मैंने एक छोटे नियम इंजन, सरल और एक्सटेंसिबल को लागू करने का सुझाव दिया। किस डिजाइन पैटर्न का पालन करने के लिए?एक छोटे नियम-इंजन

मैंने परिभाषित नियमों की एक मोटाई 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 Pattern का उपयोग करके) जो नियम सेट पास करने और नियम बनाने की अनुमति देता है।

यही वह है जो मैं सबसे अच्छा करता हूं, लेकिन चूंकि मुझे आपके नियम इंजन की सटीक आवश्यकताओं को नहीं पता है जो कि दिमाग में आया है।

शायद Strategy Pattern आपकी मदद कर सकता है?

4

यह वास्तव में उन नियमों की जटिलता पर निर्भर करता है जिन्हें आप कार्यान्वित करने का प्रयास कर रहे हैं। घोषणात्मक प्रोग्रामिंग में मुख्य विचार यह है कि नियमों को डेटा के रूप में माना जाता है। इसलिए, शुरू करने का सबसे आसान तरीका यह देखना है कि आपके सभी नियमों को तालिका में डेटा के रूप में प्रदर्शित किया जा सकता है या नहीं। उदाहरण के लिए, यदि आपके नियम प्रकार के हैं यदि एक = 10, फिर बी = 7, तो आप एक तालिका में इसका प्रतिनिधित्व कर सकते हैं और एक सामान्य विधि लिख सकते हैं जो आपके सभी मामलों को संभाल सकता है।

दूसरी तरफ, यदि आपके नियम एकाधिक स्थितियों (और/या खंडों के साथ-साथ तुलना ऑपरेटर) की अनुमति देते हैं, तो तालिका आधारित डिज़ाइन सहायता नहीं करेगा।

उस स्थिति में, आपको अपने नियमों के लिए व्याकरण निर्दिष्ट करना होगा, एक लेजर और एक पार्सर उत्पन्न करना होगा। पार्सर आपके वास्तविक नियमों को एक सार वाक्यविन्यास पेड़ में पार्स करेगा। एक बार जब आप उस चरण तक पहुंच जाएंगे, तो आप या तो उस पेड़ को ले सकते हैं और इसे मौजूदा नियम इंजन या अपने स्वयं के नियम इंजन पर लक्षित कर सकते हैं जो पेड़ को निष्पादित करने के बारे में जानता है।

0

नहीं वास्तव में क्या आप (अर्थात पैटर्न) से कहा कि लेकिन शायद आप निम्नलिखित दृष्टिकोण उपयोगी अगर आप अपने खुद के रोल करना चाहते हैं कर सकते हैं:

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

+1

इस यूआरएल नहीं रह गया है आप उस लेख के लिए ले जाता है। –

+0

@ डोनरोबी - सही, धन्यवाद। –

संबंधित मुद्दे