एक प्रोग्रामर इंटरफ़ेस से कार्यान्वयन को अलग क्यों करना चाहेगा?


18

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

यह क्यों फायदेमंद है?


एक टपका हुआ अमूर्तता
SK- तर्क

1
ऐसा लगता है कि हर किसी को पहले से ही समझ में आता है, लेकिन नए दर्शकों के लिए, ब्रिज डिज़ाइन किसी प्रोग्राम के "लेकिन एक भाग" के कार्यान्वयन और इंटरफ़ेस के बारे में नहीं है, शायद एक कार्यक्रम के छोटे हिस्से। एक पूरा कार्यक्रम इंटरफेस और कार्यान्वयन का एक संग्रह होगा (प्रत्येक इंटरफ़ेस में एक या अधिक कार्यान्वयन होने के साथ)। पहला वाक्य शायद होना चाहिए: "पुल डिजाइन पैटर्न आपके सभी स्रोत कोड में उनके कार्यान्वयन से इंटरफेस को अलग करता है।"
राल्फचेपिन

जवाबों:


35

यह आपको इंटरफ़ेस के स्वतंत्र रूप से कार्यान्वयन को बदलने की अनुमति देता है। यह बदलती आवश्यकताओं से निपटने में मदद करता है।

क्लासिक उदाहरण बाकी के सिस्टम को बदलने के बिना कुछ बड़े, बेहतर, तेज, छोटे, या अन्यथा भिन्न के साथ एक इंटरफ़ेस के तहत भंडारण कार्यान्वयन की जगह ले रहा है।


23

डैनियल के उत्तर के अलावा, बहुरूपता जैसी अवधारणाओं के माध्यम से कार्यान्वयन से इंटरफ़ेस को अलग करना आपको एक ही इंटरफ़ेस के कई कार्यान्वयन बनाने की अनुमति देता है जो अलग-अलग तरीकों से समान कार्य करते हैं।

उदाहरण के लिए, बहुत सी भाषाओं में मानक पुस्तकालय में कहीं एक धारा की अवधारणा है । धारा एक ऐसी चीज है जो सीरियल एक्सेस के लिए डेटा रखती है। इसके दो बुनियादी ऑपरेशन हैं: पढ़ें (स्ट्रीम से बाइट्स के अगले X नंबर को लोड करें) और लिखें (स्ट्रीम में डेटा के बाइट्स के एक्स नंबर को जोड़ें), और कभी-कभी एक तीसरा, सीक (धारा की "वर्तमान स्थिति को रीसेट करें") एक नए स्थान पर)।

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

यदि आप सीधे कार्यान्वयन पर भरोसा करते हैं, तो आपको एक ही डेटा को एक फ़ाइल में सहेजने या नेटवर्क पर भेजने के लिए दो पूरी तरह से अलग-अलग दिनचर्याएं लिखनी होंगी। लेकिन अगर आपके पास एक स्ट्रीम इंटरफ़ेस है, तो आप इसके दो अलग-अलग कार्यान्वयन बना सकते हैं ( FileStreamऔर NetworkStream) जो उस डेटा को भेजने के विशिष्ट विवरणों को एन्क्रिप्ट करता है जहां उसे जाने की आवश्यकता है, और फिर आपको केवल उस कोड को लिखना होगा जो किसी फ़ाइल को एक बार सहेजने से संबंधित है । अचानक आपकी SaveToFileऔर SendOverNetworkदिनचर्या बहुत सरल हो जाती है: वे केवल उचित प्रकार की एक धारा निर्धारित करते हैं और इसे SaveDataदिनचर्या में पास करते हैं, जो एक स्ट्रीम इंटरफ़ेस को स्वीकार करता है - इसे किस प्रकार की देखभाल करने की आवश्यकता नहीं है, जब तक यह प्रदर्शन कर सकता है। ऑपरेशन लिखें - और डेटा को स्ट्रीम में सहेजता है।

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


1
यह OOP की सबसे मजबूत विशेषताओं में से एक है। मुझे बस यह पसंद है ...
रादु मुराज़े

1
सादे इंटरफेस का उपयोग करके यह अलग रूप कैसे है?
व्यानोलो

@Vainolo: यह कोड के पुन: उपयोग में मदद करता है। यहां तक ​​कि अगर आपके पास कई प्रकार की धाराएं हैं, तो वे सभी एक-दूसरे के समान बहुत कुछ करेंगे। यदि आप एक IStreamइंटरफ़ेस से शुरू करते हैं , तो आपको हर स्ट्रीम के लिए कार्यक्षमता के पूरे सेट को फिर से बनाना होगा। लेकिन अगर आप एक आधार सार धारा वर्ग के साथ शुरू करते हैं, तो यह सभी सामान्य स्थिति और कार्यक्षमता को पकड़ सकता है, और फिर वंश को अलग-अलग विशेषताओं को लागू करने दे सकता है।
मेसन व्हीलर

2
@RaduMurzea यह OOP के लिए विशिष्ट नहीं है। टाइप कक्षाएं आपको पूरी तरह से गैर-ओओपी फैशन में एक ही काम करने देती हैं।
वेस

@ बिल्कुल, बस वही कहना चाहता था, और फिर मैंने आपकी टिप्पणी पढ़ी।
jhegedus

4

आपके पास वास्तव में यहां दो अलग-अलग प्रश्न हैं, हालांकि वे संबंधित हैं।

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

प्रत्येक प्रोग्रामर को समझने के लिए सामान्य प्रश्न कुछ महत्वपूर्ण है। यह वही है जो एक कार्यक्रम में हर जगह प्रचार से परिवर्तन को रोकता है। मैं कल्पना नहीं कर सकता कि मनुष्य इस का उपयोग किए बिना कार्यक्रम कर सकता है।

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

एक साधारण CRUD एप्लिकेशन के भीतर भी, प्रत्येक विधि हस्ताक्षर एक व्यापक अर्थ में, इसे लागू करने के लिए इंटरफ़ेस है।

अमूर्तता के इन सभी प्रकारों में एक ही मूल लक्ष्य है - कॉलिंग कोड एक्सप्रेस यह सबसे सार संभव तरीके से अभिप्रेत है जो कार्यान्वयनकर्ता को आवश्यकतानुसार अधिक जानकारी देता है। यह उनके बीच न्यूनतम संभव युग्मन प्रदान करता है, और जब कोड को जितना संभव हो बदलने की आवश्यकता होती है, तो तरंग प्रभाव को सीमित करता है।

यह सीधा लगता है, लेकिन व्यवहार में यह जटिल हो जाता है।

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

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

यह वास्तव में इससे थोड़ा अधिक विस्तृत है, क्योंकि प्रत्येक वर्ग वास्तव में एक श्रेणी पदानुक्रम हो सकता है (इसलिए, प्रत्येक शब्द के लिए ठोस कार्यान्वयन के साथ एक सार शब्द प्रोसेसर नहीं हो सकता है, लेकिन एक सार दस्तावेज़, सार पाठ-रचना, आदि), लेकिन यह है एक ही विचार।

यह एक पहलू की तरह एक सा है, इस मामले को छोड़कर मतिहीनता परत कई अंतर्निहित प्रणालियों को एक ही इंटरफ़ेस प्रदान करने पर केंद्रित है।

यह नियंत्रण के व्युत्क्रम से संबंधित है, क्योंकि कंक्रीट कार्यान्वयनकर्ता तरीकों या निर्माणकर्ताओं को पारित किया जाएगा और बुलाया वास्तविक कार्यान्वयन का निर्धारण करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.