Java to Clojure rewrite


97

मुझे क्लोजर में एक लार्गिश (कोड की 50,000 एकल लाइनें) जावा एप्लिकेशन (जेएसपी और सर्वलेट्स का उपयोग करने वाला एक वेब ऐप) को फिर से लिखने के लिए मेरी कंपनी द्वारा अभी-अभी पूछा गया है। क्या किसी और को सुझाव दिया गया है कि मुझे क्या देखना चाहिए?

कृपया ध्यान रखें कि मैं जावा और क्लोजर दोनों को अच्छी तरह से जानता हूं।

अपडेट करें

मैंने फिर से लिखा और यह उत्पादन में चला गया। यह काफी अजीब है क्योंकि फिर से लिखना इतना तेजी से खत्म हो रहा है कि यह लगभग 6 सप्ताह में हो गया। क्योंकि बहुत अधिक कार्यक्षमता की आवश्यकता नहीं थी फिर भी यह क्लोजर की 3000 लाइनों की तरह समाप्त हो गया।

मैं सुनता हूं कि वे सिस्टम और उसके काम से खुश हैं जो वे चाहते थे। केवल नकारात्मक पक्ष यह है कि सिस्टम को बनाए रखने वाले व्यक्ति को स्क्रैच से क्लोजर सीखना था, और उसे लात मारकर चिल्ला रहा था। मुझे दूसरे दिन उनसे यह कहते हुए फोन मिला कि वह लिस्प से प्यार करता है, हालांकि .. मजाकिया :)

साथ ही, मुझे वाडिन का अच्छा उल्लेख करना चाहिए। वाडिन का उपयोग शायद समय की बचत और कोड की कमी के रूप में किया गया था जैसा कि क्लोजर ने किया था .. वैडिन अभी भी शीर्ष वेब फ्रेमवर्क है जिसका मैंने कभी उपयोग किया है, हालांकि अब मैं गुस्से में क्लोजुरस्क्रिप्ट सीख रहा हूं! (ध्यान दें कि वाडिन और क्लोजुरस्क्रिप्ट दोनों हुड के नीचे Google के GUI फ्रेमवर्क का उपयोग करते हैं।)


55
मैं आपकी कंपनी के लिए काम करना चाहता हूं।
मटका

4
ठीक है, यूरोप में कुछ रक्षा कंपनियों ने क्लोजर (मैंने सुना) का उपयोग करना शुरू कर दिया है। लेकिन किसी भी नाम को याद नहीं कर सकते हैं :)
appshare.co

1
@ ज़ुबैर: 50 000 जावा एलओसी "लार्जिश" के पास कहीं भी नहीं है। यह एक बहुत छोटी परियोजना है। मैं एक 250KLOC 300KLOC जावा परियोजना के लिए यहाँ मिल गया है और यह मध्यम आकार का है ... सबसे अच्छा।
SyntaxT3rr0r

5
वास्तव में मैंने शायद कोडबेस के आकार का उल्लेख करके गलती की है क्योंकि निष्पक्ष होना कोड आकार में कमी को फिर से लिखना का उद्देश्य नहीं है। उद्देश्य दुगना है: 1) कोडबेस को अधिक समझने योग्य है और इस प्रकार कोड 2 को बनाए रखने के लिए सस्ता है) उपकरण के उपयोगकर्ताओं को वेबब्रोज़र में एक क्लोजर एडिटर का उपयोग करके उत्पाद का विस्तार करने की अनुमति दें (eval और अन्य गतिशील क्लोजर अच्छाई का उपयोग करना) जो अधिक महंगा है जावा में करें)
appshare.co

1
अरे ... बस इस पुराने सवाल को देखा और सोच रहा था कि कैसे फिर से लिखना है?
लेवंड

जवाबों:


82

सबसे बड़ा "अनुवाद संबंधी मुद्दा" शायद जावा / ओओपी पद्धति से क्लोजर / कार्यात्मक प्रोग्रामिंग प्रतिमान तक जाएगा।

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

वैसे भी, यह दर्शन एक "नीचे ऊपर" विकास शैली की ओर जाता है, जहां आप अपनी समस्या को हल करने के लिए उपकरणों के सही सेट के निर्माण पर प्रारंभिक प्रयासों पर ध्यान केंद्रित करते हैं, फिर अंत में उन्हें एक साथ प्लग करते हैं। यह कुछ इस तरह लग सकता है

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

  2. शुद्ध, व्यावसायिक तर्क उन्मुख कार्यों के छोटे पुस्तकालयों को विकसित करें जो इन अपरिवर्तनीय संरचनाओं पर काम करते हैं (उदाहरण के लिए "शॉपिंग कार्ट में एक आइटम जोड़ें")। आपको इन सभी को एक बार में करने की आवश्यकता नहीं है क्योंकि बाद में इसे जोड़ना आसान है, लेकिन यह परीक्षण को सुविधाजनक बनाने और यह साबित करने में कुछ जल्दी करने में मदद करता है कि आपकी डेटा संरचनाएं काम कर रही हैं ..... या तो इस तरह से बिंदु आप वास्तव में REPL पर अंतःक्रियात्मक रूप से उपयोगी सामान लिखना शुरू कर सकते हैं

  3. अलग से डेटा एक्सेस रूटीन विकसित करें जो इन संरचनाओं को डेटाबेस या नेटवर्क या विरासत जावा कोड से / आवश्यकतानुसार बनाये रख सकते हैं। इसे बहुत अलग रखने का कारण यह है कि आप अपने "व्यावसायिक तर्क" कार्यों के साथ दृढ़ता तर्क नहीं रखना चाहते हैं। आप देखना चाह सकते हैं इसके लिए क्लोजुरेसेल , हालांकि यह किसी भी जावा दृढ़ता कोड को लपेटना बहुत आसान है जो आपको पसंद है।

  4. इकाई परीक्षण लिखें (जैसे clojure.test के साथ ) जो उपरोक्त सभी को कवर करते हैं। यह विशेष रूप से एक गतिशील भाषा में क्लोजर की तरह महत्वपूर्ण है क्योंकि a) आपके पास स्थैतिक प्रकार की जाँच और b से सुरक्षा जाल जितना नहीं है) यह सुनिश्चित करने में मदद करता है कि आपके निचले स्तर के निर्माण अच्छी तरह से निर्माण करने से पहले आपके बहुत अच्छे काम कर रहे हैं उनमें से सबसे ऊपर

  5. तय करें कि आप प्रत्येक भाग के परिवर्तनशील अनुप्रयोग-स्तर की स्थिति का प्रबंधन करने के लिए क्लॉजुर के संदर्भ प्रकारों (vars, Refs, Agent और atoms) का उपयोग कैसे करना चाहते हैं। वे सभी समान तरीके से काम करते हैं लेकिन आपके पास जो करने की कोशिश कर रहे हैं उसके आधार पर अलग-अलग लेनदेन / संगामिति शब्दार्थ हैं। Refs शायद आपकी डिफ़ॉल्ट पसंद होने जा रहे हैं - वे आपको किसी भी कोड को (dosync ...) ब्लॉक में लपेटकर "सामान्य" एसटीएम व्यवहार व्यवहार को लागू करने की अनुमति देते हैं।

  6. सही समग्र वेब फ्रेमवर्क का चयन करें - क्लोजर काफी पहले से ही है, लेकिन मैं रिंग की जोरदार सिफारिश करूंगा - इस उत्कृष्ट वीडियो को देखें " वन रिंग टू बिंद देम " प्लस या तो फ्लीट या एनलाइव या हिचकी दर्शन के आधार पर । फिर अपनी प्रस्तुति परत लिखने के लिए इसका उपयोग करें ("इस खरीदारी की टोकरी को एक उपयुक्त HTML टुकड़े में अनुवाद करें" जैसे कार्यों के साथ)

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

यह मोटे तौर पर अनुक्रम है कि मैं समस्या पर हमला करूंगा क्योंकि यह मोटे तौर पर आपके कोड में निर्भरता के आदेश का प्रतिनिधित्व करता है, और इसलिए "नीचे" विकास के प्रयास के लिए उपयुक्त है। हालांकि अच्छी फुर्तीली / पुनरावृत्ति शैली में आप संभवतः खुद को एक प्रदर्शनकारी अंत उत्पाद के लिए आगे बढ़ा पाएंगे और फिर आवश्यकतानुसार कार्यक्षमता या रिफ्लेक्टर को बढ़ाने के लिए पहले के चरणों में वापस कूदेंगे।

ps यदि आप उपर्युक्त दृष्टिकोण का पालन करते हैं, तो मैं यह सुनकर रोमांचित हो जाऊंगा कि जावा की 50,000 लाइनों की कार्यक्षमता से मेल खाने के लिए क्लोजर की कितनी लाइनें लगती हैं

अपडेट : चूंकि यह पोस्ट मूल रूप से कुछ अतिरिक्त टूल के रूप में लिखी गई थी / पुस्तकालय सामने आए हैं जो "अवश्य देखें" श्रेणी में हैं:

  • नॉयर - वेब फ्रेमवर्क जो रिंग के ऊपर बनता है।
  • कोरमा - SQL डेटाबेस तक पहुँचने के लिए एक बहुत अच्छा डीएसएल।

4
Nitpick re: "यह तय करें कि आप क्लोजर के एसटीएम संदर्भ प्रकारों में से किसका उपयोग प्रत्येक भाग के परिवर्तनशील अनुप्रयोग-स्तरीय स्थिति को प्रबंधित करने के लिए करना चाहते हैं": केवल एक एसटीएम संदर्भ प्रकार है। अन्य IRefs में एसटीएम शामिल नहीं है। अन्यथा ठोस सलाह की तरह दिखता है।

हम्म् ... मुझे लगता है कि मैं सभी refj, एजेंटों और परमाणुओं की गणना करता हूं क्योंकि सभी क्लोजर एसटीएम / कंसीडर सिस्टम का हिस्सा हैं। उदाहरण के लिए वे सभी सत्यापनकर्ताओं का समर्थन करते हैं, और एजेंटों को लेनदेन के साथ समन्वयित किया जाता है। लेकिन मुझे आपकी बात पर भरोसा है, रेफल्स "प्राथमिक" लेनदेन मॉडल हैं। एक त्वरित संशोधन करेगा।
mikera

2
अगर केवल मैं इसे और अधिक + 1 दे सकता था। मैंने आपके द्वारा संदर्भित दोनों वीडियो देखे, और वे बहुत अच्छे थे। धन्यवाद।
jdl

1
अब नोइर को पदावनत कर दिया गया है। मुझे लगता है कि आपको नोयर के बजाय कॉम्पोजर के बारे में उल्लेख करना होगा।
अगस्त

एक अंगूठी बांधने के लिए उन्हें लिंक टूट गया है!
एडम एरॉल्ड

5

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


सर्वलेट्स, JSP, होमबिल्ट दृढ़ता फ्रेमवर्क (10 वर्ष) और pojos, लेकिन कोई EJB
appshare.co

4
सर्वलेट्स को रिंग + कम्पोजर IMHO के साथ आसानी से बदला जा सकता है, और JSP को शायद StringTemplate (या FreeMarker / वेलोसिटी टेम्प्लेट) से बदला जा सकता है। Clojure में दृढ़ता जावा से अलग होने वाली है। यदि आपको रिलेशनल मैपिंग की आवश्यकता है, तो आप Clj-Record और SQLRat (अभी तक बहुत परिपक्व नहीं हैं) को देख सकते हैं। फिलहाल AFAICT क्लोजरक्यूएल MySQL और PostgreSQL को सपोर्ट करता है। स्तंभ नामों में अंडरस्कोर को हटाने के लिए ccsql में वर्तमान सीमा एक आश्चर्य के रूप में आ सकती है। मुझे लगता है कि क्लोजर सूची के विकास के पहलुओं पर चर्चा करना और जब-तब उपयोगी होगा। परियोजना पर शुभकामनाएँ!
शांतनु कुमार

उस परियोजना के बाद से मैंने क्लॉजुरे और क्लोजरस्क्रिप्ट (nemcv.com) के साथ एक और आवेदन किया और मैं अब रिंग का उपयोग कर रहा हूं, क्लोजुरेसेल की कोशिश की, लेकिन डेटाबेस एक्सेस के लिए कोरमा पर स्विच कर रहा हूं। आप github.com/zubairq/coils
appshare.co

4

मैंने पाया कि सबसे कठिन हिस्सा डेटाबेस के बारे में सोच रहा था। सही उपकरण खोजने के लिए कुछ परीक्षण करें जो आप वहां उपयोग करना चाहते हैं।


1
वैसे मैंने डेटा एक्सेस के लिए क्लोजुरेकल की कोशिश की है, लेकिन यह डेटाबेस एक्सेस के जावा स्टाइल से पूरी तरह से अलग है जो सभी ऑब्जेक्ट आधारित है। बस ब्याज से बाहर क्या डेटाबेस का उपयोग आप जावा के लिए इस्तेमाल किया और क्या आप Clojure के साथ उपयोग किया?
appshare.co

1
हमने बहुत सारे सामान को पुनर्जीवित किया और मोंगोडब के साथ जा रहे थे क्योंकि क्लोजर डेटा की दृढ़ता बहुत स्वाभाविक थी
लेनव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.