मेरे कुछ कोड में, मेरे पास इसके समान एक स्थिर कारखाना है:
public class SomeFactory {
// Static class
private SomeFactory() {...}
public static Foo createFoo() {...}
public static Foo createFooerFoo() {...}
}
एक कोड समीक्षा के दौरान, यह प्रस्तावित किया गया था कि यह एक सिंगलटन और इंजेक्शन होना चाहिए। तो, यह इस तरह दिखना चाहिए:
public class SomeFactory {
public SomeFactory() {}
public Foo createFoo() {...}
public Foo createFooerFoo() {...}
}
हाइलाइट करने के लिए कुछ बातें:
- दोनों कारखाने स्टेटलेस हैं।
- विधियों के बीच एकमात्र अंतर उनके स्कोप (उदाहरण बनाम स्थिर) हैं। कार्यान्वयन समान हैं।
- फू एक सेम है जिसमें एक इंटरफ़ेस नहीं है।
स्थिर होने के लिए मेरे पास तर्क थे:
- वर्ग सांविधिक है, इसलिए उसे तत्काल करने की आवश्यकता नहीं है
- ऐसा प्रतीत होता है कि किसी कारखाने को इंस्टेंट करने की तुलना में एक स्थिर विधि को कॉल करने में सक्षम होना स्वाभाविक है
एक एकल के रूप में कारखाने के लिए तर्क थे:
- सब कुछ इंजेक्ट करने के लिए अच्छा है
- कारखाने की निष्क्रियता के बावजूद, परीक्षण इंजेक्शन के साथ आसान है (आसान नकली)
- उपभोक्ता का परीक्षण करते समय इसका मजाक उड़ाया जाना चाहिए
मेरे पास सिंगलटन दृष्टिकोण के साथ कुछ गंभीर मुद्दे हैं क्योंकि यह सुझाव देता है कि कोई भी तरीका कभी भी स्थिर नहीं होना चाहिए। यह सुझाव भी लगता है कि उपयोगिताओं जैसे StringUtils
लिपटे और इंजेक्ट किए जाने चाहिए, जो मूर्खतापूर्ण लगते हैं। अन्त में, इसका तात्पर्य यह है कि मुझे किसी समय कारखाने का मज़ाक उड़ाने की आवश्यकता होगी, जो सही नहीं लगता। मैं सोच भी नहीं सकता कि मुझे कारखाने का मज़ाक कब लगाना पड़ेगा।
समुदाय क्या सोचता है? जबकि मुझे सिंगलटन दृष्टिकोण पसंद नहीं है, मुझे इसके खिलाफ बहुत मजबूत तर्क नहीं लगता है।
DateTime
और File
कक्षाओं में कुख्यात रूप से समान कारणों से परीक्षण करना कठिन है। यदि आपके पास उदाहरण के लिए एक वर्ग है जो निर्माणकर्ता में Created
तारीख निर्धारित करता है DateTime.Now
तो आप इनमें से दो वस्तुओं के साथ एक यूनिट टेस्ट बनाने के बारे में कैसे जाते हैं जो 5 मिनट अलग बनाए गए थे? क्या वर्षों के अलावा? आप वास्तव में ऐसा नहीं कर सकते (बहुत काम के बिना)।
private
कंस्ट्रक्टर और कोई getInstance()
विधि नहीं होनी चाहिए ? क्षमा करें, अमिट नाइट-पिकर!