नियंत्रण के उलट (IoC) पैटर्न के बारे में बहुत भ्रम होने लगता है। कई लोगों ने इसे रणनीति पैटर्न या एक घटक मॉडल के साथ बराबर किया है, लेकिन ये तुलना वास्तव में आईओसी के बारे में क्या है पर कब्जा नहीं करती है। IoC वास्तव में निर्भरता प्राप्त करने के तरीके के बारे में है। मैं आपको एक उदाहरण देता हूं:
class Game {
void Load() {
this.Sprite.Load(); // loads resource for drawing later
}
}
class Sprite {
void Load() {
FileReader reader = new FileReader("path/to/resource.gif");
// load image from file
}
}
ऊपर यह स्पष्ट है कि Sprite.Load
एक पर निर्भरता है FileReader
। जब आप उस विधि का परीक्षण करना चाहते हैं जिसकी आपको आवश्यकता है:
- जगह में एक फाइल सिस्टम
- फ़ाइल सिस्टम से लोड करने के लिए एक परीक्षण फ़ाइल
- सामान्य फ़ाइल सिस्टम त्रुटियों को ट्रिगर करने की क्षमता
पहले दो स्पष्ट हैं, लेकिन अगर आप यह सुनिश्चित करना चाहते हैं कि आपकी त्रुटि हैंडलिंग काम करती है तो उम्मीद है कि आपको वास्तव में # 3 की भी आवश्यकता है। दोनों मामलों में आपने संभावित रूप से अपने परीक्षणों को थोड़ा धीमा कर दिया है क्योंकि उन्हें अब डिस्क पर जाने की आवश्यकता है और आपने अपने परीक्षण वातावरण को अधिक जटिल बना दिया है।
IoC का लक्ष्य इसके निर्माण से व्यवहार के उपयोग को कम करना है। ध्यान दें कि यह रणनीति पैटर्न से कैसे भिन्न है। रणनीति पैटर्न के साथ लक्ष्य व्यवहार के फिर से उपयोग करने योग्य हिस्सा को घेरना है ताकि आप इसे भविष्य में आसानी से बढ़ा सकें; इसके बारे में कुछ नहीं कहना है कि रणनीतियों का निर्माण कैसे किया जाता है।
यदि हम Sprite.Load
ऊपर की विधि को फिर से लिखना चाहते हैं तो हम संभवतः समाप्त हो जाएंगे:
class Sprite {
void Load(IReader reader) {
// load image through reader
}
}
अब, हमने इसके उपयोग से पाठक के निर्माण को रोक दिया है। इसलिए, परीक्षण के दौरान परीक्षण रीडर में स्वैप करना संभव है। इसका मतलब है कि आपके परीक्षण वातावरण को अब फ़ाइल सिस्टम, परीक्षण फ़ाइलों की आवश्यकता नहीं है, और आसानी से त्रुटि घटनाओं का अनुकरण कर सकते हैं।
ध्यान दें कि मैंने अपने पुनर्लेखन में दो चीजें कीं। मैंने एक इंटरफ़ेस बनाया, IReader
जिसने कुछ व्यवहार को समझाया - यानी स्ट्रैटेजी पैटर्न को लागू किया। इसके अलावा, मैंने दूसरे वर्ग के लिए सही पाठक बनाने की ज़िम्मेदारी निभाई।
हो सकता है कि उपरोक्त वर्णित करने के लिए हमें नए पैटर्न नाम की आवश्यकता न हो। यह मुझे स्ट्रेटेजी एंड फैक्ट्री पैटर्न (IoC कंटेनरों के लिए) के मिश्रण के रूप में प्रभावित करता है। यह कहा जा रहा है, मुझे यकीन नहीं है कि लोग इस पैटर्न पर क्या आधार दे रहे हैं क्योंकि यह स्पष्ट है कि यह एक वास्तविक समस्या को हल करता है, और निश्चित रूप से, मेरे लिए यह स्पष्ट नहीं है कि जावा के साथ इसका क्या करना है।