कैंडी कप सादृश्य
संस्करण 1: हर कैंडी के लिए एक कप
मान लीजिए कि आपने कुछ कोड इस तरह लिखे हैं:
Mod1.ts
export namespace A {
export class Twix { ... }
}
Mod2.ts
export namespace A {
export class PeanutButterCup { ... }
}
Mod3.ts
export namespace A {
export class KitKat { ... }
}
आपने यह सेटअप बनाया है:
प्रत्येक मॉड्यूल (कागज की शीट) को अपने स्वयं के कप का नाम दिया जाता है A
। यह बेकार है - आप वास्तव में यहां अपनी कैंडी का आयोजन नहीं कर रहे हैं, आप सिर्फ एक अतिरिक्त कदम जोड़ रहे हैं (इसे कप से बाहर ले जा रहे हैं) और व्यवहार के बीच।
संस्करण 2: वैश्विक दायरे में एक कप
यदि आप मॉड्यूल का उपयोग नहीं कर रहे थे, तो आप इस तरह कोड लिख सकते हैं ( export
घोषणाओं की कमी पर ध्यान दें ):
global1.ts
namespace A {
export class Twix { ... }
}
global2.ts
namespace A {
export class PeanutButterCup { ... }
}
global3.ts
namespace A {
export class KitKat { ... }
}
यह कोड A
वैश्विक दायरे में एक विलय नाम स्थान बनाता है :
यह सेटअप उपयोगी है, लेकिन मॉड्यूल के मामले में लागू नहीं होता है (क्योंकि मॉड्यूल वैश्विक दायरे को प्रदूषित नहीं करते हैं)।
संस्करण 3: कपलेस होकर जाना
मूल उदाहरण के लिए वापस जा, कप A
, A
और A
आप किसी भी पक्ष में नहीं कर रहे हैं। इसके बजाय, आप इस रूप में कोड लिख सकते हैं:
Mod1.ts
export class Twix { ... }
Mod2.ts
export class PeanutButterCup { ... }
Mod3.ts
export class KitKat { ... }
एक चित्र बनाने के लिए जो इस तरह दिखता है:
काफी बेहतर!
अब, यदि आप अभी भी इस बारे में सोच रहे हैं कि आप वास्तव में अपने मॉड्यूल के साथ नाम स्थान का उपयोग कैसे करना चाहते हैं, तो पढ़ें ...
ये अवधारणाएँ नहीं हैं जिन्हें आप खोज रहे हैं
हमें यह जानने की आवश्यकता है कि नाम स्थान पहले स्थान पर क्यों हैं और यह जाँच करें कि क्या वे कारण बाहरी मॉड्यूल के लिए समझ में आते हैं।
संगठन : नाम स्थान तार्किक रूप से संबंधित वस्तुओं और प्रकारों को एक साथ समूहीकृत करने के लिए आसान हैं। उदाहरण के लिए, C # में, आप सभी संग्रह प्रकार खोजने जा रहे हैं System.Collections
। हमारे प्रकारों को पदानुक्रमित नामस्थान में व्यवस्थित करके, हम उन प्रकार के उपयोगकर्ताओं के लिए एक अच्छा "खोज" अनुभव प्रदान करते हैं।
नाम संघर्ष : नामकरण टकराव से बचने के लिए नाम स्थान महत्वपूर्ण हैं। उदाहरण के लिए, आपके पास My.Application.Customer.AddForm
और My.Application.Order.AddForm
- एक ही नाम के दो प्रकार हो सकते हैं , लेकिन एक अलग नामस्थान। ऐसी भाषा में जहां सभी पहचानकर्ता एक ही मूल दायरे में मौजूद हैं और सभी विधानसभाएं सभी प्रकारों को लोड करती हैं, सब कुछ एक नाम स्थान में होना महत्वपूर्ण है।
क्या उन कारणों से बाहरी मॉड्यूल में कोई फर्क पड़ता है?
संगठन : बाहरी मॉड्यूल पहले से ही एक फाइल सिस्टम में मौजूद हैं, जरूरी है। हमें उन्हें पथ और फ़ाइल नाम से हल करना होगा, इसलिए हमारे लिए उपयोग करने के लिए एक तार्किक संगठन योजना है। हमारे पास /collections/generic/
इसमें एक list
मॉड्यूल वाला एक फ़ोल्डर हो सकता है ।
नाम संघर्ष : यह बाहरी मॉड्यूल में बिल्कुल भी लागू नहीं होता है। एक मॉड्यूल के भीतर, एक ही नाम के साथ दो ऑब्जेक्ट होने का कोई प्रशंसनीय कारण नहीं है। खपत पक्ष से, किसी भी दिए गए मॉड्यूल के उपभोक्ता को उस नाम को चुनना होगा जो वे मॉड्यूल को संदर्भित करने के लिए उपयोग करेंगे, इसलिए आकस्मिक नामकरण संघर्ष असंभव हैं।
यहां तक कि अगर आपको विश्वास नहीं है कि उन कारणों को पर्याप्त रूप से संबोधित किया जाता है कि मॉड्यूल कैसे काम करते हैं, तो बाहरी मॉड्यूल में नाम स्थान का उपयोग करने की कोशिश करने का "समाधान" भी काम नहीं करता है।
बक्से में बक्से में बक्से
एक कहानी:
आपका दोस्त बॉब आपको कॉल करता है। "मेरे घर में एक महान संगठन योजना है", वह कहते हैं, "इसकी जांच करें!"। नीट, चलो देखते हैं कि बॉब क्या लेकर आया है।
आप रसोई में शुरू करते हैं और पेंट्री खोलते हैं। 60 अलग-अलग बक्से हैं, प्रत्येक "पेंट्री" लेबल हैं। आप यादृच्छिक पर एक बॉक्स चुनें और इसे खोलें। अंदर एक एकल बॉक्स "लेबल" है। आप "अनाज" बॉक्स खोलते हैं और "पास्ता" नामक एक एकल बॉक्स पाते हैं। आप "पास्ता" बॉक्स खोलें और "पेनी" नामक एक एकल बॉक्स ढूंढें। आप इस बॉक्स को खोलते हैं और पाते हैं, जैसा कि आप उम्मीद करते हैं, पेनी पास्ता का एक बैग।
थोड़ा उलझन में, आप एक आसन्न बॉक्स उठाते हैं, जिसे "पेंट्री" भी कहा जाता है। अंदर एक एकल बॉक्स है, जिसे फिर से "अनाज" लेबल किया गया है। आप "अनाज" बॉक्स खोलते हैं और, फिर से, "पास्ता" नामक एक एकल बॉक्स पाते हैं। आप "पास्ता" बॉक्स खोलते हैं और एक एकल बॉक्स पाते हैं, इस पर "रिगाटोनी" का लेबल लगाया जाता है। आप इस बॉक्स को खोलें और खोजें ... रिगाटोनी पास्ता का एक बैग।
"यह बहुत अच्छा है!" बॉब कहते हैं। "सब कुछ एक नाम स्थान में है!"।
"लेकिन बॉब ..." आप जवाब देते हैं। "आपकी संगठन योजना बेकार है। आपको कुछ भी प्राप्त करने के लिए बक्से का एक गुच्छा खोलना होगा, और यह वास्तव में किसी भी चीज़ को खोजने के लिए अधिक सुविधाजनक नहीं है यदि आपने तीन के बजाय एक बॉक्स में सब कुछ डाल दिया है । वास्तव में, चूंकि आपकी। पेंट्री पहले से ही शेल्फ-बाय-शेल्फ की तरह है, आपको बक्से की बिल्कुल ज़रूरत नहीं है। बस पास्ता को शेल्फ पर सेट क्यों नहीं करना चाहिए और ज़रूरत पड़ने पर इसे उठाएं? "
"आप नहीं समझते हैं - मुझे यह सुनिश्चित करने की ज़रूरत है कि कोई और ऐसा कुछ नहीं डालता है जो 'पेंट्री' नामस्थान से संबंधित नहीं है। और मैंने अपने सभी पास्ता को Pantry.Grains.Pasta
नामस्थान में सुरक्षित रूप से व्यवस्थित किया है ताकि मैं इसे आसानी से पा सकूं"
बॉब बहुत उलझा हुआ इंसान है।
मॉड्यूल उनके अपने बॉक्स हैं
आपने शायद वास्तविक जीवन में ऐसा ही कुछ किया है: आप अमेज़न पर कुछ चीजें ऑर्डर करते हैं, और प्रत्येक आइटम अपने स्वयं के बॉक्स में दिखाता है, जिसमें एक छोटा बॉक्स होता है, जिसमें आपका आइटम अपनी पैकेजिंग में लिपटा होता है। यहां तक कि अगर आंतरिक बक्से समान हैं, तो शिपमेंट उपयोगी रूप से "संयुक्त" नहीं हैं।
बॉक्स एनालॉग के साथ जा रहे हैं, मुख्य अवलोकन यह है कि बाहरी मॉड्यूल अपने स्वयं के बॉक्स हैं । यह बहुत अधिक कार्यक्षमता के साथ एक बहुत ही जटिल आइटम हो सकता है, लेकिन किसी भी बाहरी मॉड्यूल का अपना बॉक्स है।
बाहरी मॉड्यूल के लिए मार्गदर्शन
अब जब हमें पता चला है कि हमें 'नेमस्पेस' का उपयोग करने की आवश्यकता नहीं है, तो हमें अपने मॉड्यूल को कैसे व्यवस्थित करना चाहिए? कुछ मार्गदर्शक सिद्धांत और उदाहरण अनुसरण करते हैं।
यथासंभव शीर्ष स्तर के करीब निर्यात करें
- यदि आप केवल एकल वर्ग या फ़ंक्शन का उपयोग कर रहे हैं, तो उपयोग करें
export default
:
MyClass.ts
export default class SomeType {
constructor() { ... }
}
MyFunc.ts
function getThing() { return 'thing'; }
export default getThing;
सेवन
import t from './MyClass';
import f from './MyFunc';
var x = new t();
console.log(f());
यह उपभोक्ताओं के लिए इष्टतम है। वे आपके प्रकार का नाम दे सकते हैं जो वे चाहते हैं ( t
इस मामले में) और आपकी वस्तुओं को खोजने के लिए किसी भी बाहरी डॉटिंग को करने की ज़रूरत नहीं है।
- यदि आप कई वस्तुओं का निर्यात कर रहे हैं, तो उन सभी को शीर्ष-स्तर पर रखें:
MyThings.ts
export class SomeType { ... }
export function someFunc() { ... }
सेवन
import * as m from './MyThings';
var x = new m.SomeType();
var y = m.someFunc();
- यदि आप बड़ी संख्या में चीजों का निर्यात कर रहे हैं, तो केवल आपको
module
/ namespace
कीवर्ड का उपयोग करना चाहिए :
MyLargeModule.ts
export namespace Animals {
export class Dog { ... }
export class Cat { ... }
}
export namespace Plants {
export class Tree { ... }
}
सेवन
import { Animals, Plants} from './MyLargeModule';
var x = new Animals.Dog();
लाल झंडा
मॉड्यूल संरचना के लिए निम्नलिखित सभी लाल झंडे हैं। यदि आप इनमें से कोई भी अपनी फ़ाइलों पर लागू करते हैं, तो अपने बाहरी मॉड्यूल को नामांकित करने का प्रयास नहीं कर रहे हैं:
- एक फ़ाइल जिसकी केवल शीर्ष-स्तरीय घोषणा है
export module Foo { ... }
( Foo
एक स्तर पर 'सब कुछ हटा दें और हटा दें ')
- एक फ़ाइल जिसमें एक एकल
export class
या export function
वह नहीं हैexport default
- कई फाइलें जो
export module Foo {
शीर्ष-स्तर पर समान हैं (ऐसा मत सोचो कि ये एक में संयोजन करने जा रहे हैं Foo
!)