ठीक है, मेरा एक दोस्त आगे-पीछे जाता है कि प्रोग्रामिंग में "इंटरफ़ेस" का क्या मतलब है।
एक "इंटरफ़ेस" का सबसे अच्छा वर्णन क्या है।
मेरे लिए एक इंटरफ़ेस एक वर्ग का एक खाका है, क्या यह सबसे अच्छी परिभाषा है?
ठीक है, मेरा एक दोस्त आगे-पीछे जाता है कि प्रोग्रामिंग में "इंटरफ़ेस" का क्या मतलब है।
एक "इंटरफ़ेस" का सबसे अच्छा वर्णन क्या है।
मेरे लिए एक इंटरफ़ेस एक वर्ग का एक खाका है, क्या यह सबसे अच्छी परिभाषा है?
जवाबों:
एक इंटरफ़ेस विकास में अधिक अतिभारित और भ्रमित करने वाली शर्तों में से एक है।
यह वास्तव में अमूर्तन और अतिक्रमण की अवधारणा है। किसी दिए गए "बॉक्स" के लिए, यह उस बॉक्स के "इनपुट" और "आउटपुट" की घोषणा करता है। सॉफ्टवेयर की दुनिया में, आमतौर पर इसका मतलब है कि ऑपरेशन (जिसे तर्कों के साथ) बॉक्स पर लागू किया जा सकता है और कुछ मामलों में इन ऑपरेशनों के रिटर्न प्रकार।
यह क्या नहीं करता है यह परिभाषित करता है कि इन ऑपरेशनों के शब्दार्थ क्या हैं, हालांकि उन्हें घोषणा (जैसे, टिप्पणियों के माध्यम से), या अच्छे नामकरण सम्मेलनों को लेने के लिए निकटता में प्रलेखित करना सामान्य (और बहुत अच्छा अभ्यास) है। फिर भी, इस बात की कोई गारंटी नहीं है कि इन इरादों का पालन किया जाएगा।
यहाँ एक सादृश्य है: अपने टेलीविजन पर एक नज़र रखना जब यह बंद है। इसका इंटरफ़ेस बटन है जिसमें विभिन्न प्लग और स्क्रीन हैं। इसका शब्दार्थ और व्यवहार यह है कि इसमें इनपुट (जैसे, केबल प्रोग्रामिंग) लगते हैं और इसमें आउटपुट (स्क्रीन, ध्वनि, आदि पर प्रदर्शन) होते हैं। हालाँकि, जब आप एक ऐसे टीवी को देखते हैं जिसमें प्लग नहीं है, तो आप अपने अपेक्षित शब्दार्थ को एक इंटरफेस में प्रस्तुत कर रहे हैं। आप सभी जानते हैं, जब आप इसे प्लग इन करते हैं तो टीवी बस फट सकता है। हालांकि, इसके "इंटरफ़ेस" के आधार पर आप यह मान सकते हैं कि यह कोई भी कॉफी नहीं बनाएगा क्योंकि इसमें पानी का सेवन नहीं होता है।
ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग में, एक इंटरफ़ेस आम तौर पर तरीकों (या संदेशों) के सेट को परिभाषित करता है जो उस वर्ग का एक उदाहरण है जिसमें उस इंटरफ़ेस का जवाब दिया जा सकता है।
इस भ्रम में क्या शामिल है कि कुछ भाषाओं में, जावा की तरह, इसकी भाषा विशिष्ट शब्दार्थ के साथ एक वास्तविक इंटरफ़ेस है। जावा में, उदाहरण के लिए, यह बिना किसी कार्यान्वयन के साथ विधि घोषणाओं का एक सेट है, लेकिन एक इंटरफ़ेस भी एक प्रकार से मेल खाता है और विभिन्न टाइपिंग नियमों का पालन करता है।
अन्य भाषाओं में, C ++ की तरह, आपके पास इंटरफ़ेस नहीं है। एक वर्ग ही विधियों को परिभाषित करता है, लेकिन आप गैर-निजी तरीकों की घोषणाओं के रूप में वर्ग के इंटरफ़ेस के बारे में सोच सकते हैं। C ++ कैसे संकलित होने के कारण, आपको हेडर फाइलें मिलती हैं, जहां आप वास्तविक कार्यान्वयन के बिना वर्ग का "इंटरफ़ेस" रख सकते हैं। आप शुद्ध वर्चुअल फ़ंक्शंस आदि के साथ अमूर्त कक्षाओं के साथ जावा इंटरफेस की नकल भी कर सकते हैं।
एक इंटरफ़ेस सबसे निश्चित रूप से एक वर्ग के लिए खाका नहीं है। एक परिभाषा द्वारा एक खाका, "कार्रवाई की विस्तृत योजना" है। एक इंटरफ़ेस एक कार्रवाई के बारे में कुछ भी नहीं वादा करता है! भ्रम का स्रोत यह है कि अधिकांश भाषाओं में, यदि आपके पास एक इंटरफ़ेस प्रकार है जो विधियों के एक सेट को परिभाषित करता है, तो वह वर्ग जो इसे लागू करता है उसी विधियों को दोहराता है (लेकिन परिभाषा प्रदान करता है), इसलिए इंटरफ़ेस एक कंकाल या एक जैसा दिखता है कक्षा की रूपरेखा।
निम्नलिखित स्थिति पर विचार करें:
आप एक बड़े, खाली कमरे के बीच में होते हैं, जब एक ज़ोंबी अचानक आप पर हमला करता है।
आपके पास कोई हथियार नहीं है।
सौभाग्य से, एक जीवित जीवित मानव कमरे के द्वार में खड़ा है।
"शीघ्र!" आप उस पर चिल्लाते हैं। "मुझे कुछ फेंक दो मैं ज़ोंबी के साथ हिट कर सकता हूं!"
अब विचार करें:
आपने निर्दिष्ट नहीं किया (और न ही आपको परवाह है) कि आपका दोस्त टॉस क्या चुनेगा;
... लेकिन यह तब तक मायने नहीं रखता, जब तक कि:
यह कुछ ऐसा है जिसे उछाला जा सकता है (वह आपको सोफा नहीं दे सकता)
यह कुछ ऐसा है जिसे आप पकड़ सकते हैं (आइए आशा करते हैं कि उसने शूरिकेन को टॉस नहीं दिया था)
यह कुछ ऐसा है जिसका उपयोग आप ज़ोंबी के दिमाग को बाहर करने के लिए कर सकते हैं (यह तकिए और इस तरह के नियम)
इससे कोई फर्क नहीं पड़ता कि आपको बेसबॉल बैट या हथौड़ा मिलता है -
जब तक यह आपकी तीन शर्तों को लागू करता है, आप अच्छे हैं।
इसका सारांश प्रस्तुत करना:
जब आप एक इंटरफ़ेस लिखते हैं, तो आप मूल रूप से कह रहे हैं: "मुझे कुछ चाहिए जो ..."
इंटरफ़ेस एक अनुबंध है जिसे आपको अनुपालन करने या दिए जाने पर निर्भर करना चाहिए, यदि आप कार्यान्वयनकर्ता या उपयोगकर्ता हैं।
मुझे नहीं लगता कि "खाका" उपयोग करने के लिए एक अच्छा शब्द है। एक खाका आपको बताता है कि कैसे कुछ का निर्माण करना है। एक इंटरफ़ेस विशेष रूप से आपको यह बताने से बचता है कि कुछ का निर्माण कैसे करें।
एक इंटरफ़ेस परिभाषित करता है कि आप एक वर्ग के साथ कैसे बातचीत कर सकते हैं, अर्थात यह किन तरीकों का समर्थन करता है।
मेरे लिए एक इंटरफ़ेस एक वर्ग का एक खाका है, क्या यह सबसे अच्छी परिभाषा है?
नहीं। खाका में आमतौर पर इंटर्न शामिल होते हैं। लेकिन एक इंटरफ़ेस विशुद्ध रूप से इस बारे में है कि कक्षा के बाहर क्या दिखाई दे रहा है ... या अधिक सटीक रूप से, इंटरफ़ेस को लागू करने वाले वर्गों का एक परिवार।
इंटरफ़ेस में स्थिरांक के तरीकों और मूल्यों के हस्ताक्षर शामिल हैं, और यह भी (आमतौर पर अनौपचारिक) कक्षाओं के बीच "व्यवहार अनुबंध" है जो इंटरफ़ेस और इसे उपयोग करने वाले अन्य को लागू करते हैं।
प्रोग्रामिंग में, एक इंटरफ़ेस परिभाषित करता है कि किसी वस्तु का व्यवहार क्या होगा, लेकिन यह वास्तव में व्यवहार को निर्दिष्ट नहीं करेगा। यह एक अनुबंध है, जो गारंटी देगा, कि एक निश्चित वर्ग कुछ कर सकता है।
यहाँ C # कोड के इस टुकड़े पर विचार करें:
using System;
public interface IGenerate
{
int Generate();
}
// Dependencies
public class KnownNumber : IGenerate
{
public int Generate()
{
return 5;
}
}
public class SecretNumber : IGenerate
{
public int Generate()
{
return new Random().Next(0, 10);
}
}
// What you care about
class Game
{
public Game(IGenerate generator)
{
Console.WriteLine(generator.Generate())
}
}
new Game(new SecretNumber());
new Game(new KnownNumber());
खेल वर्ग को एक गुप्त संख्या की आवश्यकता होती है। इसे जांचने के लिए, आप उसे एक गुप्त संख्या के रूप में उपयोग करने के लिए इंजेक्ट करना चाहेंगे (इस सिद्धांत को इनवर्सन ऑफ कंट्रोल कहा जाता है)।
गेम क्लास "ओपन माइंडेड" होना चाहता है, जो वास्तव में रैंडम नंबर बनाएगा, इसलिए वह अपने कंस्ट्रक्टर में "कुछ भी, जिसके लिए एक जेनरेट मेथड है" पूछेगा।
सबसे पहले, इंटरफ़ेस निर्दिष्ट करता है, जो ऑब्जेक्ट एक ऑपरेशन प्रदान करेगा। इसमें वही शामिल है जो यह दिखता है, लेकिन कोई वास्तविक कार्यान्वयन नहीं दिया गया है। यह सिर्फ विधि का हस्ताक्षर है। परम्परागत रूप से, C # इंटरफेस में I. के साथ उपसर्ग होता है। कक्षाएं अब IGenerate Interface को कार्यान्वित करती हैं। इसका मतलब यह है कि संकलक यह सुनिश्चित करेगा, कि उन दोनों के पास एक विधि है, जो एक इंट रिटर्न देता है और कहा जाता है Generate
। खेल को अब दो अलग-अलग ऑब्जेक्ट कहा जा रहा है, जिनमें से प्रत्येक सही इंटरफ़ेस लागू करता है। अन्य कक्षाएं कोड बनाने पर त्रुटि उत्पन्न करती हैं।
यहाँ मैंने आपके द्वारा उपयोग किए गए ब्लूप्रिंट सादृश्य पर ध्यान दिया:
एक वर्ग को आमतौर पर एक वस्तु के लिए खाका के रूप में देखा जाता है। एक इंटरफ़ेस कुछ निर्दिष्ट करता है जो एक वर्ग को करने की आवश्यकता होगी, इसलिए कोई यह तर्क दे सकता है कि यह वास्तव में एक वर्ग के लिए केवल एक खाका है, लेकिन चूंकि एक वर्ग को इंटरफ़ेस की आवश्यकता नहीं है, मैं तर्क देता हूं कि यह रूपक टूट रहा है। एक अनुबंध के रूप में एक इंटरफ़ेस के बारे में सोचो। अनुबंध में नियमों और शर्तों का पालन करने के लिए वर्ग जो "इसे हस्ताक्षर करता है" कानूनी रूप से आवश्यक (कंपाइलर पुलिस द्वारा लागू) होगा। इसका मतलब है कि यह करना होगा, जो इंटरफ़ेस में निर्दिष्ट है।
यह सब कुछ OO भाषाओं की वैधानिक रूप से टाइप की गई प्रकृति के कारण है, क्योंकि यह Java या C # के मामले में है। दूसरी ओर पायथन में, एक अन्य तंत्र का उपयोग किया जाता है:
import random
# Dependencies
class KnownNumber(object):
def generate(self):
return 5
class SecretNumber(object):
def generate(self):
return random.randint(0,10)
# What you care about
class SecretGame(object):
def __init__(self, number_generator):
number = number_generator.generate()
print number
यहां, कोई भी वर्ग इंटरफ़ेस को लागू नहीं करता है। पायथन को इस बात की कोई परवाह नहीं है, क्योंकि SecretGame
वर्ग बस जो भी वस्तु पारित की जाती है उसे कॉल करने की कोशिश करेगा। यदि वस्तु एक उत्पन्न () विधि है, तो सब कुछ ठीक है। यदि यह नहीं है: KAPUTT! यह गलती संकलन समय पर नहीं, बल्कि रनटाइम पर दिखाई देगी, इसलिए संभवतः जब आपका प्रोग्राम पहले से ही तैनात और चल रहा हो। आपके पास आने से पहले C # आपको सूचित करेगा।
इस तंत्र का उपयोग करने का कारण, भोलेपन से कहा गया है, क्योंकि OO भाषाओं में स्वाभाविक रूप से कार्य प्रथम श्रेणी के नागरिक नहीं हैं। जैसा कि आप देख सकते हैं, KnownNumber
और SecretNumber
एक संख्या उत्पन्न करने के लिए कार्यों को शामिल कर सकते हैं । एक को वास्तव में कक्षाओं की आवश्यकता नहीं है। पायथन में, इसलिए, कोई भी उन्हें दूर फेंक सकता है और अपने कार्यों को चुन सकता है:
# OO Approach
SecretGame(SecretNumber())
SecretGame(KnownNumber())
# Functional Approach
# Dependencies
class SecretGame(object):
def __init__(self, generate):
number = generate()
print number
SecretGame(lambda: random.randint(0,10))
SecretGame(lambda: 5)
एक मेमना सिर्फ एक फ़ंक्शन है, जिसे "लाइन में, जैसा कि आप जाते हैं" घोषित किया गया था। एक प्रतिनिधि केवल C # में समान है:
class Game
{
public Game(Func<int> generate)
{
Console.WriteLine(generate())
}
}
new Game(() => 5);
new Game(() => new Random().Next(0, 10));
साइड नोट: बाद के उदाहरण जावा 7 तक इस तरह संभव नहीं थे। इस व्यवहार को निर्दिष्ट करने के लिए इंटरफेस आपके एकमात्र तरीके थे। हालांकि, जावा 8 लैम्ब्डा भाव शुरू की तो सी # उदाहरण बहुत आसानी से (जावा में बदला जा सकता Func<int>
हो जाता है java.util.function.IntSupplier
और =>
हो जाता है ->
)।
तकनीकी रूप से, मैं किसी ऑब्जेक्ट के साथ बातचीत करने के तरीके (विधियों, गुणों, एक्सेसर्स ... शब्दावली का उपयोग करने वाली भाषा पर निर्भर करता है) के एक सेट के रूप में एक इंटरफ़ेस का वर्णन करता हूं। यदि कोई ऑब्जेक्ट किसी इंटरफ़ेस का समर्थन / क्रियान्वयन करता है, तो आप इस ऑब्जेक्ट के साथ बातचीत करने के लिए इंटरफ़ेस में निर्दिष्ट सभी तरीकों का उपयोग कर सकते हैं।
शब्दार्थ, एक इंटरफ़ेस में आप क्या कर सकते हैं या नहीं कर सकते हैं (जैसे, जिस क्रम में आप विधियों को कॉल कर सकते हैं) के बारे में सम्मेलनों को शामिल किया जा सकता है और इसके बदले में, आप दिए गए ऑब्जेक्ट की स्थिति के बारे में अनुमान लगा सकते हैं कि आपने कैसे बातचीत की दूर।
व्यक्तिगत रूप से मुझे एक टेम्पलेट जैसा इंटरफ़ेस दिखाई देता है। यदि किसी इंटरफ़ेस में विधियों फू () और बार () के लिए परिभाषा है, तो आप हर वर्ग को जानते हैं जो इस इंटरफ़ेस का उपयोग करता है, विधियों फू () और बार () हैं।
आइए एक आदमी पर विचार करें (उपयोगकर्ता या एक वस्तु) कुछ काम करना चाहता है। वह एक मध्यम व्यक्ति (इंटरफ़ेस) से संपर्क करेगा, जिसका कंपनियों के साथ अनुबंध होगा (कार्यान्वित कक्षाओं का उपयोग करके बनाई गई वास्तविक दुनिया की वस्तुएं)। कुछ प्रकार के कार्यों को उसके द्वारा परिभाषित किया जाएगा जो कंपनियां लागू करेंगी और उसे परिणाम देगी। प्रत्येक और प्रत्येक कंपनी अपने तरीके से काम को लागू करेगी लेकिन परिणाम समान होगा। इस तरह उपयोगकर्ता एक एकल इंटरफ़ेस का उपयोग करके अपना काम करवाएगा। मुझे लगता है कि इंटरफ़ेस कुछ कमांड के साथ सिस्टम के दृश्य भाग के रूप में कार्य करेगा जो कि आंतरिक उप प्रणालियों को लागू करने से आंतरिक रूप से परिभाषित किया जाएगा।
एक इंटरफ़ेस एक कार्यान्वयन पर एक वर्ग से बाहर संचालन को अलग करता है। इस प्रकार, कुछ कार्यान्वयन कई इंटरफेस के लिए प्रदान कर सकते हैं।
लोग आमतौर पर इसे "अनुबंध" के रूप में वर्णित करेंगे जो कक्षा के तरीकों में उपलब्ध होना चाहिए।
यह पूरी तरह से एक खाका नहीं है, क्योंकि यह भी कार्यान्वयन का निर्धारण करेगा। एक पूर्ण वर्ग की परिभाषा को एक खाका कहा जा सकता है।
एक इंटरफ़ेस परिभाषित करता है कि एक वर्ग जो इसे विरासत में मिला है उसे लागू करना चाहिए। इस तरह, एक इंटरफ़ेस से कई कक्षाएं विरासत में मिल सकती हैं, और उस असावधानी के कारण, आप कर सकते हैं
अधिक जानकारी के लिए, यह http://msdn.microsoft.com/en-us/library/ms173156.aspx देखें
मेरी राय में, इंटरफ़ेस का व्यापक अर्थ जावा में इसके साथ जुड़े लोगों की तुलना में है। मैं कुछ सामान्य कार्यक्षमता के साथ उपलब्ध संचालन के एक सेट के रूप में "इंटरफ़ेस" को परिभाषित करूंगा, जो एक मॉड्यूल को नियंत्रित / निगरानी करने की अनुमति देता है।
इस परिभाषा में मैं दोनों प्रोग्राम इंटरफेस को कवर करने की कोशिश करता हूं, जहां क्लाइंट कुछ मॉड्यूल है, और मानव इंटरफेस (उदाहरण के लिए जीयूआई)।
जैसा कि दूसरों ने पहले ही कहा था, इनपुट और आउटपुट के मामले में एक इंटरफ़ेस हमेशा इसके पीछे कुछ अनुबंध करता है। इंटरफ़ेस ऑपरेशन के "कैसे" के बारे में कुछ भी वादा नहीं करता है; यह केवल वर्तमान राज्य, चयनित ऑपरेशन और इसके मापदंडों को देखते हुए परिणाम के कुछ गुणों की गारंटी देता है।
जैसा कि ऊपर, "अनुबंध" और "प्रोटोकॉल" के पर्यायवाची उपयुक्त हैं।
इंटरफ़ेस में वे विधियाँ और गुण शामिल हैं जिनसे आप एक वर्ग द्वारा उजागर होने की उम्मीद कर सकते हैं।
इसलिए यदि कोई वर्ग इंटरफ़ेस को Cheetos Bag
लागू करता Chip Bag
है, तो आपको Cheetos Bag
किसी अन्य की तरह व्यवहार करने की अपेक्षा करनी चाहिए Chip Bag
। (अर्थात, .attemptToOpenWithoutSpillingEverywhere()
विधि आदि को उजागर करें )
परम्परागत परिभाषा - एक इंटरफ़ेस एक अनुबंध है जो उन विधियों को निर्दिष्ट करता है जिन्हें इसे लागू करने वाले वर्ग द्वारा लागू करने की आवश्यकता होती है।
इंटरफ़ेस की परिभाषा समय के साथ बदल गई है। क्या आपको लगता है कि इंटरफ़ेस में केवल विधि घोषणाएं हैं? स्थैतिक अंतिम चर के बारे में क्या और जावा 5 के बाद डिफ़ॉल्ट परिभाषा के बारे में क्या।
जावा को कई वंशानुक्रम के साथ डायमंड की समस्या के कारण पेश किया गया था और यही वे वास्तव में करने का इरादा रखते थे।
इंटरफेस वे निर्माण हैं जो कई विरासत की समस्या से दूर करने के लिए बनाए गए थे और इसमें सार विधियां, डिफ़ॉल्ट परिभाषाएं और स्थिर अंतिम चर हो सकते हैं।
एक सीमा जिसके पार दो प्रणालियाँ संचार करती हैं।
अंतर यह है कि कुछ OO भाषाएँ तदर्थ बहुरूपता कैसे प्राप्त करती हैं । तदर्थ बहुरूपता बस विभिन्न प्रकारों पर काम करने वाले समान नामों के साथ कार्य करता है।
संक्षेप में, एक इंटरफ़ेस को हल करने की कोशिश कर रहा मूल समस्या यह है कि हम इसे कैसे लागू किया जाता है से कुछ का उपयोग करने के लिए अलग करें। लेकिन आपको विचार करना चाहिए कि इंटरफ़ेस एक अनुबंध नहीं है । और अधिक पढ़ें यहाँ ।