2009-05-04 7 views
9

इस सवाल से पूछने का एक और तरीका यह है कि: आपके अनुसार नियंत्रण में उलटा क्या है?ओओ भाषाओं के लिए विशिष्ट नियंत्रण में उलटा है?

मैं इस सवाल से पूछता हूं क्योंकि IoC पर विकिपीडिया लेख को गैर-ओओ स्पष्टीकरण द्वारा अपहरण कर लिया गया है। यह discussion page से लिया जाता है और है 2007 से:

मैं स्वतंत्रता ले लिया पूरी तरह से पेज के पुनर्लेखन के लिए, के रूप में पिछली सामग्री पूरी तरह से प्रलाप व्यर्थ "उन्मुख वस्तु" से लिया गया था ...

मुझे नहीं लगता कि नियंत्रण में उलटा ओओ भाषा के बाहर कोई समझ नहीं आता है। प्रक्रियात्मक भाषाओं में नियंत्रण छोड़ने के लिए पहले से ही कई स्पष्टीकरण हैं (ईवेंट प्रोग्रामिंग एक है) और पूरी तरह से कार्यात्मक भाषाओं को नियंत्रण में बदलाव जैसी अवधारणा की आवश्यकता नहीं है क्योंकि उनके पास उच्च-आदेश कार्य हैं।

इसके अलावा, article में जहां मार्टिन फाउलर आईओसी पर विस्तारित करता है, वह विशेष रूप से ओओ उदाहरणों को संभालता है।

तो, आईओसी विशेष रूप से एक ओओ अवधारणा है, और यह वास्तव में क्या है?

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

कारखाने के डिजाइन पैटर्न भी हैं, जहां वस्तुओं के पेड़ का निर्माण किया जा रहा है और पारित होने से पहले कॉन्फ़िगर किया जा रहा है।

मेरे लिए, आईओसी विशेष रूप से एक ओओ अवधारणा है।

आपका उत्तर क्या है?

उत्तर

11

आप एक कार्यात्मक दृष्टिकोण से सैद्धांतिक समस्या को देखते हैं। पहला सवाल उठता है वास्तव में आप क्या नियंत्रित करते हैं?

तब आपको पता चलेगा कि इससे कोई वस्तु, विधि, कार्य या जो कुछ भी पारित नहीं होता है, उससे कोई फर्क नहीं पड़ता, लेकिन वास्तव में कोड क्या करता है।

संक्षेप में, जब आप निर्भरता इंजेक्शन करते हैं, तो आप निर्भरताओं (संसाधनों के) के निर्माण और उपयोग के नियंत्रण को उलटा करते हैं।

जब आप एक विंडोज एपीआई कॉलबैक फ़ंक्शन पर पॉइंटर देते हैं, तो आप उन्हें अपने फ़ंक्शन को अपने पैरामीटर के साथ कॉल करने का नियंत्रण देते हैं।

तो आप देखते हैं, आईओसी सिर्फ एक सैद्धांतिक अवधारणा है, और इसके बारे में, इसके विभिन्न व्यावहारिक कार्यान्वयन हो सकते हैं।

7

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

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

13

नियंत्रण में उलझन निश्चित रूप से ओओ अवधारणा नहीं है।

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

उदाहरण के लिए, EnumWindows फ़ंक्शन पर एक नज़र डालें। इसका उपयोग करके, आप एक लाइब्रेरी में फ़ंक्शन पॉइंटर (EnumWindowsProc) पास करते हैं, और आपका कोड लाइब्रेरी कोड के भीतर से चलाया जाता है।

विकिपीडिया से नियंत्रण में बदलाव की परिभाषा की तुलना करें: "नियंत्रण की उलटा तब होती है जब लाइब्रेरी प्रक्रिया उपयोगकर्ता प्रक्रियाओं को कॉल करती है।"

यह बिल्कुल वही है।

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

+0

पूरी तरह से सहमत हैं कि एक समृद्ध प्रकार प्रणाली के साथ उपयोग करना आसान है। यह प्रथम श्रेणी के नागरिकों के रूप में कार्यों के साथ _even_ आसान हो जाता है। – xtofl

1

वास्तव में, आईओसी का ओओ कार्यान्वयन काफी विस्तृत है, क्योंकि कार्य अक्सर प्रथम श्रेणी के नागरिक नहीं होते हैं।

जैसा कि अज़दर ने उल्लेख किया: आईओसी का कई कारणों से उपयोग किया जाता है। मैं कुछ यहाँ समझाने के लिए :)

पुनरावृत्ति

#ruby 
{1,2,3}.each{ |i| puts i } 

#haskell 
map [1,2,3] (\i -> write i) 

//the stl algorithms 
int printint(int i){ return printf("%d", i); } 
std::foreach(onetwothree.begin(), onetwothree.end(), &printi); 

धागा निर्माण

CreateThread(NULL, 0, &myFunction, NULL, 0, NULL); 

जनरल भेजने इन उदाहरणों में से

//javascript 
document.getElementById("mybutton") 
      .addEventListener( 
       function(e){ alert("buttonPressed") }); 

कोई भी घटना को संक्षेप में प्रस्तुत करेंगे ऑब्जेक्ट ओरिएंटेड कर रहे हैं, QED

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