2009-03-19 14 views
6

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

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

क्या किसी के पास इस तरह की कुछ सिफारिश है, एक डीएसएल/भाषा मैं इसे कर सकता हूं, और क्या किसी को इस तरह के बारे में कोई अनुभव है?

उत्तर

5

यह आसानी से ANTLR के साथ किया जा सकता है। यदि आउटपुट पर्याप्त समान है तो आप टेक्स्ट टेम्पलेटिंग तंत्र का उपयोग कर सकते हैं-अन्यथा यह आपके लिए ट्रैवर्स के लिए एक सार वाक्यविन्यास पेड़ उत्पन्न कर सकता है।

5

मैंने एक ऐसी प्रणाली देखी है जो कस्टम कोड को प्रभावित किए बिना कोड के पुनर्जनन की अनुमति देने के लिए आंशिक कक्षाओं और आंशिक तरीकों का उपयोग करती है। "नियम इंजन" यदि आप पूरी तरह से एक Visio राज्य आरेख से उत्पन्न किया गया था। यह मूल रूप से गरीब मनुष्य वर्कफ़्लो है लेकिन संशोधित करना बहुत आसान है। Viso आरेख को एक्सएमएल में निर्यात किया गया था जिसे कक्षाओं को उत्पन्न करने के लिए पावरहेल और टी 4 का उपयोग करने में पढ़ा गया था।

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

कोड और पत्रिका से यह article on DSLSs काफी अच्छा है।

उपर्युक्त लिंक में नील फोर्ड आपको दिखाता है कि एक धाराप्रवाह इंटरफेस का उपयोग करके सी # में एक आंतरिक डीएसएल कैसे बनाया जाए।

एक बात जिसने अभी तक इसका उल्लेख नहीं किया है वह यह है कि आप अपनी विधियों [EditorBrowsable (EditorBrowsableState.Never)] को अपनी विधियों पर डाल सकते हैं ताकि वे इंटेलिजेंस में दिखाई न दें। इसका मतलब यह है कि आप डीएसएल के उपयोगकर्ता से कक्षा पर विधियों को गैर-डीएसएल (यदि आप करेंगे) छुपा सकते हैं, जो धाराप्रवाह एपीआई को और अधिक खोजने योग्य बनाता है।

आप देख सकते हैं एक धाराप्रवाह इंटरफ़ेस बाहरी DSLs आप भी Oslo (CTP at the moment) का विकल्प होता है के विषय पर TDD

के साथ एक आईओसी कंटेनर लिखने पर Daniel Cazzulino द्वारा इस वीडियो श्रृंखला में लाइव लिखा जा रहा है जो यह की क्षमता में काफी शक्तिशाली है आपको बाहरी डीएसएल बनाने की अनुमति देता है जिसे कोड पीढ़ी के उपयोग के बजाय सीधे निष्पादित किया जा सकता है, जो इसके बारे में सोचने के लिए आता है, वास्तव में डीएसएल का बहुत अधिक नहीं है।

+1

बहुत सारे पूर्ण उड़ाए गए कंपाइलर वास्तव में कोड जेनरेटर हैं। मूल सी ++ कंपाइलर, सीफ्रंट, सीधे सी कोड उत्पन्न हुआ, और एफिल जाने से पहले एफिल और हास्केल भी सी को संकलित करता है। –

+0

सभी कंपाइलर कोड जेनरेटर हैं, वे शायद मानव-अनुकूल कोड उत्पन्न नहीं कर सकते हैं। यहां तक ​​कि मशीन कोड निर्देश आमतौर पर प्रोसेसर के भीतर एम्बेडेड माइक्रोक्रोड द्वारा व्याख्या किए गए उच्च स्तर के निर्देश होते हैं। –

1

मुझे लगता है कि आप सही रास्ते पर हैं।

मैं इस तरह की स्थिति में आमतौर पर जो करता हूं वह एक साधारण भाषा है जो मेरी आवश्यकताओं को कैप्चर करता है और इसके लिए एलएल 1 (रिकर्सिव डेसेंट) पार्सर लिखता है।

यदि भाषा में गैर-तुच्छ सी # वाक्यविन्यास होना चाहिए, तो मैं या तो इसे उद्धृत कर सकता हूं, या इसे केवल उन ब्रैकेट में लपेट सकता हूं जिन्हें मैं पहचान सकता हूं, और इसे आउटपुट कोड के माध्यम से पास कर सकता हूं।

मैं या तो इसे एक पार्स पेड़ संरचना उत्पन्न कर सकता हूं, और उस से 3 अलग-अलग प्रकार के कोड उत्पन्न कर सकता हूं, या मैं इसे फ्लाई पर कोड उत्पन्न कर सकता हूं, या तो 3 मानों के साथ एक मोड वैरिएबल का उपयोग कर सकता हूं, या बस एक साथ 3 अलग आउटपुट फाइलों को कोड लिखें।

ऐसा करने के एक से अधिक तरीके हैं। यदि आप पार्सर्स लिखने से डरते हैं (जैसे कुछ प्रोग्रामर हैं), तो एसओ पर कहीं और मदद है।