2009-02-13 12 views
6

Business Rules and Validation Application Block for .NET के लिए डीएसएल बनाने के लिए आप किस तकनीक की सिफारिश करेंगे? और क्यों?नियम इंजन के लिए डीएसएल बनाने में किस तकनीक का उपयोग करना है?

ढांचे का आर्किटेक्चर स्थापित किया गया है और उत्पादन द्वारा प्रमाण-परीक्षण किया गया है। मैं सिर्फ एक संकलित नियम कार्यान्वयन के लिए मानव-पठनीय नियमों को बदलने के लिए एक .NET प्रोसेसर बनाना चाहता हूं।

विकल्प है कि मैं के बारे में पता कर रहा हूँ कर रहे हैं: के .NET Boo

  • उपयोग पार्सर बिल्डरों कि एफ # के साथ आते हैं संकलक पाइपलाइन

    दुर्भाग्य से इन तरीकों में से कोई भी प्रदान करता है डीएसएल को संपादित करने के लिए डीएसएल को संपादित करने के लिए कम या कम अनुकूल आईडीई बनाने के लिए कुछ भी, जो डीएसएल सिंटैक्स (जो विकसित होगा) दिया गया है।

    कोई विचार या संकेत?

  • +0

    विषय में "से" बहुत अधिक है? – Svish

    +0

    धन्यवाद, उसको याद किया। –

    उत्तर

    8

    माइक्रोसॉफ्ट के अगली पीढ़ी के अनुप्रयोग विकास मंच, जिसका कूट नाम Oslo

    बनाता है यह आसान लोगों तरीके कि समस्या डोमेन वे में काम कर रहे हैं के लिए कोई मतलब में चीजों को लिखने के लिए के लिए

    ओस्लो रहा है "क्वाड्रंट" नामक एक विज़ुअल डिज़ाइन टूल, "एम" नामक मॉडलिंग भाषा और नियमों को संग्रहीत करने वाला "ओस्लो" रिपोजिटरी (एक SQL सर्वर डेटाबेस) शामिल है।

    तो अगर मैं चीजों को सही तरीके से पढ़ता हूं, तो आप एम में मॉडलिंग भाषा को परिभाषित कर सकते हैं, अपनी खुद की मॉडलिंग भाषा का उपयोग करके अपने सत्यापन नियमों को परिभाषित और संपादित करने के लिए क्वाड्रंट का उपयोग कर सकते हैं, और ओस्लो भंडार का उपयोग करने वाले एक एप्लिकेशन को लिख सकते हैं, जिससे आपका व्यवसाय उत्पन्न हो सके .NET के लिए नियम और सत्यापन आवेदन ब्लॉक।

    +0

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

    +0

    मैं ओस्लो के साथ tinkering रहा है - और यह बहुत आँख खोलने है। –

    +3

    अब यह मृत नहीं है? –

    0

    यदि आप एक दोस्ताना आईडीई बनाना चाहते हैं जो डीएसएल को संपादित करता है, तो आईडीई को पूरी तरह से ग्राफिकल बनाएं, और .NET ऑब्जेक्ट्स को संकलित करें (या आयरनपीथन जैसे गोंद भाषा के रूप में कुछ उपयोग करें)।

    यदि नियम पर्याप्त सरल हैं, तो आप ग्राफिक रूप से संपूर्ण नियम-संरचना को कार्यान्वित कर सकते हैं। यदि नियम पर्याप्त जटिल हैं, तो "मानव पठनीयता" एक असंभव लक्ष्य बन जाता है।

    किसी भी तरह से, यदि .NET कक्षाओं या आयरनपीथन ऑब्जेक्ट्स का एक सेट जो मध्यस्थ कोड बनाता है, वह "मानव पठनीय" पर्याप्त नहीं है, तो संभावना है कि आप व्याकरण की तुलना में कुछ और डमी-सबूत चाहते हैं।

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

    7

    व्यवसाय नियमों के लिए एक ग्राफिकल भाषा एक अच्छा विचार नहीं है। मैं इससे बचूंगा बिजनेस नियमों में बहुत सारे चेक और लूप हैं, जो अच्छी तरह से कल्पना नहीं करते हैं।

    व्यवसाय नियमों का वर्णन करने के लिए आप एक पाठ्य भाषा के साथ बहुत बेहतर हैं।

    संपादन कोड के लिए एक phenomenial उपयोगकर्ता अनुभव प्राप्त करने के लिए आप की जरूरत:

    1. अच्छा त्रुटि वसूली के साथ एक पार्सर
    2. वृद्धिशील फिर से संकलन

    अच्छा त्रुटि वसूली करने की क्षमता की अनुमति देता है व्यवस्थित रूप से अपूर्ण संरचनाओं से प्रोग्रामर इरादे को प्रभावी रूप से निर्धारित करने के लिए। इंटेलिजेंस लागू करने के लिए यह महत्वपूर्ण है।

    वृद्धिशील-पुनर्मूल्यांकन करने की क्षमता आपको उपयोगकर्ता संपादन के जवाब में प्रभावी पृष्ठभूमि संकलन करने की क्षमता प्रदान करती है।

    अच्छी त्रुटि पुनर्प्राप्ति प्राप्त करने का सबसे आसान तरीका है अपने पार्सर को हाथ से लिखना। सिंटैक्स त्रुटियों की उपस्थिति में क्या करना है, यह जानने के लिए, आप जिस भी मात्रा को आगे देख सकते हैं, या अल्गोरिदमिक नियमों का उपयोग कर सकते हैं।

    आप अपने पार्सर बनाने के लिए एक पार्सर जेनरेटर का उपयोग करते हैं, तो आप बहुत लचीलापन ढीला वाक्यविन्यास त्रुटियों से निपटने में। वह लचीलापन एक अच्छा इंटेलिजेंस एक्सपेरियंस और एक कैरेपी के बीच का अंतर बनाता है। इसलिए, मैं अनुशंसा करता हूं कि आप इसे रिकर्सिव वंश का उपयोग करके हाथ से लिख लें।) 1 ठीक से (चरणों में अर्थगत विश्लेषण टूट कुछ की तरह सी # इस होगा:

    कुशल फिर से संकलन को लागू करने में सक्षम हो की आवश्यकता है पहले नाम स्थान और प्रकार प्रतीकों का निर्माण, तो बयानों का उपयोग कर हल, तो आधार हल कक्षाएं, आदि)। 2) निर्भरता ग्राफ प्रसंस्करण, और उपयोगकर्ता के जवाब में यह के कुछ हिस्सों अमान्य के लिए एक चरण-अवगत निर्भरता ग्राफ 3) एल्गोरिदम का निर्माण करने की क्षमता को संपादित करता

    पूर्ण flegged कार्यक्रमों की भाषा के लिए, को लागू करने फिर से संकलन प्राप्त कर सकते हैं वास्तव में मुश्किल है। आपके मामले में, क्योंकि आप व्यवसाय नियमों का वर्णन कर रहे हैं, यह आपके लिए बहुत सरल हो सकता है (या यदि संकलन पर्याप्त तेज़ है तो आपको इसकी आवश्यकता भी नहीं हो सकती है)।

    तो, मैं पार्सर से शुरू करूंगा, और फिर इसके शीर्ष पर इंटेलिजेंस का निर्माण करूंगा।

    यदि आप वीएस एकीकरण से बच सकते हैं, तो मैं चाहता हूं। वीएस में एकीकृत करने के लिए बहुत सारी नलसाजी की आवश्यकता होती है, और इंटरऑप सिरदर्द का कारण बन सकता है। ऐसी कुछ कंपनियां हैं जो विंडोज़ फॉर्म एडिटर नियंत्रण बेचती हैं जिन्हें आप अपने पार्सर को हुक करते हैं। वीएस की तुलना में एकीकृत करना बहुत आसान है।

    +0

    लूप्स ग्राफिकल बनाने के लिए लगभग कठिन नहीं हैं क्योंकि वे गैर-प्रोग्रामर को समझाते हैं। मैंने भारी लूपिंग वाले ग्राफिकल भाषाओं में लिखा है और जब आप इसे ध्वनि बनाते हैं तो वे लगभग उतना ही खराब नहीं होते हैं। उदाहरण के लिए एनवॉक्स सीडीपी। गैर-कोडर के लिए, हल का मतलब कोई वाक्यविन्यास त्रुटियां नहीं है। – user54650

    +0

    यदि कोई इसे पूर्ववत करने में सक्षम नहीं है: foreach (ग्राहक सूची में ग्राहक) { गणना FicoScore (ग्राहक); } वे कभी भी इसके ग्राफिक प्रतिनिधित्व को समझने में सक्षम कैसे होंगे। लूप के साथ वे कठिन हिस्सा अवधारणा है, जिस तरह से यह प्रदर्शित नहीं होता है। –

    +0

    पार्सर जनरेटर का उपयोग करते समय त्रुटि वसूली के साथ अधिकांश कठिनाई अस्पष्टताओं से उत्पन्न होती है (जिसमें शिफ्ट-कमी और कम-से-कम संघर्ष शामिल हैं) जो एलआर और एलएएलआर पार्सर्स खराब तरीके से संभालते हैं। जीएलआर एल्गोरिदम (जैसा कि एमएस ओस्लो द्वारा उपयोग किया जाता है) इसे प्राकृतिक तरीके से बहुत अधिक हल करता है। – Bevan

    7

    एक और संभवतः दिलचस्प विकल्प F # उद्धरणों का उपयोग करना है।

    कोटेशन आप डेटा के रूप में कार्यक्रम के हिस्से के इलाज के लिए अनुमति देते हैं, तो आप एएसटी प्राप्त कर सकते हैं, यह विश्लेषण और अन्य भाषा में अनुवाद या कुछ गैर मानक तरीके से निष्पादित करें। एफ # की लचीलापन के साथ, आपको कई चीजों को व्यक्त करने में सक्षम होना चाहिए, इसलिए आपको नियमों का वर्णन करने के लिए आंतरिक एफ # डीएसएल/संयोजक पुस्तकालय विकसित करना होगा और उन्हें चलाने के लिए एफ # उद्धरणों के लिए अनुवादक/दुभाषिया विकसित करना होगा।

    एक bussines शासन कैसा लग सकता है कि कैसे है, लेकिन आप कुछ इस तरह लिख सकता है सुनिश्चित नहीं हैं:

    let rule = <@ 
        if (exists customer having validEmail) then success 
        else require whatever 
    @> 
    

    मैं अपने ब्लॉग पर इस विषय के परिचय में लिखा था। दुर्भाग्यवश, एफ # सीटीपी में कुछ बड़े बदलाव हुए हैं और मैंने अभी तक स्रोत कोड अपडेट नहीं किया है, लेकिन यह आपको इस दृष्टिकोण की & की संभावनाओं के बारे में एक अच्छा विचार देना चाहिए।

    डीएसएल का एक अच्छा उदाहरण एफ # इकाई परीक्षण framewrok है:

    [संपादित करें] सिर्फ यह स्पष्ट करने के लिए कि मुझे क्यों लगता है

    • आप DSLs editting के लिए दृश्य स्टूडियो का उपयोग करें (और आप मुक्त करने के लिए स्थापित एफ # के साथ शैल संस्करण का उपयोग कर सकते हैं), तो आप मुक्त करने के लिए एक बहुत अच्छा संपादन अनुभव मिल जाएगा: एक अच्छा तरीका हो सकता है। न केवल सिंटैक्स हाइलाइटिंग, बल्कि इंटेलिसेन्स भी संभावित संरचनाओं का सुझाव देगा और एक पृष्ठभूमि प्रकार-जांच जो आपके डीएसएल के लिए 'व्याकरण' चेकर के रूप में कार्य करता है।
    • अन्य दृष्टिकोणों की तुलना में यह शायद लागू करने के लिए सबसे आसान है।
    • एकमात्र सीमा यह है कि आप एफ # वाक्यविन्यास से बंधे हैं। हालांकि, अपनी खुद की भाषा को डिजाइन करना वाकई मुश्किल है, इसलिए यह इतना बुरा नहीं हो सकता है। विशेष रूप से एफ # की लचीलापन दी गई।

    [/ संपादित करें]

    आशा इस मदद करता है!

    3

    मैं बू का उपयोग करता हूं, मुझे लगता है कि यह वर्तमान में डीएसएल निर्माण के लिए सबसे लचीला उपकरण है। विषय के बारे में very good book है। Ayende's और Rodrigo's ब्लॉग भी अच्छी प्रेरणा हैं।

    आईडीई के बारे में, आप SharpDevelop का विस्तार कर सकते हैं, this पर एक नज़र डालें।

    2

    जेटब्रेन्स Meta Programming System

    आप ताकि उन DSLs के साथ काम बहुत आसान हो जाता है, किसी भी नई भाषा के लिए कस्टम भाषा संपादकों और अन्य सीमाओं को परिभाषित कर सकते हैं। डोमेन विशेषज्ञ जो पारंपरिक प्रोग्रामिंग से परिचित नहीं हैं, वे डोमेन-विशिष्ट शब्दावली का उपयोग करके एमपीएस में अपनी डोमेन-विशिष्ट भाषाओं के साथ आसानी से काम कर सकते हैं।

    1

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

    वर्तमान में कम से कम जावास्क्रिप्ट (मेरे लिए बहुत रोमांचक) और पायथन, शायद अन्य में ओमेता कार्यान्वयन हैं। सी #, Jeff Moser एक पर काम कर रहा है, जिसे आप his blog पर पढ़ सकते हैं और CodePlex पर देख सकते हैं। शुभकामनाएँ।

    3

    डीएसएल के सीम बनाने के लिए मानक उपकरण ANTLR होने के लिए मानक उपकरण - यह एक शक्तिशाली लेक्सर/पार्सर जनरेटर है जो संकलक आउटपुट के लिए बहुत सी लक्षित भाषाओं के साथ है। इसमें सी #, जावा, सी/सी ++, पायथन इत्यादि के लिए बैकएंड हैं। (code generation targets सूची देखें) और आपको आसानी से अपनी लक्षित भाषा में अपने कंपाइलर में कस्टम कोड इंजेक्ट करने देता है।

    एक बहुत शक्तिशाली आईडीई (एएनटीएलआरवर्क्स) और बहुत सारे दस्तावेज भी हैं। (एएनटीएलआर के लेखक टेरेंस पारर से The Defenitive ANTLR Reference देखें) संदर्भ के लिए कौन और इसका उपयोग करता है Testimonlals पृष्ठ देखें।

    आपको अभी भी आईडीई के लिए अधिकांश नलसाजी करने की आवश्यकता है, लेकिन एएनटीएलआर से आपको मजबूत कंपाइलर ढांचे के बारे में यह बहुत आसान होना चाहिए। यह यहां पोस्ट किए गए अधिकांश समाधानों का मामला होना चाहिए ...

    मैं वर्तमान में एएनटीएलआर के साथ लिखित एक कंपाइलर का उपयोग कर रहा हूं ताकि हमारे स्वयं के डीएसएल को सी/सी ++ आउटपुट में प्रीप्रोसेस कर सकें और इससे बहुत खुश हूं। विज्ञापन का पर्याप्त, आपको इसे अपने लिए आजमाएं :) मज़े करो!

    0

    रूबी डीएसएल बनाने के लिए एक महान भाषा है। उदाहरण के लिए Rake रूबी के साथ लिखी गई एक बिल्ड स्क्रिप्ट डीएसएल है।

    आगामी IronRuby के साथ स्क्रिप्ट लिखना संभव है जो आपके सी # कोड को सीधे कॉल करें।

    Here'ssomearticles रूबी में डीएसएल लिखने पर।

    1

    बू + OMeta = Boo.OMeta.Parser

    वर्तमान पार्सर विकास किया जा रहा है लेकिन यह पहले से ही जटिल बाहरी DSLs के निर्माण के लिए इस्तेमाल किया जा सकता। ओमेटा शक्तिशाली उपकरण है जो प्रोग्रामर को आसानी से व्याख्यात्मक विश्लेषक और पार्सर्स को लागू करने में सक्षम बनाता है। बू के विस्तारणीय कंपाइलर पाइपलाइन आर्किटेक्चर Boo.OMeta.Parser के साथ मानक Boo.Parser को प्रतिस्थापित करने की अनुमति देता है। इसका उपयोग लगभग किसी भी प्रकार के वाक्यविन्यास के साथ बू वाक्यविन्यास को बढ़ाने के लिए किया जा सकता है। उदाहरण here मिल सकता है।

    1

    मेरी परियोजना meta# इस समस्या को हल करने का प्रयास कर रहा है।

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