2010-08-25 11 views
7

मैं php में काम करता हूं, और इंटरफेस की अवधारणा मुझे यहां थोड़ा बेकार लगता है। पढ़ने से, मैं समझता हूं कि इंटरफेस "अनुबंध द्वारा डिजाइन" का हिस्सा हैं, लेकिन कम से कम किसी विशेष प्रकार की वापसी की गारंटी के बिना, वास्तव में कोई अनुबंध नहीं है। ऐसा लगता है कि यह एक अनुबंध की तरह है जो पढ़ता है, "हम निम्नलिखित करने के लिए सहमत हैं:" "- समझौते की कोई शर्तें नहीं हैं।गतिशील/ढीले-टाइप की गई भाषाओं में इंटरफ़ेस क्यों?

यदि मुझे गारंटी है कि किसी ऑब्जेक्ट की कोई विधि है, तो ऐसा लगता है कि इंटरफेस विशेष रूप से उपयोगी नहीं हैं। अगर मैं किसी ऑब्जेक्ट को कॉल करने का प्रयास करता हूं, तो मुझे कोई घातक त्रुटि मिलती है, इसलिए मुझे बहुत जल्दी पता चलता है कि उस वर्ग के पास उस नाम के साथ कोई विधि नहीं है। अगर मैं स्मार्ट बनना चाहता हूं और पहले से जांचना चाहता हूं कि कक्षा में कोई तरीका है, तो इंटरफ़ेस की जांच कर रहा है, और यह देख रहा है कि ऑब्जेक्ट लागू करता है कि इंटरफ़ेस मुझे उस ऑब्जेक्ट को सीधे जांचने से कहीं अधिक समय नहीं बचाता है (जो मैं करता हूं वैसे भी यह देखने के लिए कि कक्षा में उस पद्धति के बावजूद यह तरीका था, चाहे वह किसी भी इंटरफेस को लागू करता या लागू नहीं करता)।

दूसरे शब्दों में, सिर्फ इसलिए कि मेरे पास विशेष नाम हैं जिनके पास विशेष नाम हैं, जो मुझे किसी विशेष व्यवहार की गारंटी नहीं देते हैं। अगर मुझे किसी निश्चित प्रकार के चर के रिटर्न की गारंटी है, तो मुझे कम से कम कुछ आउटपुट होगा जो आउटपुट होगा, और मैं उस इंटरफ़ेस के साथ ऑब्जेक्ट का उपयोग करने वाले कोड को लिख सकता हूं, क्योंकि मुझे पता है कि मैं क्या कर रहा हूं इसका यदि यह एक स्ट्रिंग देता है, तो मैं कम से कम निश्चितता के साथ कोडिंग जारी रख सकता हूं कि मैं बाद में स्ट्रिंग आउटपुट से निपट रहा हूं। इसलिए जब रिटर्न प्रकार निर्दिष्ट होता है तो मुझे कम से कम कुछ व्यवहार की गारंटी है। क्या इंटरफेस के लिए व्यवहार भाग की गारंटी है, या नहीं?

एकमात्र चीज जो मैं सोच सकता हूं वह यह है कि जब मैं कोड लिख रहा हूं, तो यह बाद में उस कक्षा को लिखते समय कुछ तरीकों को बनाने के लिए सुनिश्चित करने के लिए एक नोट के रूप में कार्य करता है। जब मैं कोड लिख रहा हूं तो यह मचान की तरह लगता है; जब मैं वास्तव में इसका उपयोग कर रहा हूं तब से मुझे बहुत लाभ नहीं दिखता है। इसलिए जब मैं कक्षाएं बना रहा हूं, तब से मैं मानक को बनाए रखना मेरे लिए अधिक है। यह लाभ अनुबंध द्वारा डिजाइन की अवधारणा में वास्तव में कब्जा नहीं किया जाता है।

वास्तव में PHP जैसे गतिशील/ढीली टाइप की गई भाषाओं में इंटरफ़ेस का उपयोग करने से आपको क्या लाभ मिलता है? क्या वे महान हैं, या यह कुछ ऐसा है जो अधिक मजबूत ओओ भाषा लागू करता है, इसलिए PHP भी इसे लागू करता है?

+4

पेडेंटिक नोट: PHP 'untyped' नहीं है। यह गतिशील और ढीला टाइप किया गया है। एक बड़ा अंतर है ... – ircmaxell

+0

अगर यह एक बड़ा अंतर बनाता है तो यह इतना pedantic नहीं है :) फिक्स्ड। – user151841

+1

क्या होगा यदि आपके सॉफ़्टवेयर की आवश्यकता है कि कोई विधि किसी प्राइम नंबर या यूएस-एएससीआईआई स्ट्रिंग को लौटाती है? सिर्फ इसलिए कि एक इंटरफेस "अनुबंध" के उस हिस्से को निर्दिष्ट नहीं कर सकता है, और वे चीजें आपके प्रोग्राम को फेंक सकती हैं, क्या इसका मतलब यह है कि इंटरफेस सभी भाषाओं में पूरी तरह से बेकार है? साथ ही, दृढ़ता से टाइप की गई भाषाओं में, एक प्रकार-मेल-मिलाप भी एक त्रुटि उत्पन्न करता है। इसलिए आप आसानी से पूछ सकते हैं कि आपको मजबूती से टाइप की गई भाषाओं में अपने इंटरफ़ेस में रिटर्न प्रकार निर्दिष्ट करने की आवश्यकता क्यों है। –

उत्तर

3

इंटरफेस का उपयोग तब किया जाता है जब आप वास्तव में किसी ऑब्जेक्ट को किसी विधि को लागू करने की अपेक्षा करते हैं।

उदाहरण के लिए, अगर मैं एक DB आवरण का निर्माण कर रहा हूँ और यह व्यवहार है, जो आप अपने आप को एक बूटस्ट्रैप में रजिस्टर है, तो अपने व्यवहार (उदाहरण, sluggable के लिए) चलाने से पहले का समर्थन करता है, मैं जाँच करेगा कि वे अपने "DB_Wrapper_Behaviour_Interface" को लागू उपयोग करके:

if(!($behaviourObject instanceof DB_Wrapper_Behaviour_Interface)) { 
    throw new Exception("Your behaviour doesn't implement my interface"); 
} 
+0

उपयोगकर्ता 151841 पहले से ही इस सवाल को उठाया गया है। क्या आप प्रश्न में उठाए गए संदेहों के संबंध में उपयोगीता पर विस्तृत जानकारी दे सकते हैं? – VolkerK

+0

सिर्फ एक 'विधि' से अधिक। एक विधि हस्ताक्षर। प्रकार संकेत और डिफ़ॉल्ट सहित ... – ircmaxell

+0

ओपी और ग्रेग0यर दोनों से वोल्करके मुझे लगता है कि वे एक-व्यक्ति परियोजनाओं पर इंटरफेस का उपयोग कर रहे हैं। हालांकि इसे प्रोत्साहित किया जाता है, जब इंटर-डेवलपर धारणाएं खेलती हैं, जैसे कि मेरे डीबी रैपर - व्यवहार उदाहरण। –

0

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

+0

"वापसी मूल्य क्या दिखना चाहिए" - लेकिन यह php द्वारा लागू नहीं है (और user151841 ने उठाया है सवाल में भी पहलू)। तो, "दस्तावेज" को शाब्दिक रूप से लिया जाना है; बाहरी उपकरण और/या विचार उस अतिरिक्त जानकारी/एनोटेशन को चुन सकते हैं लेकिन PHP स्वयं परवाह नहीं करता है। – VolkerK

+0

@ greg0ire मैं कई अन्य भाषाओं से परिचित नहीं हूं। क्या आप PHP में एक उदाहरण दे सकते हैं जहां आप किसी संपत्ति पर एक गैर-मौजूद विधि कहलाते हैं, और वास्तव में गलत क्या हुआ है इसका एक अस्पष्टता है? – user151841

+0

@ user151841: नहीं, मैं नहीं कर सकता, ऐसी चीज करने का प्रयास क्यों करेगा? मैं जो कह रहा था वह यह सुनिश्चित करना कठिन है कि यदि आप कोई इंटरफ़ेस नहीं रखते हैं तो लागू करने के लिए हर विधि लागू की जाती है। आपको संपत्ति के गेटर्स को कॉल के लिए आवेदन के सभी कोड खोजना होगा, और फिर देखें कि इस पर कौन सी विधियां बुलाई जाती हैं। आपके सभी ऐप का यूनिट-परीक्षण आपको घातक त्रुटियों को ढूंढने में मदद कर सकता है, लेकिन एक इंटरफ़ेस कहीं अधिक सुविधाजनक है। – greg0ire

0

मुझे नोट करना है कि PHP 5.4 टाइप संकेत देने का समर्थन करेगा। अभी मुझे लगता है कि फ़ंक्शन तर्कों के लिए केवल एक प्रकार का संकेत है, लेकिन मुझे लगता है कि वापसी मूल्यों के लिए भी होगा। (कम से कम पहले से ही RFC है, हालांकि बहुत पुराना और पुराना है।)

+0

यह वहां है, लेकिन यह अभी भी एक [बहुत प्रतिस्पर्धात्मक विशेषता] है (http://schlueters.de/blog/archives/139-Scalar-type-hints-in-PHP-trunk.html) ... मैं अंदर नहीं हूं वर्तमान कार्यान्वयन का समर्थन ... मुझे लगता है कि यह उपयोग करने योग्य होने के लिए बहुत सख्त तरीका है। – ircmaxell

+0

एचएम, मुझे रिटर्न वैल्यू प्रकार संकेतों के बारे में कुछ भी नहीं मिल रहा है ... – NikiC

+0

मेरा तर्क तर्क संकेत के लिए था। मैंने रिटर्न टाइप संकेत के बारे में कुछ नहीं सुना है ... भ्रम के लिए खेद है ... – ircmaxell

1

अनुबंध द्वारा डिज़ाइन वापसी प्रकारों के बिना और अधिक कठिन बना दिया गया है, लेकिन 'पूछो' पर 'बताएं' का पक्ष लेने के लिए मत भूलना।

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

अब आप तर्क दे सकते हैं कि यहां औपचारिक अनुबंध की कोई आवश्यकता नहीं है, क्योंकि अगर आप ऐसा करने के लिए कह रहे हैं तो सहयोगी ऐसा नहीं कर सकता है, तो सिस्टम एक त्रुटि फेंक देगा। लेकिन मुझे लगता है कि एक जिम्मेदारी के रूप में इंटरफेस का उपयोग करने में बिंदु याद आती है।

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