2011-10-10 15 views
8

मैं क्लोजर और RESTEasy का उपयोग कर एक जेएक्स-आरएस रीस्ट सर्वर डिजाइन कर रहा हूं।क्लोजर "डीएसएल" प्रोग्रामिंग

यह मेरी समझ है कि लिस्प-पारिवारिक भाषाओं में लिखे गए अनुप्रयोग "पारंपरिक" अनिवार्य भाषाओं में से अधिक हैं, जो "डोमेन-विशिष्ट भाषाओं" के रूप में बने हैं। एप्लिकेशन को "शीर्ष" स्तर पर, अधिक से अधिक "परिष्कृत" फ़ंक्शंस के रूप में नीचे-ऊपर से डिज़ाइन किया गया है, एप्लिकेशन बहुत उच्च स्तरीय फ़ंक्शंस में फ़ंक्शन कॉल की श्रृंखला बन जाता है।

मैं अपने आरईएसटी सर्वर के लिए ऐसा करने की कोशिश कर रहा हूं, जो संसाधन वर्गों से शुरू होता है जो सेवा यूआरएल अनुरोध (प्राप्त करें, पोस्ट करें, हटाएं, हटाएं)।

(ns com.example.server.resources.buildtime 
    (:import [javax.ws.rs CookieParam GET Produces Path] 
      [javax.ws.rs.core Context Cookie NewCookie Response UriInfo] 
      [org.jboss.resteasy.annotations.providers.jaxb Formatted])) 

(definterface BuildTime 
    (getBuildTime [^javax.ws.rs.core.UriInfo info 
       ^javax.ws.rs.core.Cookie security-cookie])) 

(deftype 
    ^{Formatted true} 
    BuildTimeResource [] 
    BuildTime 
    (^{GET true 
    Path "/buildtime" 
    Produces ["application/json"]} 
    getBuildTime 
    [this info security-cookie] 
    (.. (Response/ok "20111009") build))) 

इस संसाधन एक स्ट्रिंग (JSON पैकेज में संलग्न) के रूप में देता है सर्वर का निर्माण समय था जब यूआरएल "/ buildtime" मिल http विधि के साथ में कहा जाता है:

यहाँ मेरा पहला स्रोत है।

मैं इन संसाधन वर्गों और संलग्न तरीकों में से अधिकतर लिखूंगा (अधिकांश वर्गों में एक से अधिक विधि होंगे), प्रत्येक definterface और deftype के साथ। यह मैक्रोज़ के लिए एकदम सही उपयोग की तरह लगता है।

मैं डीएसएल के रूप में यह कैसे किया जा सकता है इसके लिए सुझाव मांग रहा हूं। डीएसएल के मामले में कोई सोचने के बारे में कैसे जाता है?

+3

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

+1

क्या आप compojure के बारे में जानते हैं? https://github.com/weavejester/compojure यह एक डीएसएल प्रदान करता है जो आपके मन में नहीं दिखता है। मुझे यह आलेख भी मिला है http://pragprog.com/magazines/2011-07/growing-a-dsl-with-clojure 'dsl-mode' में जाने के लिए सहायक है। लेकिन एक अच्छा डीएसएल के साथ आने से कोई आसान काम नहीं लगता है ... – Paul

+0

@ पॉल: मैंने कंपोजर माना। हमारे पास पहले से ही एक बड़ा आरईएसटी सर्वर है जो रीस्टेसी/जावा में लिखा गया है। यदि मैं एक ढांचे का उपयोग करता हूं जिसके साथ हम परिचित हैं, तो संगठन में एक नया क्लोजर-आधारित एक आसान कम प्रतिरोध प्राप्त करेगा। इसके अलावा, जेएक्स-आरएस में कुछ बहुत अच्छी विशेषताएं हैं। – Ralph

उत्तर

3

अगर मैं इसे उपक्रम कर रहा था, तो मुझे लगता है कि मैं रीस्टेसी के लिए एक रिंग एडाप्टर बनाकर शुरू करूंगा। ऐसा करने के बाद, कॉम्पोजर को पता चलेगा कि http अनुरोधों को कैसे प्रबंधित करना और प्रतिक्रिया देना है जो रीस्टेसी के साथ काम करता है। शुरू करने में आपकी सहायता के लिए यहां कुछ जानकारी दी गई है।

अंगूठी एक क्लोजर लाइब्रेरी है जो मानक अनुरोधों में http अनुरोधों और प्रतिक्रियाओं का प्रतिनिधित्व करती है। यह मानक here विस्तृत है।

यह किसी भी प्रकार की पुस्तकालयों (यानी जेट्टी, नेटटी, फाइनगल) से http अनुरोध प्राप्त करके काम करता है और इसे मानक प्रतिनिधित्व में अनुवाद करता है। इसके बाद अनुरोध अनुरोधकर्ता को अनुरोध सौंप दिया जाता है (अक्सर इसे कंपोजर का उपयोग करके परिभाषित किया जाता है)। हैंडलर फिर प्रतिक्रिया देता है (उपरोक्त spec में भी परिभाषित)। इस प्रतिक्रिया का अनुवाद रिंग द्वारा वापस एक रूप में किया जाता है जो जेटी, नेटटी इत्यादि समझ सकता है।

यह अनुवाद रिंग एडाप्टर द्वारा किया जाता है। कुछ सूचीबद्ध here हैं, और अंगूठी निर्मित जेटी के लिए एडाप्टर के साथ आता है। हो सकता है कि आप उनमें से एक को रीस्टेसी एडाप्टर बनाने के लिए टेम्पलेट के रूप में उपयोग कर सकें। ऐसा करने के बाद आप मानक तरीके से कंपोज़र का उपयोग कर सकते हैं।

अंगूठी और compojure डीएसएल बनाने के तरीके के महान उदाहरण हैं। सभी अच्छे डीएसएल की तरह, यह अपने समस्या डोमेन (इस मामले में HTTP सर्वर) में समाधान बनाने को सरल बनाता है। वे डीएसएल के संदर्भ में सोचने के महान उदाहरण हैं। यदि आप उनका अध्ययन करते हैं, तो आप डीएसएल के संदर्भ में सोचने की दिशा में अपने रास्ते पर अच्छे होंगे।

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