जब आप नियंत्रण में उलझन का उपयोग करते हैं तो आप अपनी कक्षा को जितना संभव हो उतना कम करने में मदद कर रहे हैं। मान लीजिए कि आपके पास कुछ विंडोज़ सेवा है जो फाइलों की प्रतीक्षा करती है और फिर फ़ाइल पर प्रक्रियाओं की एक श्रृंखला करता है। प्रक्रियाओं में से एक इसे ज़िप में परिवर्तित करना है, फिर इसे ईमेल करें।
public class ZipProcessor : IFileProcessor
{
IZipService ZipService;
IEmailService EmailService;
public void Process(string fileName)
{
ZipService.Zip(fileName, Path.ChangeFileExtension(fileName, ".zip"));
EmailService.SendEmailTo(................);
}
}
इस कक्षा को वास्तव में ज़िप और ईमेलिंग करने की आवश्यकता क्यों होगी जब आप कक्षाओं को आपके लिए ऐसा करने के लिए समर्पित कर सकें? जाहिर है, आप नहीं करेंगे, लेकिन यह मेरे बिंदु तक केवल एक लीड है :-)
ज़िप और ईमेल को लागू करने के अलावा कक्षा को यह पता होना चाहिए कि कौन सी कक्षा सेवा लागू करती है? यदि आप इस प्रोसेसर के कन्स्ट्रक्टर को इंटरफेस पास करते हैं तो इसे किसी विशिष्ट वर्ग का उदाहरण बनाने की आवश्यकता नहीं होती है, इसे नौकरी करने के लिए आवश्यक सबकुछ दिया जाता है।
डीआईसी का उपयोग करना। आप कॉन्फ़िगर कर सकते हैं कि कौन से वर्ग कुछ इंटरफेस लागू करते हैं और फिर इसे आपके लिए एक उदाहरण बनाने के लिए प्राप्त करते हैं, यह कक्षा में निर्भरता को इंजेक्ट करेगा।
var processor = Container.Resolve<ZipProcessor>();
तो अब आप न केवल सफाई से वर्ग की कार्यक्षमता साझा कार्यक्षमता से अलग कर दिया है, लेकिन आप भी एक दूसरे के किसी भी स्पष्ट ज्ञान होने से उपभोक्ता/प्रदाता को रोका है। यह पढ़ने के लिए कोड को समझना आसान बनाता है क्योंकि एक ही समय में विचार करने के लिए कम कारक हैं।
अंत में, जब यूनिट परीक्षण आप मॉक निर्भरताओं में गुजर सकते हैं। जब आप अपने ज़िपप्रोसेसर का परीक्षण करते हैं तो आपकी नकली सेवाएं केवल यह कहती हैं कि कक्षा ने वास्तव में एक भेजने की कोशिश करने के बजाए एक ईमेल भेजने का प्रयास किया था।
//Mock the ZIP
var mockZipService = MockRepository.GenerateMock<IZipService>();
mockZipService.Expect(x => x.Zip("Hello.xml", "Hello.zip"));
//Mock the email send
var mockEmailService = MockRepository.GenerateMock<IEmailService>();
mockEmailService.Expect(x => x.SendEmailTo(.................);
//Test the processor
var testSubject = new ZipProcessor(mockZipService, mockEmailService);
testSubject.Process("Hello.xml");
//Assert it used the services in the correct way
mockZipService.VerifyAlLExpectations();
mockEmailService.VerifyAllExceptions();
तो संक्षेप में। आप इसे पर करना चाहते हैं 01: उपभोक्ताओं को स्पष्ट रूप से यह जानने से रोकें कि कौन सा प्रदाता अपनी आवश्यक सेवाओं को लागू करता है, जिसका अर्थ है कि कोड पढ़ने पर एक बार समझने के लिए कम नहीं है। 02: यूनिट परीक्षण को आसान बनाएं।
पीट
लेकिन किसी भी कॉन्फ़िगरेशन के बारे में क्या नहीं है (जैसे Google guice में) - आप "घटक भूमिकाएं" कैसे निर्दिष्ट करते हैं? – JohnIdol
पिछली बार मैंने चूहे को देखा, इसमें "कॉन्फ़्रेंस पर सम्मेलन" पहलू की कमी थी जिसे आप एनोटेशन, एक्सएमएल और भूमिकाओं को मिलाकर प्राप्त कर सकते हैं, यही वजह है कि मैं वसंत जावैकोनफिग का उपयोग नहीं कर रहा हूं। मैं वास्तव में मिश्रित प्रतिमान पसंद करते हैं। कोड के साथ एक्सएमएल को प्रतिस्थापित करना जो वही काम करता है, वह मेरे लिए कट नहीं करता है, हो सकता है कि यह सिर्फ मुझे नज़दीकी दिमागी हो, लेकिन मैं नहीं देख सकता कि कोड-आधारित कॉन्फ़िगरेशन मेरे लिए मूल्य कैसे जोड़ता है। लेकिन मुझे नहीं पता कि आप गुइस में एक सम्मेलन आधारित सेटअप प्राप्त कर सकते हैं या नहीं। – krosenvold