2012-02-20 10 views
24

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

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

संपादित: मुझे पता है कि एक आम तरीका है "रैप" और इंजेक्षन एक मौजूदा स्थिर विधि इस तरह है:

public class Foo { 
    public static void bar() { ... } 
} 

public interface FooWrapper { 
    public void bar(); 
} 

public class FooWrapperImpl implements FooWrapper { 
    public void bar() { 
     return Foo.bar(); 
    } 
} 

... लेकिन मैं नहीं पूछ रहा हूँ कि कैसे एक मौजूदा स्थिर सुई विधि ... मैं पूछ रहा हूं कि मुझे उन्हें पूरी तरह लिखना बंद कर देना चाहिए, अगर मेरा पूरा कोड (इस बिंदु से आगे) DI की धारणा को गले लगाने जा रहा है।

इसके अलावा, मुझे इस तरह के बहुत से संबंधित प्रश्न दिखाई देते हैं, लेकिन एक ही प्रश्न पूछने वाले सटीक मैच को नहीं मिला। यदि आप देखते हैं कि यह वास्तव में किसी अन्य प्रश्न का डुप्लिकेट है, तो कृपया मुझे यह इंगित करें और मैं स्वयं इस प्रश्न को बंद कर दूंगा (कृपया इसे बंद न करें!)।

उत्तर

38

स्टेटिक विधियां उन चीज़ों के लिए उपयुक्त हैं जिनके पास संबंधित राज्य नहीं है। कुछ कारखाने के तरीके, "पूरी तरह कार्यात्मक" विधियां जैसे Math.sin, और जैसे सभी स्वीकार्य स्थिर तरीके हैं। java.lang.Math और java.util.Collections में पूरी तरह स्वीकार्य स्थिर तरीकों के कई अच्छे उदाहरण हैं।

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

दूसरी ओर, स्थैतिक राज्य, या संबंधित स्थैतिक राज्य के साथ स्थैतिक तरीकों, पूरी तरह से बुराई हैं। एक विरोधी पैटर्न है।

यह अक्सर एक विधि को गैर-राज्यिक (और इसलिए एक वैध स्थैतिक विधि) के रूप में परिभाषित करने में मदद करता है, और केवल तभी, यह हमेशा बराबर इनपुट पर बराबर आउटपुट देता है। इससे यह स्पष्ट हो जाता है कि उदा। डेटाबेस क्वेरीज और फाइल सिस्टम I/O विधियों को स्टेटफ बनाता है, क्योंकि उनके आउटपुट फाइल सिस्टम या डेटाबेस में क्या है इसके आधार पर अलग-अलग होंगे।

+0

तो मैं एक विधि 'सीटी()' कहा जाता है और उस में मैं एक 'Widget.buzz()' विधि है, जो एक डेटाबेस हिट और अपने स्थानीय फाइल सिस्टम में परिवर्तन के सभी प्रकार में आता है करने के लिए एक स्थिर फोन करना है, तो मैं 'widget.buzz()' को कॉल करके लाए गए सभी बड़े बदलावों का आह्वान किए बिना 'fizz() 'का परीक्षण कैसे करूं? मेरा मुद्दा यह है कि, मुझे लगता है कि मुझे स्थैतिक विधि को पूरी तरह से लिखना बंद करना चाहिए, ताकि मैं उस सही 'विजेट' ऑब्जेक्ट (सामान्य बनाम नकली) को इंजेक्ट कर सकूं और फिर रनटाइम पर 'buzz()' आग के "संस्करण" को नियंत्रित कर सकूं। विचार? – IAmYourFaja

+0

'Widget.buzz()' स्थिर स्थिति - डेटाबेस, और स्पष्ट रूप से, संपूर्ण फाइल सिस्टम से जुड़ा हुआ है। वह बुरा है। 'fizz'' विजेट 'तर्क ले सकता है, और आप' fizz' का परीक्षण करने के लिए 'विजेट' का मज़ाक उड़ाएंगे। –

+0

अहह, मैंने डेटाबेस या फाइल सिस्टम को राज्य के रूप में कभी नहीं सोचा था। "सतर्कता" को परिभाषित करने के लिए आप किस मानदंड का उपयोग करते हैं? मुझे लगता है कि यह मेरी गलतफहमी की जड़ है। – IAmYourFaja

2

गैर-मामूली स्थैतिक विधियां निर्भरता इंजेक्शन के साथ संगत नहीं हैं। बस उन्हें सिंगलेट्स के उदाहरण विधियां बनाएं।

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