गो "उत्पादकता" इंटरफेस के साथ उत्पादकता में सुधार कैसे करता है, और यह कैसे विस्तार विधियों के C # की धारणा के साथ तुलना करता है?


21

Go Language Tutorial में, वे बताते हैं कि इंटरफेस कैसे काम करता है:

जाओ के पास कक्षाएं नहीं हैं। हालांकि, आप संरचनात्मक प्रकारों पर विधियों को परिभाषित कर सकते हैं। विधि रिसीवर समारोह कीवर्ड और विधि नाम के बीच अपनी ही तर्क सूची में प्रकट होता है।

type Vertex struct {
    X, Y float64
}

func (v *Vertex) Abs() float64 {
    return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

एक इंटरफ़ेस प्रकार विधियों के एक सेट द्वारा परिभाषित किया गया है। इंटरफ़ेस प्रकार का एक मूल्य उन विधियों को लागू करने वाले किसी भी मूल्य को पकड़ सकता है।

गो में इंटरफेस बनाने का यह एकमात्र तरीका है। Google आगे बताता है कि:

एक प्रकार विधियों को लागू करके एक इंटरफ़ेस को लागू करता है। आशय की स्पष्ट घोषणा [यानी interfaceघोषणाएँ] नहीं है।

इंप्लिक्ट इंटरफेस उन पैकेजों से कार्यान्वयन पैकेजों को अलग करते हैं जो इंटरफेस को परिभाषित करते हैं: न तो दूसरे पर निर्भर करता है।

यह सटीक इंटरफेस की परिभाषा को भी प्रोत्साहित करता है, क्योंकि आपको हर कार्यान्वयन को खोजने और नए इंटरफ़ेस नाम के साथ टैग करने की आवश्यकता नहीं है।

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

Google का दावा है कि यह तेजी से विकास को प्रोत्साहित करता है, लेकिन क्यों? क्या आप C # में स्पष्ट इंटरफेस से दूर जाकर कुछ छोड़ देते हैं? क्या C # में एक्सटेंशन मेथड्स से किसी को कुछ लाभ प्राप्त करने की अनुमति मिल सकती है?



1
ये गो इंटरफेस सी # एक्सटेंशन के तरीकों की तुलना में C ++ टेम्पलेट क्या कर सकते हैं जैसे अधिक लगता है। C # में "किसी भी प्रकार कि ए और बी तरीकों को लागू करता है" जैसा कुछ नहीं है, लेकिन आप ऐसा कर सकते हैं कि C ++ टेम्प्लेट का उपयोग कर सकते हैं।
svick


डक टाइपिंग का सिर्फ एक रूप 'निहित इंटरफेस' नहीं है?
एलोन गुरिलनेक

"डक्ट टाइपिंग का एक रूप 'निहितार्थ' नहीं है?" गो के इंटरफेस संरचनात्मक टाइपिंग का एक उदाहरण हैं। बहुत ही समान अवधारणा।
मॉरडस

जवाबों:


12

मुझे विस्तार के तरीके और निहित इंटरफेस बिल्कुल नहीं दिख रहे हैं।

पहले उद्देश्य से बात करते हैं।

एक्सटेंशन मेथड एक सिंटैक्टिक शुगर के रूप में मौजूद है, विशेष रूप से आपको एक विधि का उपयोग करने की क्षमता प्रदान करता है जैसे कि वह किसी वस्तु का सदस्य हो, बिना उस ऑब्जेक्ट के इंटर्नल तक पहुंच के। विस्तार के तरीकों के बिना आप बिल्कुल एक ही काम कर सकते हैं, आपको बस सुखद सिंटैक्स नहीं मिलता है someObjectYouCantChange.YourMethod()और कॉल करना पड़ता है YourMethod(someObjectYouCantChange)

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

अब परिणाम के लिए बोलते हैं।

एक्सटेंशन के तरीकों में वास्तव में कोई नहीं है, यह पूरी तरह से निर्दयी सुरक्षा बाधाओं के अनुरूप है। .NET एक मॉडल पर अलग-अलग दृष्टिकोण (अंदर, बाहर, उत्तराधिकारी और पड़ोसी से परिप्रेक्ष्य) में सहायता करने के लिए उपयोग करने की कोशिश करता है। परिणाम सिर्फ कुछ वाक्यात्मक सुखदता है।

निहित इंटरफेस के परिणाम कुछ चीजें हैं।

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

Linq में विस्तार के तरीकों की उपयोगिता बड़े पैमाने पर एक अंतरफलक पर एक विधि कार्यान्वयन को तैयार करने की उनकी क्षमता से प्राप्त होती है , विशेष रूप से IEnumerableऔर IQueryable। जबकि आप staticइसे उपयोगिता वर्ग में विधियों के साथ नकली कर सकते हैं , यह अनाड़ी होगा।
रॉबर्ट हार्वे

@RobertHarvey यह दावा करने के लिए आवश्यक नहीं है कि यह एक इंटरफ़ेस पर विधि डालता है, एक इंटरफ़ेस और एक विस्तार विधि पर एक वास्तविक विधि के बीच अंतर पर ध्यान दें: एक इंटरफ़ेस पर एक विधि को उस वर्ग के अंदर लागू किया जाएगा जो उस इंटरफ़ेस को लागू करता है, और इसलिए किसी भी विस्तार विधि से अधिक के लिए एक महान सौदे के लिए उपलब्ध है। फिर से यह एक परिप्रेक्ष्य है, एक वर्ग के अंदर लागू कोड को बाहर की तुलना में एक विशेष परिप्रेक्ष्य दिया जाता है।
जिमी हॉफ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.