2010-08-01 15 views
7

में कार्यान्वयन नहीं है प्रमुख डिजाइन सिद्धांतों में से एक एक इंटरफेस के लिए एक कार्यान्वयन नहीं है। क्या यह PHP या किसी अन्य कमजोर टाइप की गई भाषा में भी संभव है।एक इंटरफेस में प्रोग्राम php

संपादित करें:

मैं शायद के रूप में स्पष्ट रूप से के रूप में मैं होना चाहिए सवाल लिखना फ्लॉप। मेरा मतलब यह नहीं है कि php cant interfaces का उपयोग नहीं कर सकता - यह obvisouly कर सकते हैं। मेरा मतलब है कि डिजाइन सिद्धांत "एक इंटरफ़ेस के लिए प्रोग्राम और कार्यान्वयन नहीं" कमजोर टाइप की गई भाषाओं में अनावश्यक हो जाता है।

+0

मेरी संपादित पोस्ट देखें। मैं नहीं देख सकता कि यह "अनावश्यक" क्यों होगा – NullUserException

उत्तर

4

हां। पर इंटरफेस

// Implement the interface 
class Template implements iTemplate 
{ 
    private $vars = array(); 

    public function setVariable($name, $var) 
    { 
     $this->vars[$name] = $var; 
    } 

    public function getHtml($template) 
    { 
     foreach($this->vars as $name => $value) { 
      $template = str_replace('{' . $name . '}', $value, $template); 
     } 

     return $template; 
    } 
} 

पीएचपी मैनुअल: इंटरफेस को परिभाषित करें:

interface iTemplate 
{ 
    public function setVariable($name, $var); 
    public function getHtml($template); 
} 

और लागू यह http://php.net/manual/en/language.oop5.interfaces.php

मैं नहीं जानता कि क्यों यह संभव इंटरफेस के लिए नहीं होगा सिर्फ इसलिए कि भाषा कमजोर टाइप की गई है।


संपादित करें: बिंदु (कम या ज्यादा) एक इंटरफेस होने की तो आप कर सकते हैं अपने कोड वर्ग है कि वास्तव में लागू करता है की परवाह किए बिना फिर से उपयोग इंटरफ़ेस कहा है।

कहें कि आपका प्रोग्राम एक इंटरफ़ेस Set का उपयोग करता है, जिसमें addItem(), removeItem() और विधियां हैं। इंटरफेस के साथ, आप जानते हैं कि अंतर्निहित Set कार्यान्वयन के बावजूद आप इनमें से किसी भी 3 विधियों को कॉल करने में सक्षम होंगे, चाहे वह हैशसेट, ट्रीसेट या जो भी हो।

यदि आप कमजोर टाइप की गई भाषा का उपयोग कर रहे हैं तो यह नहीं बदलेगा; आप अभी भी कोड कर सकते हैं जैसे कि आप दृढ़ता से टाइप की गई भाषा का उपयोग कर रहे थे। मुझे पता है कि मैंने इस स्पष्टीकरण को वास्तव में अच्छी तरह से नहीं कहा है, लेकिन मुझे उम्मीद है कि आपको विचार मिल जाएगा।

0

php में interfaces है और आप उन्हें प्रोग्राम कर सकते हैं। आप ऐसा क्यों नहीं कर पाएंगे?

एक अंतरफलक के लिए प्रोग्रामिंग मतलब है कि आप सिर्फ इतना है कि इंटरफ़ेस द्वारा की पेशकश की है और कार्यक्षमता का उपयोग न कार्यान्वयन विवरण पर भरोसा करते हैं और न ही है कि कार्यान्वयन द्वारा की पेशकश की है और तुम सिर्फ इस बारे में पता होता है अन्य कार्यक्षमता का उपयोग, क्योंकि कार्यान्वयन हो सकता है बदलें (इंटरफ़ेस नहीं होना चाहिए)।

+0

वैसे जब आप सिद्धांतों का उपयोग नहीं कर रहे हैं तो सिद्धांत का पूरा बिंदु व्यर्थ हो जाता है। निश्चित रूप से आप php में इंटरफेस का उपयोग कर सकते हैं, मैं स्पष्ट रूप से विवाद नहीं कर रहा हूं, मैं और कह रहा हूं कि जब आप ऑब्जेक्ट प्रकार का उपयोग नहीं कर सकते हैं तो सिद्धांत प्रभावी नहीं है। उदाहरण के लिए एक दृढ़ प्रकार की भाषा में आप इसका उपयोग करेंगे: टाइप टी = नया कंक्रीट टाइप - php में आप बस $ t = new कंक्रीट टाइप टाइप करते हैं। निश्चित रूप से कंक्रीट टाइप इंटरफ़ेस को कार्यान्वित करेगा लेकिन instanciating कोड इस बारे में कुछ भी नहीं जानता है। शायद मैं सिद्धांत को गलत समझ रहा हूँ। – David

+0

@ डेविड वे निश्चित रूप से कमजोर टाइप की गई भाषा में अपने कुछ फायदे खो देते हैं, लेकिन अगर वे सही तरीके से उपयोग किए जाते हैं तो वे अभी भी उपयोगी हैं। – NullUserException

+0

लेकिन सिद्धांत का इरादा है कि "एक बार जब आप केवल इंटरफेस पर निर्भर हो जाते हैं, तो आप" ई गामा "के कार्यान्वयन से निराश हो जाते हैं, लेकिन कमजोर टाइप की गई भाषा में आप तत्काल कंक्रीट क्लास का उपयोग कर रहे हैं। मैं सिर्फ यह नहीं देख सकता कि सिद्धांत यहां कैसे लागू होता है। मैं शायद बेवकूफ हूं लेकिन यह किसी कारण से मेरे साथ जार है। – David

0

"इंटरफेस" और "कार्यान्वयन" से आपका क्या मतलब है, इस पर निर्भर करता है। ये ढीले शब्द हैं जिनके अर्थ संदर्भ के आधार पर स्थानांतरित हो सकते हैं।

PHP5 में ओओपी संरचनाएं जावा और सी # जैसी हैं, जैसे संदर्भ, कक्षाएं, सार कक्षाएं और इंटरफेस के रूप में ऑब्जेक्ट्स। इसमें विधि पैरामीटर के लिए टाइप संकेत भी शामिल है। ये उपकरण कुछ के लिए "इंटरफ़ेस" बनाने के लिए उपयोग किए जा सकते थे।

0

अंतिम लक्ष्य एक इंटरफ़ेस होना है जो प्रत्येक घटक सहमत होता है।

तो, अगर, उदाहरण के लिए, मैं एक जावास्क्रिप्ट साइट है कि -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); 

और मुझे लगता है कि स्वतंत्र रूप से कर सकते हैं, क्योंकि मुझे पता है कि सब कुछ मैं करने के लिए सदस्यता के लिए चाहते हैं एक ही सार्वजनिक-इंटरफेस हो जा रहा है।

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