हाँ, वास्तव में है। की तरह।
समाचार पत्र की कोई स्थिर स्थिति नहीं है और कोई वैश्विक राज्य नहीं है। इसका मतलब यह है कि एक निर्भरता तक पहुंचने का एकमात्र संभव तरीका स्पष्ट रूप से इंजेक्शन है। जाहिर है, इसका मतलब है कि भाषा, या समाचार पत्र के मामले में अधिक सटीक रूप से आईडीई को निर्भरता इंजेक्शन को आसान बनाने की आवश्यकता है, अन्यथा भाषा अनुपयोगी होगी।
इसलिए, भाषा को DI के लिए डिज़ाइन नहीं किया गया है, बल्कि DI के लिए आवश्यकता भाषा डिज़ाइन का परिणाम है।
यदि कोई स्थिर स्थिति नहीं है और कोई वैश्विक स्थिति नहीं है, तो आप ईथर तक केवल "पहुंच" नहीं कर सकते हैं और कुछ बाहर खींच सकते हैं। उदाहरण के लिए, जावा में, पैकेज संरचना स्थिर अवस्था है। मैं बस कह सकता हूं java.lang.String
और मेरे पास खुद का String
वर्ग है। जो कि समाचार पत्र में संभव नहीं है। आपके साथ काम करने वाली हर चीज आपको स्पष्ट रूप से प्रदान की जानी चाहिए, अन्यथा आप इसे प्राप्त नहीं कर सकते। तो, सब कुछ एक निर्भरता है, और हर निर्भरता स्पष्ट है।
आप एक स्ट्रिंग चाहते हैं? ठीक है, आपको पहले कक्षा stdlib
को सौंपने के लिए ऑब्जेक्ट पूछना होगा String
। ओह, लेकिन आप कैसे पहुँच सकते हैं stdlib
? ठीक है, आपको पहले वस्तु platform
को सौंपने के लिए कहना होगा stdlib
। ओह, लेकिन आप कैसे पहुँच सकते हैं platform
? ठीक है, आपको सबसे पहले किसी और से आपको platform
वस्तु सौंपने के लिए कहना होगा । ओह, लेकिन आप कैसे किसी के लिए उपयोग करते हैं? ठीक है, आपको पहले किसी और से पूछना होगा कि वह वस्तु आपको सौंप दे।
यह खरगोश के छेद से कितना नीचे जाता है? पुनरावृत्ति कहाँ रुकती है? सभी तरह से, वास्तव में। यह बंद नहीं करता है। फिर, आप समाचार पत्र में एक कार्यक्रम कैसे लिख सकते हैं? ठीक है, सख्ती से बोल, तुम नहीं कर सकते!
आपको कुछ बाहरी इकाई की आवश्यकता होती है जो इसे एक साथ जोड़ती है। समाचारपत्र में, वह संस्था आईडीई है। आईडीई पूरे कार्यक्रम को देखता है। यह एक साथ टुकड़े टुकड़े तार कर सकते हैं। समाचारपत्र में मानक पैटर्न यह है कि आपके आवेदन के केंद्रीय वर्ग में एक platform
एक्सेसर कहा जाता है , और समाचार पत्र आईडीई उस एक्सेसर में एक वस्तु को इंजेक्ट करता है जिसमें ऐसी विधियाँ होती हैं जो प्रोग्रामिंग की कुछ मूलभूत आवश्यकताओं को वापस करती हैं: एक String
वर्ग, एक Number
वर्ग, एक Array
वर्ग और इसी तरह।
यदि आप अपने आवेदन का परीक्षण करना चाहते हैं, तो आप उस platform
ऑब्जेक्ट को इंजेक्ट कर सकते हैं, जिसकी File
विधि डमी विधियों के साथ एक वर्ग लौटाती है। यदि आप अपने एप्लिकेशन को क्लाउड पर तैनात करना चाहते हैं, तो आप एक ऐसे प्लेटफ़ॉर्म को इंजेक्ट करते हैं जिसका File
वर्ग वास्तव में अमेज़ॅन S3 द्वारा समर्थित है। क्रॉस-प्लेटफ़ॉर्म GUI विभिन्न OSI के लिए अलग-अलग GUI फ्रेमवर्क को इंजेक्ट करके काम करते हैं। समाचारपत्र में एक प्रयोगात्मक समाचार पत्र-से-ईसीएमस्क्रिप्ट कंपाइलर और HTML-समर्थित GUI फ्रेमवर्क है, जो आपको अलग-अलग GUI तत्वों को इंजेक्ट करके, बिना किसी बदलाव के ब्राउज़र में देशी डेस्कटॉप से पूरी तरह से चित्रित GUI एप्लिकेशन को पोर्ट करने की अनुमति देता है।
यदि आप अपने एप्लिकेशन को तैनात करना चाहते हैं, तो IDE एप्लिकेशन को डिस्क-ऑन ऑब्जेक्ट में अनुक्रमित कर सकता है। (इसके पूर्वज, स्मालटाक के विपरीत, समाचारपत्र में एक आउट-ऑफ-इमेज ऑब्जेक्ट क्रमांकन प्रारूप है। आपको पूरी छवि को अपने साथ नहीं ले जाना है, ठीक है क्योंकि सभी निर्भरताएं इंजेक्शन हैं: आईडीई को पता है कि सिस्टम के कौन से हिस्से आपके एप्लिकेशन के हैं। का उपयोग करता है और जो यह नहीं करता है। इसलिए, यह ऑब्जेक्ट स्पेस के जुड़े सबग्राफ को क्रमबद्ध करता है जिसमें आपका एप्लिकेशन शामिल है, इससे अधिक कुछ नहीं।)
यह सब बस ऑब्जेक्ट-ओरिएंटेशन को चरम पर ले जाकर काम करता है: सब कुछ एक वर्चुअल विधि कॉल है (स्मॉलटाकल शब्दावली में "संदेश भेजें", जिसमें से समाचार पत्र एक वंशज है)। यहां तक कि सुपरक्लास लुकअप एक वर्चुअल मेथड कॉल है! जैसे कुछ ले लो
class Foo extends Bar // using Java syntax for familiarity
या, समाचार पत्र में:
class Foo = Bar () () : ()
जावा में, यह Foo
स्थिर वैश्विक नामस्थान में एक नाम बनाएगा , और Bar
स्थैतिक वैश्विक नामस्थान में ऊपर की ओर दिखेगा Bar
Foo
। रूबी में भी, जो बहुत अधिक गतिशील है, यह अभी भी वैश्विक नाम स्थान में एक स्थिर स्थिरांक बनाएगा।
समाचारपत्र में, समतुल्य घोषणा का अर्थ है: नाम के लिए एक गेट्टर विधि बनाएं Foo
और इसे एक ऐसा वर्ग लौटाएं जो नाम के तरीके को कॉल करके अपने सुपरक्लास को देखता है Bar
। नोट: यह रूबी की तरह नहीं है, जहां आप किसी भी निष्पादन योग्य रूबी कोड को सुपरक्लास घोषणा के रूप में डाल सकते हैं , लेकिन कोड को केवल एक बार निष्पादित किया जाएगा जब कक्षा बनाई जाती है और उस कोड का वापसी मूल्य निर्धारित सुपरक्लास बन जाता है। नहीं। विधि Bar
को हर एक विधि देखने के लिए कहा जाता है !
इसके कुछ गहरा प्रभाव हैं:
- चूँकि एक मिक्सिन मूल रूप से एक वर्ग है जो अभी तक अपने सुपरक्लास को नहीं जानता है, और समाचारपत्र में, सुपरक्लास एक गतिशील आभासी विधि कॉल है, और इस प्रकार अज्ञात है, प्रत्येक वर्ग स्वचालित रूप से एक मिक्सिन भी है। आपको मुफ्त में मिक्सी मिलती है।
चूंकि एक आंतरिक वर्ग सिर्फ एक विधि कॉल है जो एक वर्ग देता है, आप बाहरी कक्षा के उपवर्ग में उस पद्धति को ओवरराइड कर सकते हैं, इसलिए प्रत्येक वर्ग आभासी है। आपको मुफ्त में आभासी कक्षाएं मिलती हैं:
class Outer {
class Inner { /* … */ }
}
class Sub extends Outer {
override class Inner { /* … */ }
}
Newspeak:
class Outer = () (
class Inner = () () : ()
) : ()
class Sub = Outer () (
class Inner = () () : ()
) : ()
चूँकि सुपरक्लास सिर्फ एक विधि कॉल है जो एक वर्ग को लौटाता है, आप उस विधि को बाहरी वर्ग के उपवर्ग में ओवरराइड कर सकते हैं, सुपरक्लास में परिभाषित आंतरिक वर्ग उपवर्ग में एक अलग सुपरक्लास हो सकता है। आप मुफ्त में श्रेणी पदानुक्रम विरासत प्राप्त करते हैं:
class Outer {
class MyCoolArray extends Array { /* … */ }
}
class Sub extends Outer {
override class Array { /* … */ }
// Now, for instances of `Sub`, `MyCoolArray` has a different superclass
// than for instances of `Outer`!!!
}
Newspeak:
class Outer = () (
class MyCoolArray = Array () () : ()
) : ()
class Sub = Outer () (
class Array = () () : ()
) : ()
और अंत में, इस चर्चा के लिए सबसे महत्वपूर्ण: चूंकि (उन लोगों के अलावा, जिन्हें आपने अपनी कक्षा में परिभाषित किया है, स्पष्ट रूप से) आप केवल अपने शाब्दिक रूप से संलग्न वर्ग (एस) और अपने सुपरक्लास (एस) में तरीकों को कॉल कर सकते हैं, एक शीर्ष स्तर का बाहरी वर्ग स्पष्ट रूप से इंजेक्ट किए गए लोगों को छोड़कर किसी भी तरीके को कॉल नहीं कर सकते हैं: एक शीर्ष-स्तरीय वर्ग के पास एक संलग्न वर्ग नहीं है, जिसके तरीकों को यह कॉल कर सकता है, और इसमें डिफ़ॉल्ट के अलावा कोई सुपरक्लास नहीं हो सकता है, क्योंकि सुपरक्लास घोषणा है विधि कॉल, और यह स्पष्ट रूप से सुपरक्लास में नहीं जा सकता (यह है)सुपरक्लास) और यह भी शाब्दिक रूप से संलग्न वर्ग में नहीं जा सकता है, क्योंकि कोई भी नहीं है। इसका मतलब यह है कि शीर्ष स्तर की कक्षाएं पूरी तरह से समाप्त हो जाती हैं, वे केवल वही एक्सेस कर सकते हैं जो उन्हें स्पष्ट रूप से इंजेक्ट किया जाता है, और वे केवल वे इंजेक्शन लगाते हैं जो वे स्पष्ट रूप से पूछते हैं। दूसरे शब्दों में: शीर्ष-स्तरीय कक्षाएं मॉड्यूल हैं। आपको मुफ्त में एक पूरा मॉड्यूल सिस्टम मिलता है। वास्तव में, अधिक सटीक होना: शीर्ष-स्तरीय कक्षाएं मॉड्यूल घोषणाएं हैं, इसके उदाहरण मॉड्यूल हैं। तो, आप पैरामीट्रिक मॉड्यूल घोषणाओं और मुक्त करने के लिए प्रथम श्रेणी के मॉड्यूल के साथ एक मॉड्यूल प्रणाली प्राप्त करते हैं, कुछ, जो बहुत परिष्कृत, मॉड्यूल सिस्टम भी कर सकते हैं।
इस सभी इंजेक्शन को दर्द रहित बनाने के लिए, कक्षा की घोषणाओं में एक असामान्य संरचना होती है: इनमें दो घोषणाएँ होती हैं। एक वर्ग रचनाकार है, जो वह निर्माता नहीं है जो वर्ग के उदाहरणों का निर्माण करता है , बल्कि वह निर्माणकर्ता जो उस वातावरण का निर्माण करता है जिसमें वर्ग निकाय चलता है। जावा-जैसे सिंटैक्स में, यह कुछ इस तरह दिखेगा:
class Foo(platform) extends Bar {
Array = platform.collections.Array
String = platform.lang.String
File = platform.io.File
| // separator between class constructor and class body
class MyArray extends Array { /* … */ }
// Array refers to the method defined above which in turn gets it from the
// platform object that was passed into the class "somehow"
}
Newspeak:
class Foo using: platform = Bar (
Array = platform collections Array
String = platform streams String
File = platform files ExternalReadWriteStream
) (
class MyArray = Array () () : ()
) : ()
ध्यान दें कि जिस तरह से एक समाचार पत्र प्रोग्रामर वास्तव में कक्षा को देखने जा रहा है, वह इस तरह है:
मैं भी इसे न्याय करने के लिए शुरू नहीं कर सकता, हालांकि। आपको इसके साथ खुद भी खेलना होगा। गिल्ड ब्राचा ने प्रणाली के विभिन्न पहलुओं के बारे में कुछ बातचीत की है, जिसमें प्रतिरूपकता भी शामिल है। उन्होंने एक बहुत लंबी (2hr) बात की , जिसका पहला घंटा भाषा के लिए पूरी तरह से परिचय है, जिसमें मॉड्यूलरिटी कहानी भी शामिल है। समाचार पत्र प्रोग्रामिंग प्लेटफॉर्म के अध्याय 2 में मॉड्यूलरिटी शामिल है। यदि आप स्क्वीक पर न्यूजपेपर को स्किम करते हैं - ए गाइड फॉर द परप्लेक्स (उर्फ न्यूजक -01) , तो आपको सिस्टम का अहसास होता है। उदाहरण के अनुसार समाचार पत्र एक जीवंत दस्तावेज है (अर्थात यह समाचार पत्र-ऑन-ईसीएमएएसपीट्रिप पोर्ट के अंदर चल रहा है, कोड की प्रत्येक पंक्ति संपादन योग्य है, प्रत्येक परिणाम निरीक्षण योग्य है) मूल वाक्यविन्यास का प्रदर्शन करता है।
लेकिन वास्तव में, आपको इसके साथ खेलना होगा। यह सभी मुख्य धारा और यहां तक कि सबसे गैर-मुख्यधारा भाषाओं से इतना अलग है कि इसे समझाना मुश्किल है, इसका अनुभव करना होगा।