2011-10-14 36 views
5

हाय दोस्तों: मैं सोच रहा था कि क्लोजर में एक डीएसएल के ठोस उदाहरण के बारे में किसी को भी पता था, जो एक अच्छा ओओ प्रोग्राम (लिखा, जावा में लिखा गया) की अमूर्तता और पठनीयता को बदल देता है।डीएसएल जो किसी ऑब्जेक्ट-उन्मुख सॉफ़्टवेयर समाधान को प्रतिस्थापित करता है?

मैं एक OO डाटा मॉडल लेने के लिए (जो, "सेम" आधारित बहुत सार तरीकों जो अंतर्निहित कार्यान्वयन को छिपाने के साथ) एक clojure moeity में की कोशिश कर रहा है ...

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

फिर भी ... मेरी बुनियादी सवाल यह है:

किसी भी डोमेन-विशिष्ट टेम्पलेट्स प्रोटोकॉल और उच्च क्रम कार्यों के साथ Clojure में असली दुनिया सिस्टम मॉडल करने के लिए सीखने के लिए मौजूद है?

उत्तर

1

मुझे नहीं पता कि यह वही है जो आप खोज रहे हैं लेकिन मैंने क्लोजर (प्रोग्रामिंग क्लोजर; व्यावहारिक प्रोग्रामर) के बारे में एक पुस्तक पढ़ी है जिसमें एक अच्छा छोटा डीएसएल का उदाहरण है। आप https://github.com/stuarthalloway/lancet पर कोड पा सकते हैं। मूल रूप से लेंससेट जैसे या चींटी बनाते हैं लेकिन क्लोजर-डीएसएल के रूप में लागू होते हैं।

+0

... लेंससेट एक डीएसएल है, लेकिन वास्तव में यह वास्तव में एक "असली दुनिया" समस्या नहीं है जिसमें अधिकांश प्रोग्रामर ने कभी ऐसी प्रणाली लिखने की कोशिश नहीं की है: अच्छा ओल 'google: jpetstore एप्लिकेशन देखें .... – jayunit100

1

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

आप से पॉल ग्राहम दिखाने बनाने का तरीका कैसे नक्शे और बहु ​​तरीकों clojure की खुशी में (जे एस में मूलरूप inheritence के लिए कुछ इसी तरह), अध्याय 9.

तुतलाना किताब पर के साथ एक OOP प्रणाली का निर्माण करने देख सकते हैं लिप में एक ऑब्जेक्ट सिस्टम। इसे क्लोजर में अनुकूलित करना आसान होना चाहिए।

इस किताब को भी बड़े पैमाने पर "नीचे से ऊपर" प्रोग्रामिंग समझाते हैं, कि छोटे बुनियादी ईंटों बनाने जा रहा है और उन्हें रचना अधिक उच्च स्तर निर्माणों के निर्माण के लिए।

इसके अलावा, आप कई आवेदन (जावा पालतू जानवर की दुकान की तरह) में मुख्य अवधारणा प्रक्रियात्मक/fonctionnal है और बड़े पैमाने पर सामान्यीकरण या कैप्सूलीकरण की तरह वस्तुओं की अवधारणा का उपयोग नहीं करता दिखाई देता है।

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

सेवा जो उन पर काम करती है मूल रूप से कार्य करती हैं। उनके पास कोई राज्य नहीं है और पैरामीटर (बीन्स) या डेटाबेस से डेटा लेते हैं। यदि आपको वास्तव में पूर्णांक की आवश्यकता है, तो आपके पास क्लोजर में प्रोटोकॉल हैं।

यह जटिल नहीं है।

नाम जावा में की तरह अपने सेम ... लेकिन उन्हें अपनी सेवाओं clojure नक्शे पर या एक रिकॉर्ड के रूप में

नाम को लागू करने और उन्हें कार्यों के रूप में लागू।

कारखानों की आवश्यकता है? वह फ़ंक्शंस जो कॉन्फ़िगरेशन और रिटर्न फ़ंक्शन लेते हैं।

dependancy इंजेक्शन की आवश्यकता है? ठीक है आप फ़ंक्शन पैरामीटर का उपयोग कर सकते हैं।

3

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

अच्छा DSL के ठोस उदाहरण के लिए ClojureQL पर देखें। प्रारंभ में, एसक्यूएल डेटाबेस के संबंध में डीएसएल के रूप में बनाया गया था। और यह कंसोल से काम करने के लिए बहुत सुविधाजनक है ... लेकिन जावा या क्लोजर जैसी प्रोग्रामिंग भाषा से नहीं। जावा हाइबरनेट जैसे बड़े ORM चौखटे के साथ आया था, और Clojure सरल डीएसएल जो मूल एसक्यूएल के रूप में के रूप में सुविधाजनक है प्रदान करता है, लेकिन भाषा के हिस्से के रूप में पूरी तरह से काम करता है:

(select (table :users) (where (= :id 5))) 

लिस्प DSLs में आम बात defsomething तरह निर्माणों उपयोग कर रहा है। उदाहरण के लिए, एक पुस्तक में (क्षमा करें, मुझे इसका नाम याद नहीं है) टेक्स्ट में पैटर्न मिलान का एक उदाहरण है। लेखक एक शब्द, + के लिए एक या अधिक शब्दों के लिए * शून्य या अधिक शब्दों के लिए ? जैसे कई matchhers के साथ मॉड्यूल बनाता है। इस उद्देश्य के लिए वह मैक्रो defmatcher बनाता है जो कुछ वाक्यविन्यास लेता है और इस वाक्यविन्यास के लिए केंद्रीय रजिस्ट्री में हैंडलर जोड़ता है। यह सिर्फ अमूर्त है - कई बार दोहराए जाने वाले ऑपरेशन के बजाय वह एकल मैक्रो को बताता है कि वह वास्तव में क्या करना चाहता है - मैचर को परिभाषित करें। इसके अलावा यह उदाहरण मैक्रोज़ और उच्च ऑर्डर फ़ंक्शंस दोनों का उपयोग करता है।

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

यूपीडी। कुछ "वास्तविक दुनिया" उदाहरण हैं, जहां लिस्प आधारित DSLs जो एक राशि अधिक सुविधाजनक हैं, OOP:

डोमेन: कार dillership

(defcar my-cool-car :wheels 4, :doors 2, :color red) ;; in Java you need Factory 
(def car1 (make-car my-cool-car))     ;; and lots of methods to 
                ;; add features to cars and 
                ;; cars to factory 

डोमेन: बिलिंग प्रणाली

(transaction    ;; in Java you cannot create wrapping constructs 
    (withdraw account1 100) ;; so you have to use inheritance, annotations, etc. 
    (put account2 100))  ;; which is much more code 

डोमेन: कुछ वेब सेवा, जो कई प्रकार के अनुरोधों को संभालती है

(defhandler :show-all (fn [params] ...))  ;; adds defined function to the 
(defhandler :find-best (fn [params] ...)) ;; map of :message-type -> function 
... 
(defn handle [message] 
    (let [msg-type (:type message), msg-params (:params message)] 
    (if (contains? *handlers* msg-type) 
     ((*handlers* msg-type) msg-params) 
     (throw (Exception. (concat "No handler for type" (:type message))))))) 

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