2008-09-27 3 views
9

क्या आप कोड-पीढ़ी के औजारों का उपयोग करते हैं (उन लोगों से जो प्रॉक्सी उत्पन्न करते हैं और दृश्य स्टूडियो में निर्मित डिजाइनरों से)?क्या आप कोड जनरेशन टूल का उपयोग करते हैं?

आपके आवेदन का कौन सा हिस्सा उत्पन्न होता है?

क्या आप आम तौर पर अपना खुद का जनरेटर रोल करते हैं? यदि हां, तो आप किस प्रकार का जनरेटर लिखते हैं (एएसपी टेम्पलेट्स, कोडडम इत्यादि)। यदि नहीं, तो आप किस तीसरे पक्ष के उपकरण का उपयोग करते हैं?

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

उत्तर

9

मैं दार्शनिक शिविर में हूं जो कोड जेनरेटर को "गलत" मानता है, क्योंकि वे कुछ ऐसा इंगित करते हैं जो भाषा का हिस्सा बनना चाहिए।

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

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

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

हम CodeSmith का उपयोग कर हमारे डेटाबेस में सभी तालिकाओं के लिए .NetTiers वर्गों उत्पन्न करने के लिए कोशिश की, लेकिन दो मुद्दों में भाग:

  1. .NetTiers फूला हुआ था, और कोड उत्पन्न भारी था। मुझे लगता है कि कोड जनरेशन टूल इसे जीवित प्राणी के लिए बहुत आसान बनाते हैं।

  2. क्योंकि स्कीमा को सक्रिय रूप से विकसित और संशोधित किया जा रहा था, इसलिए हमें भी बहुत कुछ पुनर्जीवित करना पड़ा, और यह सब कुछ स्रोत नियंत्रण में रखना बहुत मुश्किल हो गया क्योंकि सभी फाइलों को पुनर्जीवित और प्रतिस्थापित किया जा रहा था। अगर स्रोत कोड में होने के लिए जेनरेट कोड होना चाहिए तो मैं अनिश्चित हो गया।

कोड उत्पादन के लिए सबसे अच्छी जगह संकलक या निर्माण चरण में होनी चाहिए, डिजाइन चरण नहीं। जब आप किसी अज्ञात प्रकार या सी # में विधि का उपयोग करते हैं, तो कंपाइलर फ्लाई पर कोड पीढ़ी कर रहा है। यदि आप डिज़ाइन चरण के दौरान कोड उत्पन्न करते हैं, तो आपको सामान का एक हिस्सा मिल जाता है जिसे प्रत्येक अंतर्निहित पैरामीटर बदलते समय पुन: उत्पन्न किया जाना चाहिए।

+0

आपके पास एक बहुत ही रोचक परिप्रेक्ष्य है। मैं वर्तमान में उस परियोजना के साथ उसी स्रोत नियंत्रण समस्याओं से निपट रहा हूं जो मैं वर्तमान में काम कर रहा हूं। हम इन-हाउस कोड-जेन टूल का उपयोग करते हैं। हर बार एक स्कीमा बदलता है, हम संग्रहित प्रक्रियाओं से सबकुछ फिर से उत्पन्न करने के लिए मजबूर होते हैं। आपके पास क्या समाधान है? – Micah

+0

उस मामले में, समाधान ओआरएम और कोड जनरेटर को पूरी तरह से छोड़ना था। हमने पाया कि यह एक प्रणाली के लिए एन-स्तरीय डिज़ाइन का उपयोग करने के लिए प्रतिकूल था जो इसकी आवश्यकताओं को खोज रहा था क्योंकि इसे विकसित किया जा रहा था। –

+0

या एनएचबीर्नेट के मामले में, स्पॉक्स को छोड़ दें और पूरी तरह से डीएएल उत्पन्न करें .. यह मेरे लिए सबसे अच्छा काम करता है – therealhoff

1

हम अपने एनएचबीर्नेट एचबीएमएस, हमारी संस्थाओं और कुछ अन्य चीजों को उत्पन्न करने के लिए कोडस्मिथ का उपयोग करते थे। थोड़ी देर के बाद हम इस प्रवाह के बीमार हो गए, इसलिए हमने इसे हटा दिया।

टी 4 जनरेटर मुक्त और पीढ़ी के लिए देखने लायक है।

हम अभी भी मोनोरेल लिंक पीढ़ी के लिए कैसल कोड जेनरेटर का उपयोग करते हैं।

+0

जब आप कहते हैं कि "इस प्रवाह से बीमार हो गया" तो आपका क्या मतलब है? धन्यवाद! – Micah

+0

वैसे प्रवाह प्रवाह/एक यूएमएल उपकरण शुरू हुआ। एक नई इकाई जोड़ने के लिए यूएमएल उपकरण में जाना एक दर्द था। आईडीई से ऐसा करना ज्यादा स्वाभाविक था। –

0

हमारे पास एक इन-हाउस निर्मित कोड जनरेटर है जो डेटाबेस पहुंच का ख्याल रखता है। एक संग्रहित प्रक्रियाओं को लिखता है और गेटवे कक्षा में समेकित संबंधित तरीकों को प्राप्त करता है।

हम फ्लैश के साथ सही तरीके से इंटरफेस करने के लिए वेब सेवाएं भी उत्पन्न करते हैं - यानी एक सौहार्दपूर्ण तरीके से अपवाद को संभालना।

अंत में हम एक अपवाद जनरेटर है कि अपवाद सर्वोत्तम प्रथाओं के कठिन परिश्रम (निर्माताओं की टन, आदि ...) दूर ले जाता

+0

क्या आप अपवादों के लिए जनरेटर का उपयोग कैसे कर सकते हैं? मैं सिर्फ उत्सुक हूं कि वास्तव में स्थिति क्या थी और आपके जनरेटर ने क्या किया। धन्यवाद! – Micah

+0

हम अपवाद के नाम और कुछ अन्य पीढ़ी के पैरामीटर के साथ संसाधन फ़ाइल का उपयोग करते हैं। फिर हम एक एक्सएसएलटी के साथ कोड उत्पन्न करते हैं। – Sklivvz

0

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

5

मैंने क्लासिक एएसपी काम (लगभग 2001) कर रहे थे जब मैंने अपने जेनरेटर (डेटा एक्सेस, स्पॉक्स, आदि) को वापस शुरू करना शुरू किया। मैं धीरे-धीरे कोडस्मिथ चले गए, क्योंकि इससे निपटना बहुत आसान था। मैं अभी भी मुख्य रूप से बस अपने .NET कोड के लिए सभी डेटा एक्सेस परत प्रकार सामग्री (sprocs सहित) उत्पन्न कर रहा था।

कुछ साल पहले, मैंने मैक्रो कोड जनरेशन (यानी कोडस्मिथ) से माइक्रो कोड जनरेशन में कूद किया था।

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

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

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

इसके अलावा, मैं एक बड़ी इकाई परीक्षण सूट, अन्य बातों के

22

हाँ के बीच होने का लाभ प्राप्त है, लेकिन हम इंटर्न के रूप में उन्हें देखें।

+1

एक अस्पष्ट सवाल पूछें, एक मजेदार जवाब प्राप्त करें। आप डाउन-मोडेड होने के लायक नहीं थे। अगर मैं 500 से 1 बिंदु नहीं था, तो मैं इसे ठीक कर दूंगा। – MusiGenesis

+0

आपके लिए तय किया गया है :) – tloach

+1

जब मैंने इसे पढ़ा तो मैंने लॉल किया। –

0

हमने अभी कार्यालय में Grails का उपयोग शुरू किया। पहले, हमारे पास घर में जेएसएफ/हाइबरनेट सीआरयूडी पीढ़ी स्क्रिप्ट का एक सेट था।

... Grails जीतता है। Grails से कोड पीढ़ी बहुत अच्छी है और वास्तव में कोड फ़ाइलों में कोड डाले बिना, आप लगभग 15 मिनट में एक सीआरयूडी ऐप जा सकते हैं!

बेशक, यह कोड फ़ाइलों में वास्तविक कोड उत्पन्न कर सकता है, जब आप इसे संशोधित करना चाहते हैं। अधिकांश समय, नियमित सीआरयूडी के लिए, आप केवल विचारों को बदलने के साथ दूर हो सकते हैं।

1
  1. हम अपवाद CRUD संचालन के लिए
  2. उत्पन्न डीएओ
  3. उपयोग JAXB कोड
  4. genereate करने के लिए कोड जनरेटर का उपयोग
  5. उपयोग XDoclet EJB स्थानीय/घर इंटरफेस genereate को
  6. उपयोग वेग टेम्पलेट के लिए प्रलेखन उत्पन्न करने के लिए व्यापार मॉडल
  7. डब्ल्यूएसडीएल स्टब्स उत्पन्न करने के लिए अपाचे एक्सिस का उपयोग करें
0

मैंने धारावाहिक डेटा ऑब्जेक्ट्स उत्पन्न करने के लिए एक का उपयोग किया है जिसे विभिन्न प्लेटफार्मों (विंडोज़, लिनक्स, सोलरिस, मैक, बीएसडी, आदि) में सुधार किया जा सकता है। यह एक घर का समाधान था।

1

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

0

मैंने एक प्यारा टूल लिखा जिसमें डेटा प्रारूप में विशेषज्ञों ने एक पार्सर लिखा था, वे अपने फॉर्म को वेब फॉर्म के माध्यम से सबमिट कर सकते थे, आउटपुट देख सकते थे, और मुझे बता सकते थे कि यह सही था या नहीं।

उस से, एक जुनीट परीक्षा उत्पन्न की जाएगी। लवली।

सिवाय इसके कि एक व्यक्ति को इसका उपयोग करने के लिए परेशान नहीं किया गया, और मैंने कोई परीक्षण केस एकत्र नहीं किया।

1

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

5

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

<ActiveRecord("Kiwi")> _ 
Class CKiwi 
End Class 

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

0

कुछ अन्य लोगों की तरह, हमने डेटा एक्सेस, एचटीएमएल फॉर्म हैंडलिंग और कुछ व्यावसायिक तर्क परिचालनों के लिए अपना कोड जनरेटर (इनोन डाटामानगर/व्यूमेनगर) भी बनाया है। इस काम को अच्छी तरह से रखने की कुंजी इसे डिज़ाइन करना है ताकि आपको जेनरेट कोड को कभी भी स्पर्श न करना पड़े।

इस तरह, यह लगभग भाषा का हिस्सा बन जाता है - भाषा (हमारे मामले में जावा) को डोमेन मॉडल विनिर्देश और व्यूमोडेल शामिल करने के लिए बढ़ाया गया है, और फिर आप वास्तविक जावा कोड के साथ कस्टम व्यापार तर्क भरें ।

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

4

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

1

होम-ब्रूड कोड जनरेटर अंत उपयोगकर्ता स्प्रैडशीट्स से अनजान मामलों के निर्माण के लिए बहुत अच्छा काम करते हैं जिसमें कार्य के उदाहरण शामिल हैं।

एक उदाहरण के लिए Tooling to Build Test Cases देखें।

6

नहीं कि हम .NET/वेब डोमेन में काम कर रहे हैं, लेकिन विभिन्न घरेलू-डिजाइन भाषाओं से घर से बना कोड पीढ़ी के उपकरण हमारी विकास उपकरण श्रृंखला का एक महत्वपूर्ण हिस्सा हैं। हमारे पास दो प्रमुख ऐसे टूल्स हैं (व्याकरण और पार्सर्स और औपचारिक परिभाषाओं के साथ), और एम 4 और पर्ल जैसे मैक्रोज़ पर निर्मित नाबालिग एक मेजबान। वे सभी अंत में सादा सी उत्पन्न करते हैं, जिसे मूल रूप से संकलित किया जाता है।

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

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

+0

मैं कोड पीढ़ी के बारे में आपको दूसरा स्थान देता हूं। यह बेहतर नहीं कहा जा सका! –

1

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

0

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

0

मैंने एक एक्सएसएलटी आधारित कोड जनरेशन टूल लिखा और उपयोग किया। http://perfectstorm.codeplex.com/

यह दाल, procs, टेबल उत्पन्न करने के लिए एक एकल रूट xml मॉडल का उपयोग करता है।

0

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