2014-11-07 11 views
5

मुझे यह जानने की जरूरत है कि हमें परिपत्र निर्भरताओं से बचने की आवश्यकता क्यों है? वास्तविक दुनिया में यदि हम सोचते हैं, परिपत्र निर्भरता बहुत महत्वपूर्ण हैं। एक दोस्त की तरह दूसरे दोस्त से कुछ चाहिए और दूसरे को इस दोस्त से कुछ चाहिए, तो इसका परिपत्र सही है?परिपत्र निर्भरता अच्छा या बुरा

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

+1

मेरे अनुभव में परिपत्र संदर्भों के साथ मुख्य समस्या स्मृति का प्रबंधन है - जिसका मालिक क्या है? –

+0

यह न तो अच्छा है, न ही बुरा: यह वही है। अगर आपको लगता है कि मेमोरी लीक से सावधान रहें। – YvesLeBorg

+0

पिछली बार मैंने चेक किया था (उर्फ मुझे इसे संकलित करना था) 'llvm' प्रोजेक्ट सर्कुलर निर्भरताओं के लिए था और वे वर्चुअल मशीन/कंपाइलर लिख रहे थे। आप इसे एक उदाहरण के रूप में ले सकते हैं और शायद पूछ सकते हैं कि वे उस डिज़ाइन के साथ क्यों जा रहे हैं। – user2485710

उत्तर

7

परिपत्र निर्भरताओं के साथ समस्या चिकन और अंडे की समस्या की तरह है।

यदि आप मुझ पर कुछ सेट अप करते हैं, और मैं आप पर निर्भर करता हूं, तो हम कैसे शुरू करते हैं?

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

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

+0

अच्छा सामान्य उत्तर, भाषा विशिष्ट डिक-हिकीज के नुकसान से बचाता है जो उस जटिलता का हिस्सा संभाल सकता है, और सभी मामलों में उपयोगी पैटर्न मुझे पता है। +1 – YvesLeBorg

+0

hmmm धन्यवाद gbjbaanb। लेकिन इसका यह भी अर्थ है कि आभासी दुनिया में 2 दोस्त सीधे एक दूसरे के साथ बातचीत नहीं कर सकते हैं, उन्हें – Nipun

+0

करने के लिए एक मध्यस्थ की आवश्यकता होगी, आप अभी भी संवाद कर सकते हैं, आप बस दूसरे पर निर्भर नहीं हो सकते हैं। तो एक बार आपके पास ऐसा सेटअप हो जाने के बाद, आपको उम्मीद करनी चाहिए कि पार्टनर मौजूद न हो। यह तंग युग्मन है जो परिपत्र निर्भरताओं में महत्वपूर्ण है। – gbjbaanb

2

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

हालांकि, कक्षाओं की वस्तुओं को गोलाकार निर्भरता के बिना एक-दूसरे का उपयोग करना संभव है। इस अंत में यह निर्धारित करना महत्वपूर्ण है कि वास्तव में दो वर्ग/घटकों के बीच निर्भरता का कारण बनता है (ये पूरी तरह से समकक्ष नहीं हैं लेकिन पूरी तरह से परिभाषा प्रदान करना कुछ हद तक लंबा होगा)। A इन परिस्थितियों में B पर निर्भर करता है:

  1. जब A प्रकार B के एक सदस्य शामिल हैं।
  2. जब AB से प्राप्त होता है।
  3. जब A फ़ंक्शन हस्ताक्षर के भाग के रूप में B के मान का उपयोग करता है।
  4. जब A इसके कार्यान्वयन में B का उपयोग करता है।
  5. मैं शायद यहां कुछ भूल गया (मुझे याद है कि वर्गों को युग्मित क्यों किया जाएगा)।

जब आपके पास दो वर्गों के बीच चक्रीय निर्भरता है, तो इस निर्भरता को तोड़ने के तरीके हो सकते हैं। अक्सर, निर्भरता को दो वर्गों में से एक को बेस क्लास में विभाजित करके और कक्षा वर्ग के साथ व्युत्पन्न वर्ग को दूसरे वर्ग के आधार पर विभाजित किया जा सकता है। निर्भरता चक्र तोड़ने के लिए कई अन्य दृष्टिकोण हैं। जॉन लेकोस का "बड़ा स्केल सी ++" (1 99 6) अनिवार्य रूप से ब्रेक निर्भरता चक्रों के बारे में है और यह बताता है कि चक्रीय निर्भरता क्यों खराब है (मुझे लगता है कि वह इस सरल विशेषता के साथ असहमत होगा)।

...

  1. वे कार्यक्रमों अनावश्यक कार्यक्षमता शामिल करने के लिए है क्योंकि चीजों को खींचा जाता है, जिसमें आवश्यक नहीं हैं कारण: और हाँ, चक्रीय निर्भरता बुरा कर रहे हैं।
  2. वे सॉफ्टवेयर का परीक्षण करने में बहुत कठिन बनाते हैं।
  3. वे सॉफ्टवेयर के बारे में तर्क के लिए बहुत कठिन बनाते हैं।
  4. वे सिस्टम के कुछ हिस्सों को बदलने के लिए इसे बहुत कठिन बनाते हैं।
  5. ... और शायद कई अन्य कारणों से।

उपर्युक्त सी ++ परिप्रेक्ष्य से लिया गया दृश्य के साथ तैयार किया गया है। परिपत्र निर्भरताओं के कुछ कारण सी में [सीधे] मौजूद नहीं हो सकते हैं, लेकिन वही अवधारणाएं लगभग सी पर भी लागू होती हैं।

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