2010-09-01 10 views
5
  1. नामस्थान का उद्देश्य क्या है?नामस्थान क्या हैं? उपयोग के बारे में क्या?

  2. और, अधिक महत्वपूर्ण, क्या उन्हें जावा में वस्तुओं के रूप में उपयोग किया जाना चाहिए (चीजें जिनमें डेटा और कार्य हैं और जो encapsulation प्राप्त करने का प्रयास करते हैं)? क्या यह विचार दूर तक लाया गया है? :)

  3. या उन्हें जावा में पैकेज के रूप में उपयोग किया जाना चाहिए?

  4. या उन्हें मॉड्यूल सिस्टम या कुछ के रूप में अधिक सामान्य रूप से उपयोग किया जाना चाहिए?

उत्तर

7

यह देखते हुए कि आप Clojure टैग का उपयोग, मुझे लगता है कि आप एक Clojure-विशिष्ट जवाब में दिलचस्पी होगी:

नामस्थान के उद्देश्य क्या है?

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

एक Clojure नाम स्थान समूहों Vars, जो कार्यों पकड़े कंटेनर (सबसे अधिक बार), मैक्रो कार्य (संकलक द्वारा इस्तेमाल किया उचित रूपों, सामान्य रूप से defmacro के साथ परिभाषित के macroexpansions उत्पन्न करने के लिए कार्य हैं, वास्तव में वे सिर्फ नियमित Clojure कार्य हैं, हालांकि वहां जिस तरह वे संकलक के साथ पंजीकृत हैं) और कभी कभी विभिन्न "वैश्विक मानकों" (जैसे कि, मानक इनपुट के लिए clojure.core/*in*) के लिए कुछ जादू है, परमाणुओं/Refs आदि प्रोटोकॉल सुविधा Clojure 1.2 में पेश अच्छा संपत्ति है प्रोटोकॉल वर्र्स द्वारा समर्थित हैं, जैसा कि व्यक्तिगत प्रोटोकॉल फ़ंक्शन हैं; यह उस तरीके से महत्वपूर्ण है जिसमें प्रोटोकॉल अभिव्यक्ति की समस्या का समाधान प्रस्तुत करते हैं (जो शायद इस उत्तर के दायरे से बाहर है!)।

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

और, अधिक महत्वपूर्ण, क्या उन्हें जावा में वस्तुओं के रूप में उपयोग किया जाना चाहिए (चीजें जिनमें डेटा और कार्य हैं और जो encapsulation प्राप्त करने का प्रयास करते हैं)? क्या यह विचार दूर तक लाया गया है? :)

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

इस सामान्य नियम के लिए एक महत्वपूर्ण अपवाद है: नामस्थान जिसमें :gen-class उनके ns रूप में शामिल है। ये जावा क्लास को लागू करने के लिए सटीक हैं, जिन्हें बाद में तत्काल किया जा सकता है, जिसमें इंस्टेंस विधियों और प्रति-उदाहरण राज्य आदि हो सकते हैं। ध्यान दें कि :gen-class एक इंटरऑप सुविधा है - शुद्ध क्लोजर कोड आम तौर पर इससे बचना चाहिए।

या उन्हें जावा में पैकेज के रूप में उपयोग किया जाना चाहिए?

वे कुछ उद्देश्यों को पूरा करने के लिए डिज़ाइन किए गए थे (जैसा कि पहले से ऊपर बताया गया है); समानता, हालांकि यह निश्चित रूप से वहां है, यह उपयोगी नहीं है, हालांकि, सिर्फ इसलिए कि चीजें जो समूह समूह (जावा क्लास) एक साथ समूह की तरह हैं, क्लोजर नेमस्पेस समूह (क्लोजर वर्स), विभिन्न "पहुंच स्तर" (private/package/जावा, {:private true} या नहीं Clojure में में public) बहुत अलग ढंग आदि

कहा जा रहा है काम करते हैं, एक नामस्थान और संकुल/वर्गों विशेष पैकेज में रहने वाले के बीच एक निश्चित पत्राचार है कि वहाँ याद करने के लिए है। संकलित होने पर foo.bar नामक एक नामस्थान, foo पैकेज में bar नामक कक्षा का उत्पादन करता है; इसका मतलब यह है कि, विशेष रूप से, नामस्थान नामों में कम से कम एक बिंदु होना चाहिए, क्योंकि तथाकथित एकल-सेगमेंट नाम स्पष्ट रूप से "डिफ़ॉल्ट पैकेज" में रखे जाने वाले वर्गों को ले जाते हैं, जिससे अजीबता के सभी प्रकार होते हैं। (उदामैं यह असंभव VisualVM के प्रोफाइलर नोटिस किसी भी कार्यों एकल खंड नामस्थान में परिभाषित किया गया है करने के लिए लगता है।)

इसके अलावा, deftype/defrecord -created प्रकार नामस्थान में रहते हैं नहीं है। फ़ाइल में (defrecord Foo [...] ...) फॉर्म जहां नामस्थान foo.bar परिभाषित किया गया है पैकेज में Foo नामक कक्षा बनाता है। एक और नाम स्थान से प्रकार Foo का उपयोग करने के लिए, एक foo.bar पैकेज से वर्ग Foo:import करना होगा - :use/:require कार्य नहीं करेगा, क्योंकि वे नामस्थान, जो रिकॉर्ड से Vars में खींच/प्रकार नहीं कर रहे हैं।

इसलिए, इस विशेष मामले में, नामस्थानों और संकुलों के बीच एक निश्चित पत्राचार है जो क्लोजर प्रोग्रामर जो कुछ नई भाषा सुविधाओं का लाभ उठाना चाहते हैं, उन्हें अवगत होना चाहिए। कुछ लोगों को लगता है कि यह उन सुविधाओं के लिए "इंटरऑप स्वाद" प्रदान करता है जिन्हें अन्यथा इंटरऑप के दायरे में नहीं माना जाता है (defrecord/deftype/defprotocol एक अच्छा अमूर्त तंत्र है, भले ही हम JVM पर प्लेटफ़ॉर्म की गति प्राप्त करने में उनकी भूमिका को भूल जाएं) और यह निश्चित रूप से संभव है कि क्लोजर के कुछ भविष्य के संस्करण में इस स्वाद को समाप्त किया जा सकता है, ताकि deftype & के लिए नामस्थान नाम/पैकेज नाम पत्राचार को कार्यान्वयन विस्तार के रूप में माना जा सके।

या उन्हें मॉड्यूल सिस्टम या कुछ के रूप में अधिक सामान्य रूप से उपयोग किया जाना चाहिए?

वे एक मॉड्यूल सिस्टम हैं और वास्तव में इसका उपयोग किया जाना चाहिए।

0

उनके बारे में उनके वर्गों के लिए कंटेनर के रूप में सोचें। जैसे कि आपके पास तार बनाने के लिए एक सहायक वर्ग था और आप इसे अपनी व्यावसायिक परत में चाहते थे तो आप MyApp.Business.Helpers जैसे नामस्थान का उपयोग करेंगे। यह आपके वर्गों को सनसनीखेज स्थानों में निहित करने की इजाजत देता है ताकि जब आप या आपके कोड का संदर्भ देने वाले किसी अन्य व्यक्ति को उन्हें ठंडा करना चाहते हैं तो वे आसानी से स्थित हो सकते हैं। एक और उदाहरण के लिए यदि आप एक SQL कनेक्शन सहायक वर्ग आप शायद की तरह कुछ का प्रयोग करेंगे उपभोग करना चाहता था: यदि आप एक "का उपयोग" का प्रयोग करेंगे

MyApp.Data.SqlConnectionHelper sqlHelper = new MyApp.Data.SqlConnectionHelper();

हकीकत में बयान तो आप पूरी तरह से नाम स्थान अर्हता प्राप्त करने की जरूरत नहीं होगी बस चर घोषित करने के लिए।

पॉल

2

जावा में एक पैकेज का अपना नाम स्थान है, जो वर्गों के तार्किक समूहीकरण प्रदान करता है। यह टकराव नामकरण रोकने में भी मदद करता है। उदाहरण के लिए जावा में आपको java.util.Date और java.sql.Date - दो नामों के साथ दो नामों को उनके नामस्थान द्वारा अलग किया जाएगा। यदि आप दोनों जावा फ़ाइल में आयात करने का प्रयास करते हैं, तो आप देखेंगे कि यह संकलित नहीं होगा। कम से कम एक संस्करण को इसके स्पष्ट नामस्थान का उपयोग करने की आवश्यकता होगी।

1

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

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