अंतिम लक्ष्य एक इंटरफ़ेस होना है जो प्रत्येक घटक सहमत होता है।
तो, अगर, उदाहरण के लिए, मैं एक जावास्क्रिप्ट साइट है कि -entirely- एक पुराने स्कूल में MVC (गैर रेल/PHP) कार्यान्वयन, और पूरी तरह से AJAX में किया गया था निर्माण किया गया था, मुझे यकीन है कि बनाना होगा में से प्रत्येक कि घटकों को देखने के लिए एक ही इंटरफेस लागू किया।
प्रत्येक मॉडल/व्यू/नियंत्रक में, मैं अपनी "सब्सक्राइब" विधि को पूरी तरह से अलग कर सकता हूं। या, मैं प्रत्येक के लिए एक मानक इंटरफ़ेस लागू कर सकता हूं।
तो मेरे पास एक सार्वजनिक हो सकता है "। रजिस्ट्रार (event_type, subscribing_class)" विधि प्रत्येक एकल घटक में लागू की गई जिसे कॉल करने की उम्मीद की जा सकती है।
इसी प्रकार, मेरे पास एक सार्वजनिक "हो सकता है।" अद्यतन (event_type, डेटा) "विधि प्रत्येक एकल घटक में लागू की गई जिसे कॉल करने की उम्मीद की जा सकती है।
। रजिस्ट्रार और .Update मेरे पर्यवेक्षक संचार के लिए इंटरफ़ेस हैं। मेरी कक्षाओं के अंदर, प्रत्येक के पास "सदस्यता लें (प्रकाशक, event_type, self_reference)" विधि हो सकती है। यही तरीका बस हो सकता है:
Class.Subscribe = function (publisher, event_type) {
var self_reference = this;
publisher.Register(event_type, self_reference);
};
प्रत्येक एक आंतरिक .Notify विधि हो सकता है:
Class.Notify = function (type, data) {
var subscribers = this.subscribers[type],
i = 0, l = subscribers.length;
for (; i < l; i++) { subscribers[i].Update(type, data); }
};
क्योंकि मैं राजी हो गया है कि मेरे संचार इंटरफेस के सभी इस तरह व्यवहार करने के लिए जा रहा है, इससे कोई फर्क नहीं पड़ता कि मेरे आंतरिक क्या दिखते हैं।
मेरा मॉडल मेरे दृश्य के लिए अनजान होना जारी रख सकता है, और मेरा दृश्य मेरे नियंत्रक के लिए अनजान हो सकता है।
.Notify और। सदस्यता को इस तरह लागू करने की आवश्यकता नहीं है - वे सार्वजनिक रूप से सुलभ इंटरफ़ेस का हिस्सा नहीं हैं। वे कुछ भी हो सकता है जो मैं चाहता हूं।
सदस्यता लें प्रकाशकों के एक ARRAY ले सकते हैं और डेटा के कई बिंदुओं की सदस्यता लेने के लिए इसे फॉर-लूप के माध्यम से दबा सकते हैं। या {"पब": x, "type": y} ऑब्जेक्ट लिटलल्स की एक सरणी लें, और प्रत्येक के रजिस्ट्रार विधि को कॉल करें, ताकि आप उस वर्ग के सभी बूटस्ट्रैपिंग को एक फ़ंक्शन कॉल के साथ प्राप्त कर सकें।
एक ही चीज़ ऑडियो प्लेयर ऐप बनाने के साथ जाती है। मुझे परवाह नहीं है कि सार्वजनिक गुण म्यूजिकप्लेयर शेयर क्या हैं। मुझे पता है कि यह उपयोग करता है। प्ले(),। रोकें(), .Stop(), लोड करें (ट्रैक)।
यदि मैं सुनिश्चित करता हूं कि मैं केवल सहमत-सार्वजनिक, सार्वजनिक इंटरफ़ेस विधियों का उपयोग करता हूं, तो प्रोग्राम काम करने जा रहा है। क्यों?
क्योंकि संगीत प्लेयर पर काम करने वाला व्यक्ति संगीतप्लेयर के आंतरिक रूपों को बदल सकता है। वह पूरी तरह से उन्हें फिर से लिख सकता है। शायद एक ._ precacheSong (ट्रैक) विधि है। लेकिन अगर यह बदल जाता है तो क्या होगा। सड़क के नीचे _cueTrack (ट्रैक)?
आप बस कुछ दोस्त के विजेट का उपयोग कर रहे हैं, और एक दिन आपका विजेट क्रैश हो जाता है, क्योंकि आप इसे विस्तारित कर रहे थे या इसे गैर-इंटरफ़ेस विधियों या गैर-इंटरफ़ेस डेटा के आधार पर कार्यान्वित कर रहे थे, जो v1.2.1
के रूप में परिवर्तित हुआ
तो लूज भाषाओं में भी, इंटरफ़ेस महत्वपूर्ण है। वे आपको इस बात का एक नक्शा देते हैं कि आप किसी भी घटक को कॉल करने की उम्मीद कर सकते हैं, जिसमें उस कार्यक्षमता की अपेक्षा की जाती है - और इस घटक के आंतरिक इंटर्न, इनपुट और आउटपुट कैसे सटीक होंगे (हालांकि अधिक प्रकार/त्रुटि- इनपुट पर जांच की आवश्यकता है)।
वे आपको वास्तव में आसानी से "डक-टाइप" की अनुमति देते हैं (विभिन्न वर्ग उदाहरणों की एक सूची लें - प्रत्येक पर एक ही फ़ंक्शन कॉल को आग लगाना, उम्मीद है कि प्रत्येक के पास एक ही विधि है और उसी डेटा प्रारूप को लेता है)।
यहां तक कि जावास्क्रिप्ट के साथ बेहतर:
मेरे .Subscribe कोड भी केवल एक बार लिखा जा सकता है, और फिर कुछ भी है कि मैं इसे "वारिस" करना चाहते करने के लिए बाध्य।
Interface.Subscribe = function (publisher, evt_type) {
var self_ref = this;
publisher.Register(evt_type, self_ref);
};
Class_1.Subscribe = Interface.Subscribe.bind(Class_1);
Class_2.Subscribe = Interface.Subscribe.bind(Class_2);
Class_3.Subscribe = Some_Other_Interface.Subscribe.bind(Class_3);
और मुझे लगता है कि स्वतंत्र रूप से कर सकते हैं, क्योंकि मुझे पता है कि सब कुछ मैं करने के लिए सदस्यता के लिए चाहते हैं एक ही सार्वजनिक-इंटरफेस हो जा रहा है।
मेरी संपादित पोस्ट देखें। मैं नहीं देख सकता कि यह "अनावश्यक" क्यों होगा – NullUserException