7

हम क्रॉ-कटिंग-चिंताओं के लिए जगह रखने के लिए ग्रोवी स्क्रिप्ट के लिए तंत्र शामिल करना चाहते हैं।क्या ग्रोवी एक तंत्र प्रदान करता है?

मेरे उदाहरण में हमारे पास वेब सेवा एंड्रॉइंट्स ग्रोवी स्क्रिप्ट के रूप में हैं और हमारे वेब सेवा प्रोटोकॉल पर लॉग इन करना चाहते हैं। इसके लिए हम लॉगिंग स्टेटमेंट बनाने के लिए हमारी अंतर्निहित वस्तु (हमारे ढांचे से प्राप्त) का उपयोग करते हैं।

लेकिन यह बॉयलरप्लेट कोड है यदि हम इसे हर वेब सेवा एंडपॉइंट में कोड करते हैं।

हम php में शामिल() जैसे कुछ खोज रहे हैं, जिसमें अन्य ग्रोवी स्क्रिप्ट शामिल हैं, क्या कोई विचार है कि यह कैसे करें? मूल्यांकन (फाइल) समारोह में

उत्तर

1

आप पहले ही उल्लेख के बाद से "पार काटने-चिंताओं" मैं कहेंगे कि आप अपने वेब सेवा को बीच में रोकने की जरूरत है कॉल AOP शैली (तंत्र शामिल नहीं है)।

Grails पूरी तरह से Spring framework के साथ एकीकृत है, इसलिए यह स्प्रिंग एओपी सुविधाओं का शोषण करने के लिए एक अच्छा विकल्प बनाता है। Grails आधिकारिक गाइड से इस अध्याय पर एक नज़र डालें: http://grails.org/doc/latest/guide/14.%20Grails%20and%20Spring.html और शब्द AOP के लिए खोज।

शायद एओपी करने के लिए purely groovy way है, लेकिन मैं grails और वसंत के साथ जाना होगा।

1

देखो:

Object evaluate(File file) 

http://groovy.codehaus.org/api/groovy/lang/Script.html

+1

बेकार अगर आप स्क्रिप्ट ऑब्जेक्ट को बनाने या प्राप्त करने की व्याख्या नहीं करते हैं, क्योंकि वह वर्ग सार है। – Blaine

+0

आम तौर पर जो कोड इसे कॉल करेगा उसे अज्ञात 'स्क्रिप्ट' उपclass के उदाहरण के लिए संकलित किया गया है। –

10

ग्रोवी अपनी फाइलों को ऑब्जेक्ट्स के रूप में मानता है (इसे स्वचालित रैपिंग के रूप में सोचें)। और यह कक्षाओं के रूप में उपलब्ध जावा क्लासपाथ के भीतर सभी। ग्रोवी फाइलें बनाता है।

def static AuxMethod() { 
    return "Hello World" 
} 

अन्य फ़ाइल से यह कॉल करने के लिए आप सिर्फ लिखने:

println util.AuxMethod() 

यह है कि यदि आप फ़ाइल util.groovy है, कि इस अंदर की तरह कुछ में शामिल है। दोबारा, बस सुनिश्चित करें कि आपकी use.groovy फ़ाइल क्लासपाथ में है।

+0

मुझे संदेह है कि केवल तभी काम करता है जब आपकी ग्रोवी स्क्रिप्ट ऑब्जेक्ट उन्मुख कक्षाएं हों। नियमित कार्यात्मक स्क्रिप्ट के साथ, शायद काम नहीं करता है? – djangofan

+2

उदाहरण केवल कम से कम विंडोज से काम करता है, अगर use.groovy स्क्रिप्ट का नाम पूंजीकरण Util.groovy के साथ बदल दिया गया है, और संदर्भ संगत रूप से 'println Util.AuxMethod()' – Blaine

+3

में बदल गया है मेरी पिछली टिप्पणी का पालन करें। यह यूनिक्स पर भी लागू होता है। तब तक काम नहीं करता जब तक कि मैं "उपयोग" का नाम "उपयोग" नहीं करता। इसके अलावा, अधिकांश अनुभव जावा + ग्रोवी डेवलपर्स जावा सम्मेलनों के अनुरूप विधि घोषणा लिखेंगे: स्थिर def auxMethod। अर्थात। टाइप नाम से पहले "स्थैतिक" और सभी विधियां लोअर-केस से शुरू होती हैं (उदाहरण के लिए java.util.Collections में स्थिर विधियों के टन देखें)। – Blaine

2

वर्तमान स्क्रिप्ट से स्क्रिप्ट u.groovy आह्वान करने के लिए, u.groovy करने के लिए मूल तर्क के साथ गुजर, जाहिर है चलाने

run(new File('u.groovy'), args) 

, आप भी किसी भी स्ट्रिंग युक्तियों के लिए है कि आप चाहते हैं भेज सकते हैं:

run(new File('u.groovy'), 
     ['one', new File('two.text').absolutePath] as String[]) 
1

मैंने इस पर कुछ डोमेन विशिष्ट भाषा बनाने के लिए कुछ शोध किया था। तीन संभावनाएं हैं:

  1. माता-पिता ग्रोवी कक्षा को विरासत में प्राप्त करने के रूप में अपनी कक्षाएं बनाएं। अपने साझा कोड को बेस क्लास में रखें।

  2. स्क्रिप्टबेस क्लास का उपयोग करें http://groovy.codehaus.org/Embedding+Groovy देखें। यह एक वर्ग है जिस पर आपकी सभी स्क्रिप्ट तैयार की जाएंगी।

  3. आयात स्थिर विधियों की क्षमता का उपयोग करें। ध्यान दें कि आप इसे जावा कंटेनर के अंदर कर सकते हैं (http://mrhaki.blogspot.com/2011/06/groovy-goodness-add-imports.html देखें)।

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

बेशक

, इन सभी वस्तुओं के साथ काम करता है, तब भी आप वास्तव में कॉल करने के लिए की आवश्यकता होगी आपके ग्रोवी कोड में सामान्य विधि। उदाहरण के लिए:

doCommonStuff(); 
. 
. do the rest of it here 
. 

यह बहुत भयानक नहीं है, मुझे नहीं लगता। निश्चित रूप से कुछ प्रकार के # अंतर्निहित प्री-प्रोसेसर कथन को जोड़ने के बारे में।

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

import static com.mycompany.mycode.doCommonStuff 
doCommonStuf() 
. 
. do the rest of it here 
.