डीकोपिंग क्या है और यह किन विकास क्षेत्रों पर लागू हो सकता है? [बन्द है]


21

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

"यह कहां लागू हो सकता है" से मेरा मतलब है:

क्या यह केवल प्रासंगिक है जहां संकलित भाषाएं जैसे सी और जावा शामिल हैं?

क्या मुझे वेब डेवलपर के रूप में इसके बारे में जानना / अध्ययन करना चाहिए?


यह मदद करेगा यदि आपने थोड़ा शोध किया और परिभाषा के किसी भी अस्पष्ट भागों के आधार पर एक प्रश्न पूछें।
जेएफओ

2
@ जेफ़ो - मुझे लगता है कि दुनिया पूरी अवधारणा के सवालों से उतना ही लाभान्वित होती है जितना कि यह विशिष्ट अति सूक्ष्म अंतर से होता है। "आसमान नीला क्यों है?" बारीकियों पर चरम विस्तार में जाने के बिना ही अवधारणा को कवर करने की अनुमति देता है। यही कारण है कि मैं आगे बढ़ा और बिना शोध के अपना प्रश्न पूछा।

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

मुझे लगता है कि यहाँ उत्तर अवधारणा का वर्णन करने का एक सही काम करते हैं। यह पूछने की तरह है कि "प्रोग्रामिंग के संबंध में इस शब्द की परिभाषा क्या है" - फिर यह बहुत व्यापक कैसे है? @ GlenH7

1
@ jt0dd मुझे सहमत होना पड़ेगा। सिर्फ इसलिए कि आप किसी पुस्तक के साथ कुछ समझा सकते हैं, इसका मतलब यह नहीं है कि अधिक रसीले उत्तर में कोई मूल्य नहीं है। प्रोग्रामिंग साहित्य के साथ, लोग अक्सर एक उच्चतर उच्च स्तरीय अवलोकन देने से पहले आपको विवरण के साथ जोड़ते हैं। "OOP क्या है?" रास्ता बहुत व्यापक होगा। लेकिन यह एक विशेष रूप से विशिष्ट विषय IMO है।
एरिक रिपेन

जवाबों:


57

'युग्मन' एक शब्द है जो एक सॉफ्टवेयर सिस्टम (आमतौर पर कक्षाएं) में दो संस्थाओं के बीच संबंध का वर्णन करता है।

जब एक वर्ग किसी अन्य वर्ग का उपयोग करता है, या उसके साथ संचार करता है, तो उसे उस अन्य वर्ग पर 'निर्भर' करने के लिए कहा जाता है, और इसलिए ये वर्ग 'युग्म' होते हैं। कम से कम उनमें से एक दूसरे के बारे में 'जानता' है।

विचार यह है कि हमें अपने सिस्टम में वर्गों के बीच युग्मन को 'ढीले' के रूप में संभव रखने की कोशिश करनी चाहिए: इसलिए 'ढीली युग्मन' या कभी-कभी 'डिकूप्लिंग' (हालांकि अंग्रेजी में 'डिकॉउलिंग' का मतलब होगा 'युग्मन बिल्कुल नहीं', लोग) अक्सर इसका इस्तेमाल संस्थाओं के बीच 'ढीले युग्मन' को करने के लिए किया जाता है)।

तो: अभ्यास में मजबूत युग्मन बनाम ढीले-युग्मन क्या है, और हमें संस्थाओं को शिथिल-युग्मित क्यों करना चाहिए?


युग्मन एक इकाई से दूसरी इकाई के बीच निर्भरता की डिग्री का वर्णन करता है। अक्सर कक्षाओं या वस्तुओं।

जब ClassA ClassB पर बहुत अधिक निर्भर करता है, तो ClassB के बदल जाने पर ClassA के प्रभावित होने की संभावना बढ़ जाती है। यह मजबूत युग्मन है।

हालाँकि यदि ClassA, ClassB के कोड में बदलाव से किसी भी तरह से प्रभावित होने की संभावना से कम ClassB, ClassB पर निर्भर करता है, तो निम्न हैं। यह ढीला युग्मन, या एक 'डिकूफ़्ड' संबंध है।

ढीली युग्मन अच्छा है क्योंकि हम नहीं चाहते कि हमारे सिस्टम के घटक एक-दूसरे पर बहुत अधिक निर्भर हों। हम अपने सिस्टम को मॉड्यूलर रखना चाहते हैं, जहां हम दूसरे को प्रभावित किए बिना एक हिस्से को सुरक्षित रूप से बदल सकते हैं।

जब दो भाग शिथिल हो जाते हैं, तो वे एक-दूसरे से अधिक स्वतंत्र होते हैं और जब अन्य परिवर्तन होते हैं तो वे टूटने की संभावना कम होती है।

उदाहरण के लिए, कार बनाते समय, आप स्टीयरिंग व्हील में किसी चीज को तोड़ने के लिए इंजन में आंतरिक बदलाव नहीं चाहेंगे।

जबकि कार बनाते समय दुर्घटना से ऐसा कभी नहीं होगा, इसी तरह की बातें हर समय प्रोग्रामर को होती हैं। ढीली कपलिंग का मतलब ऐसी चीजों के जोखिम को कम करना है।

जब इकाई एक इकाई बी के बारे में बहुत ज्यादा जानता है मजबूत युग्मन आमतौर पर तब आती इकाई एक कैसे इकाई बी संचालित या यह कैसे बनाया गया है, की तुलना में वहाँ एक उच्च जोखिम है कि इकाई बी में बदलाव इकाई ए को प्रभावित करेगा है के बारे में भी कई धारणाएं बनाता है तो यह ऐसा इसलिए है क्योंकि इकाई B के बारे में इसकी एक धारणा अब गलत है।

उदाहरण के लिए, कल्पना कीजिए कि एक ड्राइवर के रूप में, आप इस बारे में कुछ धारणाएँ बनाएंगे कि आपकी कार का इंजन कैसे काम करता है।

जिस दिन आप एक ऐसी इंजन वाली नई कार खरीदते हैं जो अलग तरीके से काम करती है (या किसी कारण से आपके इंजन को बदल दिया गया था), आपकी पिछली धारणाएँ गलत होंगी। यदि आप एक कंप्यूटर में कोड थे, तो अब आप गलत कोड होंगे जो ठीक से काम नहीं करता है।

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


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

उदाहरण के लिए, यदि आप एक वर्ग कार को परिभाषित किया गया है, यह के इंटरफेस (सार्वजनिक विधि) शायद होगा drive(), stop(), steerLeft(), steerRight(), getSpeed()। ये वे तरीके हैं जो अन्य ऑब्जेक्ट कार ऑब्जेक्ट पर लागू कर सकते हैं।

कार वर्ग के अन्य सभी विवरण: इंजन कैसे काम करता है, किस तरह का ईंधन उपयोग करता है, आदि अन्य वर्गों से छिपे हुए हैं - उन्हें कार के बारे में बहुत अधिक जानने से रोकने के लिए।

पल क्लास ए क्लास बी के बारे में बहुत अधिक जानता है: हमारे बीच एक मजबूत कपल रिलेशनशिप है, जहां क्लास ए क्लास बी पर बहुत ज्यादा निर्भर है और क्लास बी में बदलाव से क्लास ए पर असर पड़ने की संभावना है

दो संस्थाओं के बीच एक संबंध, जहां वे एक-दूसरे के बारे में बहुत कम जानते हैं (केवल क्या आवश्यक है) - एक शिथिल युग्मित, या विच्छेदित संबंध है।


3

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

दो चीजें, और बी , युग्मित हैं यदि उनके बीच एक निर्भरता है। यदि A B पर निर्भर करता है, तो आप A को ध्यान में रखे बिना B का उपयोग कर सकते हैं। यदि आप A का उपयोग करना चाहते हैं, तो आपको B को भी ले जाना होगा, क्योंकि A इस पर निर्भर करता है।

सॉफ्टवेयर विकास में, आमतौर पर, आप घटकों के बीच युग्मन को पूरी तरह से हटा नहीं सकते हैं। सामान्य रूप से मौजूदा युग्मन को ढीला करने का मतलब है कि इस संदर्भ में Decoupling । यही है, यह सुनिश्चित करते हुए कि प्रत्येक घटक अपने आस-पास के अन्य घटकों के बारे में जितना संभव हो उतना कम जानता है।

यह संभवतः जंगली में पाया जाने वाला सबसे आम प्रकार का युग्मन है:

//Inside a class meant to display info for a particular Facebook user.
void DisplayFriends(FacebookUser user, FacebookClient client)
{
     Friend[] = (Friend[])client.GetConnection().ExecuteCommandForResult("getFriends:" + user.Name);
     ...
}

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

//Inside a class meant to display info for a particular Facebook user.
void DisplayFriends(FacebookUser user, FacebookClient client)
{
     Friend[] = client.GetFriends(user);
     ...
}

अब हमें वास्तव में परवाह नहीं है कि FacebookClient को हमारे दोस्त कैसे मिलते हैं। हम वास्तव में इस बात की परवाह करते हैं कि यह उन्हें मिलता है। इसके आंतरिक व्यवहार में लाया गया कोई भी परिवर्तन हमारे अपने वर्ग को नुकसान नहीं पहुँचाएगा।

कार्यों के लिए कानून के कानून का पालन करके इस तरह के डिकोडिंग को आसानी से प्राप्त किया जा सकता है, जो कहता है (विकिपीडिया को उद्धृत करते हुए):

कार्यों के लिए कानून के कानून की आवश्यकता है कि एक वस्तु ओ की एक विधि मी केवल निम्नलिखित प्रकार की वस्तुओं के तरीकों का आह्वान कर सकती है:

  • ओ ही है
  • मीटर के मापदंडों
  • किसी भी वस्तु को बनाया / मी के भीतर त्वरित
  • ओ के प्रत्यक्ष घटक वस्तुओं
  • एक वैश्विक चर, ओ के द्वारा सुलभ, मी के दायरे में

चूंकि मैंने उत्तर की शुरुआत में लौकिक युग्मन के बारे में उल्लेख किया है, मैं जल्द ही इसका वर्णन करने जा रहा हूं।

टेम्पोरल कपलिंग को आम तौर पर उन अनुप्रयोगों को डिजाइन करते समय माना जाता है जो समानांतर में एल्गोरिदम को निष्पादित करते हैं। दो निष्पादन योग्य इकाइयों पर विचार करें (उन्हें वास्तविक निर्देश, तरीके, या जो भी आप एक इकाई होने पर विचार करना चाहते हैं), ए और बी। हम कहते हैं कि ए को अस्थायी रूप से बी से जोड़ा जाता है यदि ए को निष्पादित करने से पहले बी को निष्पादित किया जाना चाहिए। यदि A को B से अस्थायी रूप से युग्मित नहीं किया जाता है, तो A और B को एक ही समय में निष्पादित किया जा सकता है। इस एक के लिए अपना खुद का उदाहरण बनाएं: सामान्य चीजों के बारे में सोचें जो आप अपने दैनिक जीवन में करते हैं। क्या कोई दो चीजें हैं जो आप एक के बाद एक करते हैं, लेकिन आप एक ही समय में कर सकते हैं?

अंत में, अपने अंतिम बिट का उत्तर देने के लिए:

क्या मुझे वेब डेवलपर के रूप में इसके बारे में जानना / अध्ययन करना चाहिए?

हाँ। उदाहरण के लिए, वेब विकास (एमवीसी) के लिए सबसे लोकप्रिय डिजाइन पैटर्न में से एक डिकॉउलिंग के बारे में है।


1

अन्य उत्तर यह वर्णन करने का एक अच्छा काम करते हैं कि डिकॉउलिंग क्या है। मैं आपके अंतिम प्रश्न पर चर्चा करना चाहता था।

क्या मुझे वेब डेवलपर के रूप में इसके बारे में जानना / अध्ययन करना चाहिए?

जवाब एक जोरदार हाँ है। इससे कोई फर्क नहीं पड़ता कि आप किस तरह के डेवलपर हैं। आप एक वेब डेवलपर या एक एम्बेडेड सिस्टम डेवलपर हो सकते हैं।

मान लीजिए कि आपके पास एक ऐसा वर्ग है जो आपके वेब पेज पर कस्टम यूआरएल उत्पन्न करता है। हो सकता है कि आपको किसी टैग के href में रखने के लिए कक्षा को सीधे पृष्ठ पर URL लिखने के लिए लुभाया जाए। यह पहली बार में सरल लग सकता है। लेकिन क्या होता है जब आपको ईमेल में लिंक डालने और उन्हें उपयोगकर्ता को भेजने के लिए बदलाव करने की आवश्यकता होती है? आपका वर्तमान कोड इसलिए काम नहीं करेगा क्योंकि आपका URL जनरेटर आपके द्वारा उपयोग किए जा रहे वेब फ्रेमवर्क से कसकर जुड़ा हुआ है।

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

ऐसा कोड होना जो मॉडरेट और डिकोड किया गया हो, आपके कोड को और अधिक समझने योग्य, अधिक परीक्षण करने योग्य और अधिक बनाए रखने योग्य बना देगा, इससे कोई फर्क नहीं पड़ता कि आप किस प्रोग्रामिंग डोमेन में काम कर रहे हैं।


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